深入理解CSS background-blend-mode的作用機制

本文歡迎分享與聚合,全文轉(zhuǎn)載就不必了,尊重版權(quán),圈子就這么大,若急用可以聯(lián)系授權(quán)。
一、可能都知道的
首先,講兩點大家可能都知道的知識點:
1.background-blend-mode
本身就帶有隔離特性,也就是一個元素應用 background-blend-mode
背景混合模式,最終的效果只會受當前元素的背景圖像和背景顏色影響,不會受視覺上處于當前區(qū)域其他任意元素影響。
2.應用 background-blend-mode
屬性后,不僅各個圖像之間要進行混合,同時還要和背景色進行混合。
接下來,講下大家可能并不知道的知識點,這也是很多人搞不清楚為什么 background-blend-mode
屬性這么渲染的原因。
二、可能不知道的
1. 背景順序影響混合效果
混合效果和 background
屬性中背景圖像的順序密切相關(guān)。在CSS多背景中,越是語法中靠后的背景圖像的層級越是低,這也是為何 background-color
要寫在最后語法才合法的原因,因為背景色的層級永遠是最低的。
例如下面2個元素:
<div class="ball"></div> <div class="ball2"></div>
設置背景混合模式為疊加,但是兩個元素的背景圖像的順序是相反的,代碼如下所示:
.ball { width: 200px; height: 200px; border-radius: 50%; background: linear-gradient(deeppink, deeppink), linear-gradient(deepskyblue, deepskyblue); /* 應用疊加混合模式 */ background-blend-mode: overlay; } .ball2 { width: 200px; height: 200px; border-radius: 50%; background: linear-gradient(deepskyblue, deepskyblue), linear-gradient(deeppink, deeppink); /* 應用疊加混合模式 */ background-blend-mode: overlay; }
結(jié)果下圖所示, .ball
元素表現(xiàn)為 deeppink
疊加后面的 deepskyblue
,最終混合顏色偏藍; .ball2
元素表現(xiàn)為 deepskyblue
疊加后面的 deeppink
,最終混合顏色偏紫。
2. 混合效果是多個混合屬性同時作用的結(jié)果
很多開發(fā)人員并不清楚, background-blend-mode
支持其實是可以設置多個混合模式值,分別對應不同的背景圖像,這一點和僅僅支持一個混合模式值的 mix-blend-mode
屬性是不一樣的。例如:
.ball { background: linear-gradient(deeppink, deeppink), linear-gradient(deepskyblue, deepskyblue); background-blend-mode: overlay; }
實際上等同于:
.ball { background: linear-gradient(deeppink, deeppink), linear-gradient(deepskyblue, deepskyblue); background-blend-mode: overlay overlay; }
也就是, deeppink
實際上疊加的是deepskyblue和背景色(此例是透明), deepskyblue
疊加的是背景色(此例是透明)。
換言之,實際上,每個背景圖像都有一個自己的混合模式值,這是和 mix-blend-mode
屬性有著巨大區(qū)別的!通常,在使用 mix-blend-mode
屬性的場景中,我們只會把混合模式設置在頂層元素上,而不會每一層元素都設置,于是帶來了一個由此及彼的嚴重的思維誤區(qū),以為背景混合模式設置的值也是作用在對頂層的背景圖像上的,從而導致很多開發(fā)者想不通 background-blend-mode
屬性的渲染表現(xiàn)和自己預期的不一樣。
我們通過一個案例演示下 background-blend-mode
屬性的多個值是如何和背景圖像一一對應的。
<div class="box"></div>
.box { width: 200px; height: 200px; background: linear-gradient(to right bottom, deeppink 50%, transparent 50%), linear-gradient(to top right, deeppink 50%, transparent 50%), darkblue; background-blend-mode: multiply, screen; position: relative; } /* 中間原始的deeppink色值 */ .box::before { content: ''; position: absolute; width: 33%; height: 33%; inset: 0; margin: auto; background-color: deeppink; }
此時 .box
元素總共呈現(xiàn)出了5種顏色,每種顏色的RGB色值和如何產(chǎn)生的如下圖所示。
其中:
中間標注了序號①的正方形區(qū)域沒有應用任何混合模式,顏色就是 deeppink
,作用是方便大家和區(qū)域③、區(qū)域⑤處的顏色進行對比。
- 區(qū)域②就是背景色
darkblue
,因為兩個斜向漸變均沒有覆蓋到這個區(qū)域,直接暴露了設置的背景色。 - 區(qū)域③和區(qū)域⑤是下層漸變,也就是
background
屬性值中位置靠后的漸變,對應的混合模式也是background-blend-mode
屬性值靠后的那個,也就是screen
,濾色模式,可以讓顏色變亮。 - 區(qū)域④和區(qū)域⑤是上層漸變,也就是
background
屬性值中位置靠前的漸變,對應的混合模式也是background-blend-mode
屬性值靠前的那個,也就是multiply
,正片疊底模式,可以讓顏色變暗。 - 區(qū)域③的顏色表現(xiàn)源自漸變色
deeppink
和背景色darkblue
進行濾色混合的效果,可以看出最終呈現(xiàn)的顏色比deeppink
更亮了,最終混合后的色值是rgb(255,20,206)
。 - 區(qū)域④的顏色表現(xiàn)源自漸變色
deeppink
和背景色darkblue
進行正片疊底混合的效果,可以看出最終呈現(xiàn)的顏色比darkblue
更深了,最終混合后的色值是rgb(0,0,80)
。 - 區(qū)域⑤最復雜,理解了這個,也就理解了大多數(shù)的
background-blend-mode
屬性的渲染表現(xiàn)了。 - 區(qū)域⑤總共有3層,分別是:上層的
deeppink
,混合模式是multiply
;下層的deeppink
,混合模式是screen
;底層的背景色darkblue
。
于是,最終的色值表現(xiàn)是上層的 deeppink
使用 multiply
混合下層的 deeppink
和背景色 darkblue
使用 screen
混合后的色值。
由于下層的 deeppink
和背景色 darkblue
使用 screen
混合后的色值就是區(qū)域③的顏色。因此,區(qū)域⑤的顏色就是 deeppink
和區(qū)域③的色值 rgb(255,20,206)
進行正片疊底混合后的色值,結(jié)果是 rgb(255,1,119)
。
以上就是 .box
元素5個顏色各自呈現(xiàn)的原理所在。
三、background-blend-mode與漸變圖標的實現(xiàn)
最后再看看看,為何大多數(shù)人沒辦法使用 background-blend-mode
實現(xiàn)漸變圖標的效果。
例如,現(xiàn)在有1個顏色很深的刪除小圖標,理論上,我們可以使用 lighten
混合模式實現(xiàn)漸變效果,因為 lighten
的效果是哪個顏色淺使用哪個顏色,由于圖標本身顏色很深,因此,一定會顯示漸變色,只要給圖標加一個白色底就可以,于是,按照這個思路,很多人就寫了如下所示的CSS代碼:
.icon-delete { background: linear-gradient(deepskyblue, deeppink), url(delete.png), white; background-blend-mode: lighten; }
乍一看,似乎邏輯上無懈可擊,漸變和白底黑色的圖標進行變亮混合,怎么想黑色圖標也應該變成漸變色啊,很遺憾,最終的漸變并不是漸變色,而是純白色,為什么會有這樣的結(jié)果呢?
那是因為這里的 background-blend-mode:lighten
實際上是一個縮寫,或者簡寫,實際上真實的計算值是 lighten lighten
,代碼如下所示:
.icon-delete { background: linear-gradient(deepskyblue, deeppink), url(delete.png), white; /* 實際上的計算值 */ background-blend-mode: lighten lighten; }
也就是刪除圖標 delete.png
也應用了混合模式 lighten
,和白色背景色進行了混合,于是變成了純白色。
知道了問題所在,也就知道了該如何解決了,很簡單,讓 delete.png
和白色背景色混合后還保持原始圖標的模樣即可,下面兩種CSS方法均可以:
.icon-delete { background: linear-gradient(deepskyblue, deeppink), url(delete.png), white; /* PNG圖標的混合模式單獨設成darken */ background-blend-mode: lighten darken; }
或者是:
.icon-delete { background: linear-gradient(deepskyblue, deeppink), url(delete.png), white; /* PNG圖標的混合模式單獨設成normal */ background-blend-mode: lighten normal; }
推薦使用 normal
關(guān)鍵字,因為更巧妙,性能也更好一點。最終實現(xiàn)的效果如下圖所示。
當然,漸變圖標效果最好的實現(xiàn)方法肯定是 CSS mask
遮罩屬性 ,這里的使用混合模式實現(xiàn)的漸變圖標會有白色的底,并不是完美的實現(xiàn)方法,主要目的還是讓大家了解 background-blend-mode
屬性的渲染細節(jié)。
四、background-blend-mode的補全規(guī)則
當 background-blend-mode
的屬性值的數(shù)量和 background-image
不匹配的時候,遵循下面的應用規(guī)則:
如果 background-blend-mode
的值的數(shù)量大于 background-image
,則多出來的混合模式會被忽略,例如:
.example { background: linear-gradient(deepskyblue, deeppink), white; background-blend-mode: lighten, darken; }
等同于:
.example { background: linear-gradient(deepskyblue, deeppink), white; background-blend-mode: lighten; }
如果 background-blend-mode
的值的數(shù)量少于 background-image
,則會重復完整的 background-blend-mode
屬性值進行補全,例如:
.example { background: linear-gradient(deepskyblue, deeppink), linear-gradient(deepskyblue, deeppink), linear-gradient(deepskyblue, deeppink), white; background-blend-mode: lighten, darken; }
等同于:
.example { background: linear-gradient(deepskyblue, deeppink), linear-gradient(deepskyblue, deeppink), linear-gradient(deepskyblue, deeppink), white; background-blend-mode: lighten, darken, lighten; }
也就是 lighten, darken
一起進行重復,而不是僅僅重復最后一個混合模式值。因此,補全的值的 lighten
。
五、結(jié)語
CSS background-blend-mode
屬性可以讓各個背景圖像之間應用混合模式。
background-blend-mode
屬性的使用頻率要明顯低于 mix-blend-mode
屬性。
原因在于:
1.真實世界的照片圖像很少作為 background-image
背景圖像呈現(xiàn),因為不利于無障礙訪問,而混合模式設計的初衷就是這類照片圖像的處理;
2.background-blend-mode
屬性作用機制不像 mix-blend-mode
屬性那么單純,很多開發(fā)人員并不能很好地駕馭。例如請使用混合模式讓透明背景的小圖標變成漸變圖標,使用 mix-blend-mode
屬性實現(xiàn)的人有很多,但是能夠使用 background-blend-mode
屬性實現(xiàn)的人寥寥無幾。
因此,目前 background-blend-mode
屬性更常見的應用是用來豐富CSS的背景紋理,例如:
具體就不展開,非本文主要內(nèi)容。
本文地址: https://www.zhangxinxu.com/wordpress/?p=9499
到此這篇關(guān)于深入理解CSS background-blend-mode的作用機制的文章就介紹到這了,更多相關(guān)CSS background-blend-mode的作用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章
- CSS Grid 是一種二維布局系統(tǒng),可以同時控制行和列,相比 Flex(一維布局),更適合用在整體頁面布局或復雜模塊結(jié)構(gòu)中,這篇文章主要介紹了前端CSS Grid 布局詳解,需要的朋2025-04-16
CSS Padding 和 Margin 區(qū)別全解析
CSS 中的 padding 和 margin 是兩個非?;A且重要的屬性,它們用于控制元素周圍的空白區(qū)域,本文將詳細介紹 padding 和 margin 的概念、區(qū)別以及如何在實際項目中使用它們2025-04-07- will-change 是一個 CSS 屬性,用于告訴瀏覽器某個元素在未來可能會發(fā)生哪些變化,本文給大家介紹CSS will-change 屬性詳解,感興趣的朋友一起看看吧2025-04-07
- 本文給大家分享在 CSS 中,去除a標簽(超鏈接)的下劃線的幾種方法,本文給大家介紹的非常詳細,感興趣的朋友一起看看吧2025-04-07
- 在前端開發(fā)中,CSS(層疊樣式表)不僅是用來控制網(wǎng)頁的外觀和布局,更是實現(xiàn)復雜交互和動態(tài)效果的關(guān)鍵技術(shù)之一,隨著前端技術(shù)的不斷發(fā)展,CSS的用法也日益豐富和高級,本文將2025-04-07
css中的 vertical-align與line-height作用詳解
文章詳細介紹了CSS中的`vertical-align`和`line-height`屬性,包括它們的作用、適用元素、屬性值、常見使用場景、常見問題及解決方案,感興趣的朋友跟隨小編一起看看吧2025-03-26淺析CSS 中z - index屬性的作用及在什么情況下會失效
z-index屬性用于控制元素的堆疊順序,值越大,元素越顯示在上層,它需要元素具有定位屬性(如relative、absolute、fixed或sticky),本文給大家介紹CSS 中z - index屬性的作用2025-03-21- 文章詳細介紹了CSS中的打印媒體查詢@mediaprint包括基本語法、常見使用場景和代碼示例,如隱藏非必要元素、調(diào)整字體和顏色、處理鏈接的URL顯示、分頁控制、調(diào)整邊距和背景等2025-03-18
CSS模擬 html 的 title 屬性(鼠標懸浮顯示提示文字效果)
本文介紹了如何使用CSS模擬HTML的title屬性,通過鼠標懸浮顯示提示文字效果,通過設置`.tipBox`和`.tipBox.tipContent`的樣式,實現(xiàn)了提示內(nèi)容的隱藏和顯示,感興趣的朋友一起2025-03-10前端 CSS 動態(tài)設置樣式::class、:style 等技巧(推薦)
本文介紹了Vue.js中動態(tài)綁定類名和內(nèi)聯(lián)樣式的兩種方法:對象語法和數(shù)組語法,通過對象語法,可以根據(jù)條件動態(tài)切換類名或樣式;通過數(shù)組語法,可以同時綁定多個類名或樣式,此外2025-02-26