騰訊DeepOcean原創文章:dopro.io/advanced-ef…
前端開發是否對設計師用的 Photoshop 中的圖層混合模式一點辦法都沒有,然後現在我們可以通過 CSS 來實現網頁中的圖片混合了。
一、前言
如果「一圖勝千言」,那多圖混合創造的效果要超過千言萬語。同理,CSS 的混合模式為設計帶來的可能性遠遠超出了你的想象。你所聽到的 CSS 混合模式,就是三個被現代瀏覽器所廣泛支援的 CSS 屬性。這三個屬性包含了:
background-blend-mode
:用於混合元素背景圖案、漸變和顏色mix-blend-mode
:用於元素與元素之間的混合isolation
:使用者阻止某些元素在mix-blend-mode
使用時被混合
不過,本文主要聚焦在 background-blend-mode
這個支援度最好的屬性上,它能給你帶來以往只有 Photoshop 才能做到的引人注目的效果。
二、CSS 漸變和 background-blend-mode 組合
我們使用background
屬性來設定 CSS 漸變,常用的值如 linear-gradient()
, radial-gradient()
, repeating-linear-gradient()
以及 repeating-radial-gradient()
,而且background
屬性還能支援多個漸變引數,通過逗號來分隔。Lea Verou 為我們展示了通過多個漸變屬性創造的印象深刻的排列圖案,如棋盤、磚塊和星星。
但如今有了background-blend-mode
屬性,我們可以創造更多變化多樣的效果。
1. 光譜背景
我們通過覆蓋三層漸變來創造一個近乎全波段光譜的影像,展示再大家面前。
.spectrum-background { background: linear-gradient(red, transparent), linear-gradient(to top left, lime, transparent), linear-gradient(to top right, blue, transparent); background-blend-mode: screen; }
以往實現上面的效果只能通過圖片,而且圖片體積非常的大。而通過 CSS 只需要幾行程式碼即可實現這種效果,更不用說對 HTTP 請求資料量的節省了。
2. 條紋網格背景
同樣的,通過這個屬性我們可以實現出一些有趣的條紋網格背景來:.plaid-background { background: repeating-linear-gradient( -45deg, transparent 0, transparent 25%, dodgerblue 0, dodgerblue 50% ), repeating-linear-gradient( 45deg, transparent 0, transparent 25%, tomato 0, tomato 50% ), repeating-linear-gradient( transparent 0, transparent 25%, gold 0, gold 50% ), white; background-blend-mode: multiply; background-size: 100px 100px; }
3. 圓圈環繞背景
再來試點別的,這次通過徑向漸變來實現圓圈環繞背景:.circles-background { background: radial-gradient( khaki 40px, transparent 0, transparent 100% ), radial-gradient( skyblue 40px, transparent 0, transparent 100% ), radial-gradient( pink 40px, transparent 0, transparent 100% ), snow; background-blend-mode: multiply; background-size: 100px 100px; background-position: 0 0, 33px 33px, -33px -33px; }
4. 更多背景
在 Yoksel 和 Una Kravets 的幫助下,我製作了一個混合模式下的漸變圖案集合,可以讓你快速的在自己的網站裡使用。三、圖片效果和 background-blend-mode 組合
因為 background-image 允許我們在一個元素中新增多個漸變,同理我們也可以設定多張背景圖片在同一元素中。當多張圖片融合了background-blend-mode
和 filter
屬性,圖片的效果更加有趣:
1. 素描效果
我們可以通過 CSS 讓左圖的圖片看起來畫素描一樣。不需要 Photoshop、HTML canvas、WebGL 或者 JavaScript 庫,5 個 CSS 屬性就足夠了。
首先是 HTML 程式碼:
<div class=”pencil-effect”></div>
然後新增兩張 chapel.jpg 圖片:
.pencil-effect { background: url(chapel.jpg), url(chapel.jpg); background-size: cover; }
下圖左一就是我們的第一步的效果:
現在我們為它新增一個混合模式,效果如圖二:
background-blend-mode: difference;
你會發現圖二一片漆黑,difference 這種混合模式會將兩張圖片中每個畫素點之間深色的畫素去掉。假如你依舊疑惑,我們不妨通過 background-position
和 calc()
來實現一些位置上的偏差。
background-position: calc(50% — 1px) calc(50% — 1px), calc(50% + 1px) calc(50% + 1px);
設定好兩張背景圖片的位置偏移後,現在我們可以看到圖片中景物的邊框了,如圖三所示:
最後,通過新增 filter 屬性,我們對圖片進行反相和透明度和明度調整:
filter: brightness(3) invert(1) grayscale(1);
以下是完整的程式碼片段:
.pencil-effect { background: url(photo.jpg), url(photo.jpg); background-size: cover; background-blend-mode: difference; background-position: calc(50% — 1px) calc(50% — 1px), calc(50% + 1px) calc(50% + 1px); filter: brightness(3) invert(1) grayscale(1); }
最終效果如下圖四所示:
2. 黑板效果
基於上面的素描效果,我們通過調整一個 CSS 屬性即可實現上圖二的黑板報效果,把 filter 屬性直接設定為 invert(1)
即可。
3. 夜視效果
接下來通過 CSS 混合模式讓圖片看起來像通過夜視儀觀察到的效果。首先設定好背景圖片和相關樣式(圖一所示):
background: url(moose.jpg); background-size: cover; background-position: center;
現在我們假如漸變和混合模式,這裡加入的是一個具有一定透明度的黑色徑向漸變:
background: url(moose.jpg), radial-gradient( rgba(0,255,0,.8), black ); background-blend-mode: overlay;
還不錯,但可以繼續優化。我有一些辦法可以讓圖片看起來更加可信,通過加入一些掃描線到圖片上並重復平鋪(如圖三):
background: url(moose.jpg), radial-gradient( rgba(0,255,0,.8), black ), repeating-linear-gradient( transparent 0, rgba(0,0,0,.2) 3px, transparent 6px );
.night-vision-effect { background: url(moose.jpg), radial-gradient( rgba(0,255,0,.8), black ), repeating-linear-gradient( transparent 0, rgba(0,0,0,.2) 3px, transparent 6px ); background-blend-mode: overlay; background-size: cover; }
四、瀏覽器相容和優雅降級
好訊息是background-blend-mode
在 Firefox、Chrome 和 Opera 上相容性良好。同時 Safari 中同樣支援上述我們所列舉的所有效果,目前 Safari 不支援的混合模式有: saturation
, hue
, color
以及 luminosity
。而 IE 瀏覽器則全部不支援。
這意味著我們需要考慮不支援混合模式的瀏覽器,通過 CSS 的 @supports 可以讓這件事更加簡單。第一個案例我們可以通過 @supports 檢測混合模式支援度,並在不支援的時候做一個降級:
.spectrum-background { background: gray;
@supports (background-blend-mode: screen) { background: linear-gradient(red, transparent), linear-gradient(to top left, lime, transparent), linear-gradient(to top right, blue, transparent); background-blend-mode: screen; } }
我們也可以檢測多個 CSS 屬性,如下:
.pencil-effect { background-image: url(photo.jpg); background-size: cover;
@supports (background-blend-mode: difference) and (filter: invert(1)) { background-image: url(photo.jpg), url(photo.jpg); background-blend-mode: difference; background-position: calc(50% — 1px) calc(50% — 1px), calc(50% + 1px) calc(50% + 1px); filter: brightness(3) invert(1) grayscale(1); } }
最後我們就可以放心的使用混合模式,給網頁圖片帶來更多想象空間。
本文翻譯自 logrocket :blog.logrocket.com/advanced-ef…