精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

有意思!強大的 SVG 濾鏡

開發(fā) 前端
本文羅列的濾鏡效果更多的是單個效果或者很少幾個組合在一起的效果,實際的使用或者應(yīng)用到應(yīng)用場景下其實會是更多濾鏡的的組合產(chǎn)生出的一個效果。

[[389445]]

想寫一篇關(guān)于 SVG 濾鏡的文章已久,SVG 濾鏡的存在,讓本來就非常強大的 CSS 如虎添翼。讓僅僅使用 CSS/HTML/SVG 創(chuàng)作的效果更上一層樓。題圖為袁川老師使用 SVG 濾鏡實現(xiàn)的云彩效果 -- CodePen Demo -- Cloud (SVG filter + CSS)[1]

什么是 SVG 濾鏡

SVG 濾鏡與 CSS 濾鏡類似,是 SVG 中用于創(chuàng)建復(fù)雜效果的一種機制。很多人看到 SVG 濾鏡復(fù)雜的語法容易心生退意。本文力圖使用最簡潔明了的方式讓大家盡量弄懂 SVG 濾鏡的使用方式。

本文默認讀者已經(jīng)掌握了一定 SVG 的基本概念和用法。

SVG 濾鏡的種類

SVG 濾鏡包括了:

  1. feBlend 
  2. feColorMatrix 
  3. feComponentTransfer 
  4. feComposite 
  5. feConvolveMatrix 
  6. feDiffuseLighting 
  7. feDisplacementMap 
  8. feFlood 
  9. feGaussianBlur 
  10. feImage 
  11. feMerge 
  12. feMorphology 
  13. feOffset 
  14. feSpecularLighting 
  15. feTile 
  16. feTurbulence 
  17. feDistantLight 
  18. fePointLight 
  19. feSpotLight 

看著內(nèi)容很多,有點類似于 CSS 濾鏡中的不同功能:blur()、contrast()、drop-shadow() 。

SVG 濾鏡的語法

我們需要使用 <defs> 和<filter> 標簽來定義一個 SVG 濾鏡。

通常所有的 SVG 濾鏡元素都需要定義在<defs> 標記內(nèi)。

  • 現(xiàn)在,基本上現(xiàn)代瀏覽器,即使不使用<defs> 包裹 <filter>,也能夠定義一個 SVG 濾鏡。

這個<defs> 標記是 definitions 這個單詞的縮寫,可以包含很多種其它標簽,包括各種濾鏡。

其次,使用<filter> 標記用來定義 SVG 濾鏡。<filter> 標簽需要一個 id 屬性,它是這個濾鏡的標志。SVG 圖形使用這個 id 來引用濾鏡。

看一個簡單的 DEMO:

  1. <div class="cssFilter"></div> 
  2. <div class="svgFilter"></div> 
  3.  
  4. <svg> 
  5.     <defs> 
  6.         <filter id="blur"
  7.             <feGaussianBlur in="SourceGraphic" stdDeviation="5" /> 
  8.         </filter> 
  9.     </defs> 
  10. </svg> 
  1. div { 
  2.     width: 100px; 
  3.     height: 100px; 
  4.     background: #000; 
  5. .cssblur { 
  6.     filter: blur(5px); 
  7. .svgFilter{ 
  8.     filter: url(#blur); 

這里,我們在 defs 的 filter 標簽內(nèi),運用了 SVG 的 feGaussianBlur 濾鏡,也就是模糊濾鏡, 該濾鏡有兩個屬性 in 和 stdDeviation。其中 in="SourceGraphic" 屬性指明了模糊效果要應(yīng)用于整個圖片,stdDeviation 屬性定義了模糊的程度。最后,在 CSS 中,使用了 filter: url(#blur) 去調(diào)用 HTML 中定義的 id 為 blur 的濾鏡。

為了方便理解,也使用 CSS 濾鏡 filter: blur(5px) 實現(xiàn)了一個類似的濾鏡,方便比較,結(jié)果圖如下:

CodePen Demo - SVG 濾鏡[2]

嘿,可以看到,使用 SVG 的模糊濾鏡,實現(xiàn)了一個和 CSS 模糊濾鏡一樣的效果。

CSS filter 的 url 模式

上文的例子中使用了 filter: url(#blur) 這種模式引入了一個 SVG 濾鏡效果,url 是 CSS 濾鏡屬性的關(guān)鍵字之一,url 模式是 CSS 濾鏡提供的能力之一,允許我們引入特定的 SVG 過濾器,這極大的增強 CSS 中濾鏡的能力。

相當于所有通過 SVG 實現(xiàn)的濾鏡效果,都可以快速的通過 CSS 濾鏡 URL 模式一鍵引入。

多個濾鏡搭配工作

和 CSS 濾鏡一樣,SVG 濾鏡也是支持多個濾鏡搭配混合使用的。

所以我們經(jīng)常能看到一個<filter> 標簽內(nèi)有大量的代碼。很容易就懵了~

再來看個簡單的例子:

  1. <div></div> 
  2.  
  3. <svg> 
  4.     <defs> 
  5.         <!-- Filter declaration --> 
  6.         <filter id="MyFilter"
  7.  
  8.             <!-- offsetBlur --> 
  9.             <feGaussianBlur in="SourceAlpha" stdDeviation="5" result="blur" /> 
  10.             <feOffset in="blur" dx="10" dy="10" result="offsetBlur" /> 
  11.  
  12.             <!-- merge SourceGraphic + offsetBlur --> 
  13.             <feMerge> 
  14.                 <feMergeNode in="offsetBlur" /> 
  15.                 <feMergeNode in="SourceGraphic" /> 
  16.             </feMerge> 
  17.         </filter> 
  18.     </defs> 
  19. </svg> 
  1. div { 
  2.     width: 200px; 
  3.     height: 200px; 
  4.     background: url(xxx); 
  5.     filter: url(#MyFilter); 

我們先來看看整個濾鏡的最終結(jié)果,結(jié)果長這樣:

CSS 可能一行代碼就能實現(xiàn)的事情,SVG 居然用了這么多代碼。(當然,這里 CSS 也不好實現(xiàn),不是簡單容器的陰影,而是 PNG 圖片圖形的輪廓陰影)

分解步驟

首先看這一段:

  1. <!-- offsetBlur --> 
  2. <feGaussianBlur in="SourceAlpha" stdDeviation="5" result="blur" /> 
  3. <feOffset in="blur" dx="10" dy="10" result="offsetBlur" /> 

首先 <feGaussianBlur in="SourceAlpha" stdDeviation="5" result="blur" /> 這一段,我們上面也講到了,會生成一個模糊效果,這里多了一個新的屬性 result='blur',這個就是 SVG 的一個特性,不同濾鏡作用的效果可以通過 result 產(chǎn)出一個中間結(jié)果(也稱為 primitives 圖元),其他濾鏡可以使用 in 屬性導(dǎo)入不同濾鏡產(chǎn)出的 result,繼續(xù)操作。

緊接著,<feOffset> 濾鏡還是很好理解的,使用 in 拿到了上一步的結(jié)果 result = 'blur',然后做了一個簡單的位移。

這里就有一個非常重要的知識點:在不同濾鏡中利用 result 和 in 屬性,可以實現(xiàn)在前一個基本變換操作上建立另一個操作,比如我們的例子中就是添加模糊后又添加位移效果。

結(jié)合兩個濾鏡,產(chǎn)生的圖形效果,其實是這樣的:

 

實際效果中還出現(xiàn)了原圖,所以這里我們還使用了 <feMerge> 標簽,合并了多個效果。也就是上述這段代碼:

  1. <!-- merge SourceGraphic + offsetBlur --> 
  2. <feMerge> 
  3.     <feMergeNode in="offsetBlur" /> 
  4.     <feMergeNode in="SourceGraphic" /> 
  5. </feMerge> 

feMerge 濾鏡允許同時應(yīng)用濾鏡效果而不是按順序應(yīng)用濾鏡效果。利用 result 存儲別的濾鏡的輸出可以實現(xiàn)這一點,然后在一個 <feMergeNode> 子元素中訪問它。

  • <feMergeNode in="offsetBlur" /> 表示了上述兩個濾鏡的最終輸出結(jié)果 offsetBlur,也就是陰影的部分
  • <feMergeNode in="SourceGraphic" /> 中的 in="SourceGraphic" 關(guān)鍵詞表示圖形元素自身將作為 <filter> 原語的原始輸入

整體再遵循后輸入的層級越高的原則,最終得到上述結(jié)果。示意流程圖如下:

至此,基本就掌握了 SVG 濾鏡的工作原理,及多個濾鏡如何搭配使用。接下來,只需要搞懂不同的濾鏡能產(chǎn)生什么樣的效果,有什么不同的屬性,就能大致對 SVG 濾鏡有個基本的掌握!

關(guān)于 SVG 濾鏡還需要知道的

上面大致過了一下 SVG 濾鏡的使用流程,過程中提到了一些屬性,可能也漏掉了一些屬性的講解,本章節(jié)將補充說明一下。

濾鏡標簽通用屬性

有一些屬性是每一個濾鏡標簽都有,都可以進行設(shè)置的。

in 屬性的 6 個取值

SVG filter 中的 in 屬性,指定濾鏡效果的輸入源,可以是某個濾鏡導(dǎo)出的 result,也可以是下面 6 個值:

  • 后 4 個基本用不上~
  • 后面 4 個不太常用。

更多 SVG 濾鏡介紹講解

上面已經(jīng)提到了幾個濾鏡,我們簡單回顧下:

  • <feGaussianBlur > - 模糊濾鏡
  • <feOffset > - 位移濾鏡
  • <feMerge> - 多濾鏡疊加濾鏡

接下來再介紹一些比較常見,有意思的 SVG 濾鏡。

feBlend 濾鏡

<feBlend> 為混合模式濾鏡,與 CSS 中的混合模式相類似。

在 CSS 中,我們有混合模式 mix-blend-mode 和 background-blend-mode 。我有過非常多篇關(guān)于 CSS 混合模式相關(guān)的一些應(yīng)用。如果你還不太了解 CSS 中的混合模式,可以先看看這幾篇文章:

  • 不可思議的混合模式 mix-blend-mode[3]
  • 不可思議的混合模式 background-blend-mode[4]
  • CSS奇思妙想 -- 使用 background 創(chuàng)造各種美妙的背景[5]

SVG 中的混合模式種類比 CSS 中的要少一些,只有 5 個,其作用與 CSS 混合模式完全一致:

  • normal — 正常
  • multiply — 正片疊底
  • screen — 濾色
  • darken — 變暗
  • lighten— 變亮

簡單一個 Demo,我們有兩張圖,利用不同的混合模式,可以得到不一樣的混合結(jié)果 :

  1. <div></div> 
  2.  
  3. <svg> 
  4.     <defs> 
  5.         <filter id="lighten" x="0" y="0" width="200" height="250"
  6.             <feImage width="200" height="250" xlink:href="image1.jpg" result="img1" /> 
  7.             <feImage width="200" height="250" xlink:href="image2.jpg" result="img2" /> 
  8.             <feBlend mode="lighten" in="img1" in2="img2"/> 
  9.         </filter> 
  10.     </defs> 
  11. </svg> 
  1. .container { 
  2.     width: 200px; 
  3.     height: 250px; 
  4.     filter: url(#lighten); 

這里還用到了一個 <feImage> 濾鏡,它的作用是提供像素數(shù)據(jù)作為輸出,如果外部來源是一個 SVG 圖像,這個圖像將被柵格化。

上述運用了 feBlend 濾鏡中的 mode="lighten" 后的結(jié)果,兩個圖像疊加作用了 lighten 混合模式:

看看全部 5 種混合模式的效果:

CodePen Demo -- SVG Filter feBlend Demo[6]

feColorMatrix

<feColorMatrix> 濾鏡也是 SVG 濾鏡中非常有意思的一個濾鏡,顧名思義,它的名字中包含了矩陣這個單詞,表示該濾鏡基于轉(zhuǎn)換矩陣對顏色進行變換。每一像素的顏色值(一個表示為[紅,綠,藍,透明度] 的矢量) 都經(jīng)過矩陣乘法 (matrix multiplated) 計算出的新顏色。

這個濾鏡稍微有點復(fù)雜,我們一步一步來看。

<feColorMatrix> 濾鏡有 2 個私有屬性 type 和 values,type 它支持 4 種不同的類型:saturate | hueRotate | luminanceToAlpha | matrix,其中部分與 CSS Filter 中的一些濾鏡效果類似。

在這里,我做了一個簡單的關(guān)于 <feColorMatrix> 前 3 個屬性 saturate | hueRotate | luminanceToAlpha 的效果示意 DEMO -- CodePen - feColorMatrix Demo[7],可以感受下它們的具體的效果:

saturate、hueRotate 濾鏡和 CSS 中的 filter 中的 saturate、hue-rotate 的作用是一模一樣的。

feColorMatrix 中的 type=matrix

feColorMatrix 中的 type=matrix 理解起來要稍微更復(fù)雜點,它的 values 需要傳入一個 4x5 的矩陣。

像是這樣:

  1. <filter id="colorMatrix"
  2.   <feColorMatrix type="matrix" values="1 0 0 0 0, 0 1 0 0 0, 0 0 1 0 0, 0 0 0 1 0"/> 
  3. </filter> 

要理解如何運用這些填寫矩陣,就不得不直面另外一個問題 -- 圖像的表示。

數(shù)字圖像的本質(zhì)是一個多維矩陣。在圖像顯示時,我們把圖像的 R 分量放進紅色通道里,B 分量放進藍色通道里,G 分量放進綠色通道里。經(jīng)過一系列處理,顯示在屏幕上的就是我們所看到的彩色圖像了。

而 feColorMatrix 中的 matrix 矩陣,就是用來表示不同通道的值每一個分量的值,最終通過計算得到我們熟知的 rgba() 值。

計算邏輯為:

  1. /* R G B A 1 */  
  2. 1 0 0 0 0 // R = 1*R + 0*G + 0*B + 0*A + 0  
  3. 0 1 0 0 0 // G = 0*R + 1*G + 0*B + 0*A + 0  
  4. 0 0 1 0 0 // B = 0*R + 0*G + 1*B + 0*A + 0  
  5. 0 0 0 1 0 // A = 0*R + 0*G + 0*B + 1*A + 0 

中文的文章,對 feColorMatrix 的 matrix 講解最好的應(yīng)該就是大漠老師的這篇 -- 詳解feColorMatrix[8],對具體的表示法感興趣的可以看看。

僅僅是使用的話,這里還有一個可視化的 DEMO -- CodePen - feColorMatrix Demo[9],幫助大家理解記憶:

到目前為止,大部分 SVG 濾鏡的展示講解都是 CSS 現(xiàn)有能力能夠?qū)崿F(xiàn)的,那 SVG 濾鏡的獨特與魅力到底在哪呢?有什么是 CSS 能力無法做到的么?下面來看看另外幾個有意思的 SVG 濾鏡。

feSpecularLighting/feDiffuseLighting 光照濾鏡

feSpecularLighting 與 feDiffuseLighting 都意為光照濾鏡,使用它們可以照亮一個源圖形,不同的是,feSpecularLighting 為鏡面照明,而 feDiffuseLighting 為散射光照明。

  • feDiffuseLighting:來自外部光源,適合模擬太陽光或者燈光照明
  • feSpecularLighting:指定從反射面反射的二次光

簡單看其中一個 Demo,代碼看著有點多,但是一步一步也很好理解:

  1. <div></div> 
  2. <div class="svg-filter"></div> 
  3. <svg> 
  4.     <defs> 
  5.         <filter id="filter"
  6.             <!--Lighting effect--> 
  7.             <feSpecularLighting in="SourceGraphic" specularExponent="20" specularConstant="0.75" result="spec"
  8.               <fePointLight x="0" y="0" z="200" /> 
  9.             </feSpecularLighting> 
  10.             <!--Composition of inputs--> 
  11.             <feComposite in="SourceGraphic" in2="spec" operator="arithmetic" k1="0" k2="1" k3="1" k4="0" /> 
  12.         </filter> 
  13.     </defs> 
  14. </svg> 
  1. div { 
  2.     background: url(avator.png); 
  3. .svg-filter { 
  4.     filter: url(#filter); 

左邊是原圖,右邊是應(yīng)用了光照濾鏡之后的效果。

CodePen - feSpotLight SVG Light Source[10]

feMorphology 濾鏡

feMorphology 為形態(tài)濾鏡,它的輸入源通常是圖形的 alpha 通道,用來它的兩個操作可以使源圖形腐蝕(變薄)或擴張(加粗)。

使用屬性 operator 確定是要腐蝕效果還是擴張效果。使用屬性 radius 表示效果的程度,可以理解為筆觸的大小。

  • operator:erode 腐蝕模式,dilate 為擴張模式,默認為 erode
  • radius:筆觸的大小,接受一個數(shù)字,表示該模式下的效果程度,默認為 0

我們將這個濾鏡簡單的應(yīng)用到文字上看看效果:

  1. <div class="g-text"
  2.     <p>Normal Text</p> 
  3.     <p class="dilate">Normal Text</p> 
  4.     <p class="erode">Normal Text</p> 
  5. </div> 
  6.  
  7. <svg width="0" height="0"
  8.     <filter id="dilate"
  9.         <feMorphology in="SourceAlpha" result="DILATED" operator="dilate" radius="3"></feMorphology> 
  10.     </filter> 
  11.     <filter id="erode"
  12.         <feMorphology in="SourceAlpha" result="ERODE" operator="erode" radius="1"></feMorphology> 
  13.     </filter> 
  14. </svg> 

  1. p { 
  2.     font-size: 64px; 
  3. .dilate { 
  4.     filter: url(#dilate); 
  5. .erode { 
  6.     filter: url(#erode); 

效果如下:最左邊的是正常文字,中間的是擴張的模式,右邊的是腐蝕模式,看看效果,非常好理解:

當然,我們還可以將其運用在圖片之上,這時,并非是簡單的讓圖像的筆觸變粗或者變細,

  • 對于 erode 模式,會將圖片的每一個像素向更暗更透明的方向變化,
  • 而 dilate 模式,則是將每個向像素周圍附近更亮更不透明的方向變化

簡單看個示例動畫 DEMO,我們有兩張圖,分別作用 operator="erode" 和 operator="dilate",并且動態(tài)的去改變它們的 radius,其中一個的代碼示意如下:

  1. <svg width="450" height="300" viewBox="0 0 450 300"
  2.     <filter id="morphology"
  3.         <feMorphology operator="erode" radius="0"
  4.             <animate attributeName="radius" from="0" to="5" dur="5s" repeatCount="indefinite" /> 
  5.         </feMorphology> 
  6.     </filter> 
  7.  
  8.     <image xlink:href="image.jpg" width="90%" height="90%" x="10" y="10" filter="url(#morphology)"></image> 
  9. </svg> 

上圖左邊是擴張模式,右邊是腐蝕模式:

CodePen Demo -- SVG feMorphology Animation[11]

feTurbulence 濾鏡

turbulence 意為湍流,不穩(wěn)定氣流,而 SVG<feTurbulence> 濾鏡能夠?qū)崿F(xiàn)半透明的煙熏或波狀圖像。通常用于實現(xiàn)一些特殊的紋理。濾鏡利用 Perlin 噪聲函數(shù)創(chuàng)建了一個圖像。噪聲在模擬云霧效果時非常有用,能產(chǎn)生非常復(fù)雜的質(zhì)感,利用它可以實現(xiàn)了人造紋理比如說云紋、大理石紋的合成。

有了 feTurbulence,我們可以自使用 SVG 創(chuàng)建紋理圖形作為置換圖,而不需要借助外部圖形的紋理效果,即可創(chuàng)建復(fù)雜的圖形效果。

這個濾鏡,我個人認為是 SVG 濾鏡中最有意思的一個,因為它允許我們自己去創(chuàng)造出一些紋理,并且疊加在其他效果之上,生成出非常有意思的動效。

feTurbulence 有三個屬性是我們特別需要注意的:type、baseFrequency、numOctaves:

1.type:實現(xiàn)的濾鏡的類型,可選fractalNoise 分形噪聲,或者是 turbulence 湍流噪聲。

  • fractalNoise:分形噪聲更加的平滑,它產(chǎn)生的噪聲質(zhì)感更接近云霧
  • turbulence:湍流噪聲

2.baseFrequency:表示噪聲函數(shù)的基本頻率的參數(shù),頻率越小,產(chǎn)生的圖形越大,頻率越大,產(chǎn)生的噪聲越復(fù)雜其圖形也越小越精細,通常的取值范圍在 0.02 ~ 0.2

3.numOctaves:表示噪聲函數(shù)的精細度,數(shù)值越高,產(chǎn)生的噪聲更詳細。默認值為1

這里有一個非常好的網(wǎng)站,用于示意 feTurbulence 所產(chǎn)生的兩種噪聲的效果:http://apike.ca/ - feTurbulence[12]

兩種噪聲的代碼基本一致,只是 type 類型不同:

同時,baseFrequency 允許我們傳入兩個值,我們可以只改變某一方向上的頻率,具體的你可以戳這個 Demo 看看:CodePen -- feTurbulence baseFrequency & numOctaves[13]

單單一個<feTurbulence> 濾鏡其實是比較難搞懂這濾鏡想干什么的,需要將這個濾鏡作為紋理或者輸入,和其他濾鏡一起搭配使用,實現(xiàn)一些效果,下面我們來看看:

使用 feTurbulence 濾鏡實現(xiàn)文字流動的效果

首先,嘗試將 feTurbulence 所產(chǎn)生的紋理和文字相結(jié)合。

簡單的代碼如下:

  1. <div>Coco</div> 
  2. <div class="turbulence">Coco</div> 
  3.  
  4. <svg> 
  5.     <filter id="fractal" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%"
  6.         <feTurbulence id="turbulence" type="fractalNoise" baseFrequency="0.03" numOctaves="1" /> 
  7.         <feDisplacementMap in="SourceGraphic" scale="50"></feDisplacementMap> 
  8.     </filter> 
  9. </svg> 
  1. .turbulence { 
  2.     filter: url(#fractal); 

左邊是正常的效果,后邊是應(yīng)用了 的效果,你可以試著點進 Demo,更改 baseFrequency 和 numOctaves 參數(shù)的大小,可以看到不同的效果:

CodePen Demo -- feTurbulence text demo[14]

feDisplacementMap 映射置換濾鏡

上面的 Demo 還用到了 feDisplacementMap 濾鏡,也需要簡單的講解下。

feDisplacementMap 為映射置換濾鏡,想要用好這個濾鏡不太容易,需要掌握非常多的關(guān)于 PhotoShop 紋理創(chuàng)建或者是圖形色彩相關(guān)的知識。該濾鏡用來自圖像中從 in2 的輸入值到空間的像素值置換圖像從 in 輸入值到空間的像素值。

說人話就是 feDisplacementMap 實際上是用于改變元素和圖形的像素位置的。該濾鏡通過遍歷原圖形的所有像素點,使用 feDisplacementMap 重新映射到一個新的位置,形成一個新的圖形。

在上述的 feTurbulence 濾鏡與文字的結(jié)合使用中,我們通過 feTurbulence 噪聲得到了噪聲圖形,然后通過 feDisplacementMap 濾鏡根據(jù) feTurbulence 所產(chǎn)生的噪聲圖形進行形變,扭曲,液化,得到最終的效果。

MDN[15] 上有這個濾鏡轉(zhuǎn)化的一個公式(感興趣的可以研究下,我啃不動了):

  1. P'(x,y) ← P( x + scale * (XC(x,y) - 0.5), y + scale * (YC(x,y) - 0.5)) 

使用 feTurbulence 濾鏡實現(xiàn)褶皺紙張的紋理

好,我們繼續(xù) feTurbulence ,使用這個濾鏡,我們可以生成各種不同的紋理,我們可以嘗試使用 feTurbulence 濾鏡搭配光照濾鏡實現(xiàn)褶皺的紙張紋理效果,代碼也非常少:

  1. <div></div> 
  2. <svg> 
  3.     <filter id='roughpaper'
  4.         <feTurbulence type="fractalNoise" baseFrequency='0.04' result='noise' numOctaves="5" /> 
  5.  
  6.         <feDiffuseLighting in='noise' lighting-color='#fff' surfaceScale='2'
  7.             <feDistantLight azimuth='45' elevation='60' /> 
  8.         </feDiffuseLighting> 
  9.     </filter> 
  10. </svg> 
  1. div { 
  2.     width: 650px; 
  3.     height: 500px; 
  4.     filter: url(#roughpaper); 

效果如下:

CodePen Demo -- Rough Paper Texture with SVG Filters[16]

你可以在 Sara Soueidan[17] 的一次關(guān)于 SVG Filter 的分享上,找到制作它的教程:Youtube -- SVG Filters Crash Course[18]

使用 feTurbulence 濾鏡實現(xiàn)按鈕hover效果

使用 feTurbulence 濾鏡搭配 feDisplacementMap 濾鏡,還可以制作一些非常有意思的按鈕效果。

嘗試實現(xiàn)一些故障風(fēng)格的按鈕,其中一個按鈕的代碼如下:

  1. <div class="fe1">Button</div> 
  2. <div class="fe2">Button</div> 
  3.  
  4. <svg> 
  5.     <defs> 
  6.         <filter id="fe1"
  7.             <feTurbulence id="animation" type="fractalNoise" baseFrequency="0.00001 9.9999999" numOctaves="1" result="warp"
  8.                 <animate attributeName="baseFrequency" from="0.00001 9.9999" to="0.00001 0.001" dur="2s" repeatCount="indefinite"/> 
  9.             </feTurbulence> 
  10.             <feOffset dx="-90" dy="-90" result="warpOffset"></feOffset> 
  11.             <feDisplacementMap xChannelSelector="R" yChannelSelector="G" scale="30" in="SourceGraphic" in2="warpOffset"></feDisplacementMap> 
  12.         </filter> 
  13.     </defs> 
  14. </svg> 
  1. .fe1 { 
  2.     width: 200px; 
  3.     height: 64px; 
  4.     outline: 200px solid transparent; 
  5.  
  6. .fe1:hover { 
  7.     filter: url(#fe1); 

通過 hover 按鈕的時候,給按鈕添加濾鏡效果,并且濾鏡本身帶有一個無限循環(huán)的動畫:

完整的代碼你可以戳這里:CodePen Demo - SVG Filter Button Effects[19]

使用 feTurbulence 濾鏡實現(xiàn)云彩效果

最后,我們回到題圖上的云彩效果,使用 feTurbulence 濾鏡,我們可以非常逼真的使用 SVG 模擬出真實的云彩效果。

首先,通過隨機生成的多重 box-shadow,實現(xiàn)這一一個圖形:

  1. <div></div> 
  1. div { 
  2.     width: 1px; 
  3.     height: 1px; 
  4.     box-shadow: rgb(240 255 243) 80vw 11vh 34vmin 16vmin, rgb(17 203 215) 33vw 71vh 23vmin 1vmin, rgb(250 70 89) 4vw 85vh 21vmin 9vmin, rgb(198 241 231) 8vw 4vh 22vmin 12vmin, rgb(198 241 231) 89vw 11vh 31vmin 19vmin, rgb(240 255 243) 5vw 22vh 38vmin 19vmin, rgb(250 70 89) 97vw 35vh 33vmin 16vmin, rgb(250 70 89) 51vw 8vh 35vmin 14vmin, rgb(17 203 215) 75vw 57vh 40vmin 4vmin, rgb(250 70 89) 28vw 18vh 31vmin 11vmin, rgb(250 70 89) 8vw 89vh 31vmin 2vmin, rgb(17 203 215) 13vw 8vh 26vmin 19vmin, rgb(240 255 243) 98vw 12vh 35vmin 5vmin, rgb(17 203 215) 35vw 29vh 27vmin 18vmin, rgb(17 203 215) 67vw 58vh 22vmin 15vmin, rgb(198 241 231) 67vw 24vh 25vmin 7vmin, rgb(17 203 215) 76vw 52vh 22vmin 7vmin, rgb(250 70 89) 46vw 86vh 26vmin 20vmin, rgb(240 255 243) 50vw 20vh 25vmin 1vmin, rgb(250 70 89) 74vw 14vh 25vmin 16vmin, rgb(240 255 243) 31vw 100vh 29vmin 20vmin 

這個工作,你可以交給 SASS、LESS 或者 JavaScript 這些能夠有循環(huán)函數(shù)能力的語言去生成,它的效果大概是這樣:

緊接著,通過 feTurbulence 產(chǎn)生分形噪聲圖形,使用 feDisplacementMap 進行映射置換,最后給圖形疊加上這個濾鏡效果。

  1. <svg width="0"
  2.   <filter id="filter"
  3.     <feTurbulence type="fractalNoise" baseFrequency=".01" numOctaves="10" /> 
  4.     <feDisplacementMap in="SourceGraphic" scale="240" /> 
  5.   </filter> 
  6. </svg> 
  1. div { 
  2.     filter: url(#filter); 

即可得到這樣的云彩效果:

完整的代碼,你可以戳這里到袁川老師的 CodePen 觀看:Cloud (SVG filter + CSS)[20]

總結(jié)一下

關(guān)于 SVG 濾鏡入門的第一篇總算差不多了,本文簡單的介紹了一下 SVG 濾鏡的使用方式以及一些常見的 SVG 濾鏡并給出了最簡單的一些使用效果,希望大家看完能對 SVG 濾鏡有一個簡單的認識。

本文羅列的濾鏡效果更多的是單個效果或者很少幾個組合在一起的效果,實際的使用或者應(yīng)用到應(yīng)用場景下其實會是更多濾鏡的的組合產(chǎn)生出的一個效果。

后面的文章將會更加細致的去探討分析多個 SVG 濾鏡組合效果,探討更復(fù)雜的排列組合。

文章的題目叫SVG 濾鏡從入門到放棄因為 SVG 濾鏡學(xué)起來確實太繁瑣太累了,它不像 CSS 濾鏡或者混合模式那么容易上手那么簡單。當然也由于 SVG 濾鏡的功能非常強大,定制化能力強以及它已經(jīng)存在了非常之久有關(guān)。SVG 濾鏡的兼容性也很好,它們其實是早于 CSS3 一些特殊效果之前就已經(jīng)存在的。

CSS 其實一直在向 SVG 的一些特殊能力靠攏,用更簡單的語法讓人更易上手,不過 SVG 濾鏡還是有其獨特的魅力所在。后續(xù)將會有更多關(guān)于 SVG 濾鏡的文章。也希望讀到這里的同學(xué)不要放棄!

參考資料

  • 詳解feColorMatrix[21]
  • 深入理解SVG feDisplacementMap濾鏡及實際應(yīng)用[22]
  • SVG tutorialspoint[23]
  • apike.ca - SVG Filter[24]
  • FILTER EFFECTS[25]
  • Youtube - SVG Filter Effects | feTurbulence[26]
  • Youtube - SVG Filters Crash Course[27]
  • DistortedButtonEffects[28]

 

參考資料

 

參考資料
[1]CodePen Demo -- Cloud (SVG filter + CSS): https://codepen.io/yuanchuan/pen/mGWrJp

[2]CodePen Demo - SVG 濾鏡: https://codepen.io/Chokcoco/pen/poNqVzb

[3]不可思議的混合模式 mix-blend-mode: https://github.com/chokcoco/iCSS/issues/16

[4]不可思議的混合模式 background-blend-mode: https://github.com/chokcoco/iCSS/issues/31

[5]CSS奇思妙想 -- 使用 background 創(chuàng)造各種美妙的背景: https://github.com/chokcoco/iCSS/issues/84

[6]CodePen Demo -- SVG Filter feBlend Demo: https://codepen.io/Chokcoco/pen/XWNLXZJ

[7]CodePen - feColorMatrix Demo: https://codepen.io/Chokcoco/pen/BaQXPOK

[8]詳解feColorMatrix: https://www.w3cplus.com/svg/finessing-fecolormatrix.html

[9]CodePen - feColorMatrix Demo: https://codepen.io/Chokcoco/pen/abBeaBr

[10]CodePen - feSpotLight SVG Light Source: https://codepen.io/Chokcoco/pen/WNoVmyo

[11]CodePen Demo -- SVG feMorphology Animation: https://codepen.io/Chokcoco/pen/GRrKqPR

[12]http://apike.ca/ - feTurbulence: http://apike.ca/prog_svg_filter_feTurbulence.html

[13]CodePen -- feTurbulence baseFrequency & numOctaves: https://codepen.io/Chokcoco/pen/wvgwjEr

[14]CodePen Demo -- feTurbulence text demo: https://codepen.io/Chokcoco/pen/dyNbedP

[15]MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feDisplacementMap

[16]CodePen Demo -- Rough Paper Texture with SVG Filters: https://codepen.io/Chokcoco/pen/OJWLXPY

[17]Sara Soueidan: https://www.sarasoueidan.com/

[18]Youtube -- SVG Filters Crash Course: https://www.youtube.com/watch?v=n7y0y_8zTo4

[19]CodePen Demo - SVG Filter Button Effects: https://codepen.io/Chokcoco/pen/BapypJb

[20]Cloud (SVG filter + CSS): https://codepen.io/yuanchuan/pen/mGWrJp

[21]詳解feColorMatrix: https://www.w3cplus.com/svg/finessing-fecolormatrix.html

[22]深入理解SVG feDisplacementMap濾鏡及實際應(yīng)用: https://www.zhangxinxu.com/wordpress/2017/12/understand-svg-fedisplacementmap-filter/

[23]SVG tutorialspoint: https://www.tutorialspoint.com/svg/svg_filters.htm

[24]apike.ca - SVG Filter: http://apike.ca/

[25]FILTER EFFECTS: https://svgwrite.readthedocs.io/en/latest/classes/filters.html

[26]Youtube - SVG Filter Effects | feTurbulence: https://www.youtube.com/watch?v=sCE-n5k0-1g

[27]Youtube - SVG Filters Crash Course: https://www.youtube.com/watch?v=n7y0y_8zTo4

[28]DistortedButtonEffects: https://github.com/codrops/DistortedButtonEffects/

[29]Github -- iCSS: https://github.com/chokcoco/iCSS

 

 

責(zé)任編輯:姜華 來源: iCSS前端趣聞
相關(guān)推薦

2022-06-15 07:21:47

鼠標指針交互效果CSS

2022-08-15 22:34:47

Overflow方向裁切

2022-07-11 13:09:26

mmapLinux

2018-06-24 16:39:28

Tomcat異常線程

2020-12-12 13:50:16

云開發(fā)

2021-01-27 13:54:05

開發(fā)云原生工具

2017-08-01 00:52:07

kafka大數(shù)據(jù)消息總線

2012-06-19 16:49:19

Web開發(fā)

2013-08-28 09:46:09

Debian LinuLinux發(fā)行版

2015-10-28 13:57:29

融合架構(gòu)華三UIS

2012-05-22 10:12:59

jQuery

2010-04-09 11:24:59

Oracle 排序

2021-11-17 10:45:58

Chrome 95新特性前端

2015-09-17 17:49:13

華三/UIS

2021-04-09 08:23:30

Css前端加載動畫

2022-08-23 08:01:09

CSS前端

2021-02-20 16:01:26

Github前端開發(fā)

2023-05-15 09:16:18

CSSCSS Mask

2012-04-12 15:14:31

idf2012英特爾

2021-04-23 07:51:56

CSS Container Q Chrome
點贊
收藏

51CTO技術(shù)棧公眾號

午夜久久久久久电影| 久久亚洲综合| 精品日韩99亚洲| 男人靠女人免费视频网站| 黄频在线免费观看| 国精品一区二区| 亚洲国产免费av| 日本激情视频在线播放| 超级碰碰不卡在线视频| www国产成人| 成人综合网网址| 成人午夜淫片100集| 五月开心六月丁香综合色啪 | 一区二区欧美激情| 中文字幕avav| 经典三级一区二区| 一区二区三区在线观看欧美| 日本福利一区二区三区| 成人av无码一区二区三区| 日韩vs国产vs欧美| 68精品久久久久久欧美| www.99re7| 国产99亚洲| 欧美r级在线观看| 日韩av.com| 久久天堂av| 欧美日韩亚洲系列| 青草视频在线观看视频| 欧美jizzhd欧美| 久久久另类综合| 国产一区免费视频| www.亚洲天堂.com| 久久99久久99小草精品免视看| 97国产一区二区精品久久呦 | 欧美色图在线视频| 国产 欧美 日韩 一区| 国产剧情在线| 中文字幕一区二区三中文字幕| 久久久久久久久久久久久久一区| av中文字幕第一页| 韩国av一区二区三区在线观看| 国产精品久久久久久久电影| 国内免费精品视频| 韩日视频一区| 欧美劲爆第一页| 欧美黄色免费在线观看| 久久久久久久久久久9不雅视频| 尤物九九久久国产精品的特点 | 国产精品二区一区二区aⅴ污介绍| 蜜桃av色综合| 青春有你2免费观看完整版在线播放高清 | 天天色综合久久| 国产a视频精品免费观看| 亚洲一区制服诱惑| www.成人精品| 成人免费精品视频| 国内精品久久国产| 午夜视频在线播放| 久久网站热最新地址| 欧美日韩国产精品一区二区| 国内精品在线视频| 中文字幕精品—区二区四季| 亚洲国产另类久久久精品极度| 福利成人在线观看| 国产精品乱人伦中文| 一区二区三区在线视频111| 欧美三级理伦电影| 一区二区三区中文字幕电影 | 欧美88888| 中文字幕一区二区三区人妻在线视频| 日韩欧美另类一区二区| 欧美性高跟鞋xxxxhd| 日韩精品一区中文字幕| 在线成人视屏| 5858s免费视频成人| 亚洲制服在线观看| 99精品在免费线中文字幕网站一区| 亚洲的天堂在线中文字幕| 野花社区视频在线观看| 菠萝蜜一区二区| 久久91亚洲精品中文字幕奶水| 久久精品99久久久久久| 亚洲欧美久久久| 国产精品一香蕉国产线看观看| 国产人妻精品一区二区三| 成人免费毛片a| 色爱区成人综合网| 神马午夜伦理不卡| 日韩欧美aaa| 污污视频网站在线| 欧美交a欧美精品喷水| 正在播放亚洲1区| 久久亚洲精品大全| 久久婷婷一区| 亚洲综合一区二区不卡| 欧美捆绑视频| 亚洲欧美一区二区三区国产精品| 免费国产黄色网址| 涩涩涩久久久成人精品| 亚洲黄色免费三级| 大地资源高清在线视频观看| 在线视频精品| 成人性生交xxxxx网站| 五月婷婷丁香网| 亚洲精品高清视频在线观看| 国产亚洲天堂网| 欧美日韩午夜电影网| 亚洲免费视频观看| 国产一级一级片| 久久99精品国产.久久久久| 精品国产一区二区三区免费| 哥也色在线视频| 在线国产电影不卡| 欧美夫妇交换xxx| 欧美一区国产在线| 国产女人18毛片水18精品| 日韩中文字幕免费观看| 综合久久一区二区三区| 色综合中文字幕国产| 中文字幕中文字幕一区三区| 国产免费拔擦拔擦8x在线播放| 91精品蜜臀在线一区尤物| 国产黄色大片免费看| 国产精品一国产精品k频道56| 亚洲一区二区在线| se在线电影| 日本高清不卡aⅴ免费网站| 国产女主播在线播放| 91精品天堂福利在线观看| 国产精品久久久久久五月尺| 亚洲人成色777777精品音频| 午夜视频一区二区三区| 国产成人精品综合久久久久99| 四虎成人精品永久免费av九九| 日韩av不卡电影| 日韩福利一区二区| 五月激情综合网| 人妻av一区二区| 影音先锋久久精品| 岛国视频一区| 蜜桃成人365av| 日韩精品影音先锋| 欧美国产日韩综合| 国产99一区视频免费| 欧美日韩dvd| 色妞ww精品视频7777| 久久精品视频导航| av在线免费在线观看| 亚洲精品国产品国语在线app| 欧美高清精品一区二区| 女人色偷偷aa久久天堂| 亚洲综合精品一区二区| 五月花成人网| 亚洲第一福利网| 久久亚洲天堂网| 久久亚洲综合av| 尤蜜粉嫩av国产一区二区三区| 国产乱码精品一区二区亚洲| 国产成人极品视频| 97人人在线| 91麻豆精品国产91久久久久久久久| 女性裸体视频网站| 国产精品18久久久久久久久久久久| 裸体裸乳免费看| 97人人澡人人爽91综合色| 久久久久久久久久国产| 欧美日韩视频精品二区| 欧美主播一区二区三区美女| 51精品免费网站| 国产成人精品免费| 激情深爱综合网| 999福利视频| 91av精品| 国产一区二区三区无遮挡 | 丰满少妇xbxb毛片日本| 99精品福利视频| 日韩欧美视频第二区| 伊人久久综合网另类网站| 久久久久久久久亚洲| 牛牛影视精品影视| 91精品黄色片免费大全| 国产香蕉在线视频| 国产精品视频一二三| 亚洲男人天堂2021| 国产精品试看| 综合一区中文字幕| 猫咪成人在线观看| 国产日韩欧美综合| 爱啪啪综合导航| 最新中文字幕亚洲| 欧美综合视频在线| 欧美丝袜自拍制服另类| 精品午夜福利视频| 国产人伦精品一区二区| 国产裸体视频网站| 日韩黄色一级片| 六月婷婷激情综合| 久久av电影| 都市激情久久久久久久久久久| 日韩精品99| 久久久久久国产免费 | 久久久久久久999精品视频| 黄色软件在线观看| 欧美精品一区二区在线观看| 在线免费观看中文字幕| 天天影视涩香欲综合网 | 福利一区福利二区微拍刺激| 操她视频在线观看| 久久久精品黄色| 久久免费精品国产| 国产一区二区三区免费播放| 男人天堂成人在线| 99成人免费视频| 无码人妻aⅴ一区二区三区日本| 国产精品美女久久久久久不卡| av在线不卡观看| 亚洲男人在线| 国产精品看片资源| 综合毛片免费视频| 91国内精品久久| 成年人国产在线观看| 欧美成人免费观看| 国产黄色在线网站| 久久精品美女视频网站| jizz日韩| 6080成人| 国产91在线播放九色快色| 女囚岛在线观看| 久久国产天堂福利天堂| 免费a级毛片在线播放| 最近2019中文字幕在线高清| 韩国精品视频| 亚洲日韩中文字幕在线播放| av女名字大全列表| 亚洲精品99999| 婷婷色在线视频| 亚洲国产私拍精品国模在线观看| 亚洲产国偷v产偷v自拍涩爱| 欧美一区二区三区四区高清| 一级特黄aa大片| 欧美片网站yy| 国产精品伦一区二区三区| 欧美日韩大陆一区二区| 亚洲一区二区激情| 欧美日韩一级二级| 夜夜躁很很躁日日躁麻豆| 欧美日韩美女一区二区| 91国内精品视频| 欧美一区二区三区免费在线看| 国产又黄又粗又猛又爽| 欧美一级欧美三级在线观看| 国产黄色片免费| 欧美va亚洲va香蕉在线| 亚洲奶汁xxxx哺乳期| 精品福利一二区| 神马午夜在线观看| 亚洲美女福利视频网站| 岛国视频免费在线观看| 色偷偷888欧美精品久久久| 黄色网在线免费看| 欧美精品精品精品精品免费| 大香伊人久久| 奇米成人av国产一区二区三区| 69堂精品视频在线播放| 91精品在线影院| swag国产精品一区二区| 裸体丰满少妇做受久久99精品| 国产一区二区三区四区大秀| 午夜精品区一区二区三 | 人妻夜夜添夜夜无码av| 在线视频精品| 一区二区在线免费看| 国产999精品久久| 麻豆国产精品一区| 国产欧美日韩三级| 久久久精品人妻一区二区三区四 | 久久不射热爱视频精品| 91桃色在线| 国产精品久久网| 97视频一区| 色狠狠久久av五月综合|| 91精品国产视频| 91av资源网| 激情五月婷婷综合| 免费a在线观看播放| 一区二区亚洲视频| 欧美一卡在线观看| 亚洲精品一级片| 国产亚洲欧美视频| 色帝国亚洲欧美在线| 日本aⅴ大伊香蕉精品视频| 91麻豆精品国产91久久久更新资源速度超快| 444亚洲人体| 国产欧美日韩| www.亚洲视频.com| 美女视频黄免费的久久 | 自拍亚洲一区| 天堂av在线中文| 日韩**一区毛片| 欧美在线一级片| 伊人夜夜躁av伊人久久| 真实新婚偷拍xxxxx| 亚洲电影第1页| 国产精品刘玥久久一区| 日韩美女视频在线观看| 9l视频自拍九色9l视频成人| 日韩欧美一区二区视频在线播放| 一区免费在线| 777一区二区| 国产农村妇女精品| 亚欧视频在线观看| 欧美成人免费网站| 老司机午夜在线| 国产精品69av| 亚洲午夜久久| 青青草国产精品视频| 国产精品中文字幕欧美| 最新日韩免费视频| 色吊一区二区三区| 香蕉国产在线视频| 国外成人在线视频| 午夜视频在线观看精品中文| 一区二区视频在线免费| 久久一区二区三区超碰国产精品| 中文字幕人妻一区| 亚洲精品少妇30p| av一区二区三| 久久亚洲精品视频| 自拍偷拍亚洲| 在线不卡视频一区二区| 秋霞电影一区二区| 伊人影院综合网| 欧美色倩网站大全免费| 国产玉足榨精视频在线观看| 欧美一级电影免费在线观看| 全国精品免费看| 欧美性久久久久| xf在线a精品一区二区视频网站| 在线观看亚洲欧美| 精品偷拍各种wc美女嘘嘘| 日本黄色免费在线| 久久青青草原| 久久久久久网| 国产熟女一区二区| 欧美色综合影院| 日韩av中文| 亚洲影影院av| 亚洲小说欧美另类社区| 一级黄色电影片| 午夜一区二区三区在线观看| 色噜噜在线播放| 清纯唯美亚洲综合| heyzo久久| 欧美日韩成人激情| 青青草在线视频免费观看| 国产ts一区二区| 天堂av资源在线观看| 91色视频在线导航| 围产精品久久久久久久| 在线免费黄色小视频| 亚洲色图一区二区三区| va视频在线观看| 久久久久九九九九| 群体交乱之放荡娇妻一区二区 | 日韩一级网站| 欧美狂猛xxxxx乱大交3| 亚洲三级电影在线观看| www.com日本| 日韩欧美在线国产| www日韩tube| 亚洲一区久久久| 一本色道久久综合一区| 免费看污片网站| 欧美一区二区三区免费视频| 川上优av中文字幕一区二区| 欧美福利电影在线观看| 黄色一级大片免费| 成人黄色网址在线观看| 中日韩黄色大片| 中文字幕日本欧美| 欧美经典影片视频网站| 国产免费黄色av| 国产精品久久看| 日本精品一区二区在线观看| 日韩av男人的天堂| 一本精品一区二区三区| 亚洲蜜桃精久久久久久久久久久久| 欧美午夜在线一二页| 久久青青色综合| 日韩av电影免费在线观看| 国产精品综合一区二区| 亚洲免费在线视频观看| 超碰91人人草人人干| 亚洲女娇小黑人粗硬| 无套内谢丰满少妇中文字幕| 岛国av一区二区| 成人在线网址| 奇米视频888战线精品播放| 国产成人啪免费观看软件| 91丨九色丨海角社区|