CSS 和 SVG 實現彩色圖片陰影
在平時開發中,有時候會碰到這樣的彩色陰影,效果如下
是不是非常有質感?下面分別介紹 CSS
和 SVG
兩種實現方式,一起看看吧
一、實現原理
從設計上看,其實原理很簡單,一張原圖和一張模糊的圖,疊加在一起就行了,示意如下
那麼具體如何實現呢?接着往下看
二、CSS 濾鏡
首先,單純的 CSS
並不能直接做出這種效果,畢竟無法生成一份相同的圖片,因此,我們需要手動創建一個相同的圖層。
假設HTML
如下
<div>
<img src="https://bookcover.yuewen.com/qdbimg/349573/1036370336/180.webp">
</div>
爲了節省 dom
,我們可以通過僞元素的方式來生成這個圖片,關鍵代碼如下
.wrap{
position: relative;
/**/
}
.wrap::before{
content:'';
position: absolute;
background: url("https://bookcover.yuewen.com/qdbimg/349573/1036370336/180.webp");
transform: translate(10px,10px);
}
稍微給點偏移,這樣得到了兩層圖片
然後給這個僞元素設置模糊濾鏡就行了
.wrap::before{
/**/
filter: blur(12px);
}
這樣就實現了文章開頭效果
是不是很簡單呢?
不過實際中可以採用 CSS變量
的方式,將需要重複的圖片抽離出來
<div>
<img src="https://bookcover.yuewen.com/qdbimg/349573/1036370336/180.webp">
</div>
然後CSS
就可以保持統一了
.wrap::before{
/**/
background: var(--bg);
}
三、SVG 濾鏡
有沒有發現 上面這種方式需要手動去創建一個一模一樣的圖層有些多餘呢?
確實是這樣,CSS
目前還無法直接複製一個圖層
Firefox 中有個
element()
方法可以根據dom
生成一份完全相同的圖層,但是僅僅 Firefox 支持:https://developer.mozilla.org/en-US/docs/Web/CSS/element
那麼,還有其他方式嗎?
當然也是有了,那就是 SVG
濾鏡!
和前面的思路其實是一致的,先模糊圖層,然後偏移一下,用SVG
實現就是
<svg width="0" height="0">
<filter>
<feGaussianBlur stdDeviation="12" />
<feOffset dx="10" dy="10" />
<feMerge>
<feMergeNode />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
</svg>
似乎有些看不懂?沒關係,我們一步步分析。
首先filter
就濾鏡的意思,表示整個就是定義了一個濾鏡,後面可以給 CSS
直接使用。
接着,feGaussianBlur
就是高斯模糊,stdDeviation
表示模糊的範圍。
然後,feOffset
表示偏移,dx
和dy
分別是水平和垂直方向的位移。
最後是一個feMerge
標籤,這個表示合併,也就是將多個濾鏡組合起來,裏面的feMergeNode
表示每一步濾鏡的結果。這裏有兩個feMergeNode
,第一個就是前面濾鏡的最終結果,也就是**「模糊」**+**「偏移」**後的效果,第二個feMergeNode
有一個in
參數,表示輸入,這裏設置的是SourceGraphic
,表示原始圖像,也就是處理之前的原圖。這裏的疊加順序是後來居上,也就是原圖放在模糊圖之上。
示意效果如下
最後,我們在CSS
中直接通過 id
引入的方式使用這個濾鏡就行了
.wrap{
filter: url("#natural-shadow-filter");
}
效果如下,和 CSS
基本一致
我們還可以多試幾種其他圖片,下面是 CSS
和 SVG
兩種實現的效果對比
你可以查看以下鏈接
-
CSS & SVG color shadow(code.juejin)[1]
-
CSS & SVG color shadow(codepen.io)[2]
四、總結一下
以上就是本文的全部內容了,主要介紹了 CSS
和 SVG
兩種不同的實現方式,下面總結一下
-
彩色陰影其實原理很簡單,一張原圖和一張模糊的圖,疊加在一起就行了
-
CSS
無法直接創建一個完全相同的圖層,需要手動去創建 -
手動去創建一個一模一樣的圖層有些多餘,而
SVG
可以自動生成多份 -
SVG
可以將多個效果通過feMerge
進行疊加,順序是後來居上,SourceGraphic
表示原始圖像 -
CSS
可以通過url(#id)
的方式引入SVG
濾鏡
當然,SVG
的潛力遠不僅如此,在圖像處理方面,SVG
有着無可比擬的優勢,CSS 濾鏡可以稱之爲 “殘血版” 濾鏡,很多效果還是需要SVG
出馬,以後還會介紹更多實用場景。最後,如果覺得還不錯,對你有幫助的話,歡迎點贊、收藏、轉發 ❤❤❤
[1]CSS & SVG color shadow (code.juejin):_ https://code.juejin.cn/pen/7328684301011124260_
[2]CSS & SVG color shadow (codepen.io):_ https://code.juejin.cn/pen/7328684301011124260_
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/td0N6t0Hf0e4Ii836OSzdw