深入理解CSS background-blend-mode的作用機(jī)制
本文歡迎分享與聚合,全文轉(zhuǎn)載就不必了,尊重版權(quán),圈子就這么大,若急用可以聯(lián)系授權(quán)。
一、可能都知道的
首先,講兩點(diǎn)大家可能都知道的知識點(diǎn):
1.background-blend-mode 本身就帶有隔離特性,也就是一個元素應(yīng)用 background-blend-mode 背景混合模式,最終的效果只會受當(dāng)前元素的背景圖像和背景顏色影響,不會受視覺上處于當(dāng)前區(qū)域其他任意元素影響。
2.應(yīng)用 background-blend-mode 屬性后,不僅各個圖像之間要進(jìn)行混合,同時還要和背景色進(jìn)行混合。
接下來,講下大家可能并不知道的知識點(diǎn),這也是很多人搞不清楚為什么 background-blend-mode 屬性這么渲染的原因。
二、可能不知道的
1. 背景順序影響混合效果
混合效果和 background 屬性中背景圖像的順序密切相關(guān)。在CSS多背景中,越是語法中靠后的背景圖像的層級越是低,這也是為何 background-color 要寫在最后語法才合法的原因,因?yàn)楸尘吧膶蛹売肋h(yuǎn)是最低的。
例如下面2個元素:
<div class="ball"></div> <div class="ball2"></div>
設(shè)置背景混合模式為疊加,但是兩個元素的背景圖像的順序是相反的,代碼如下所示:
.ball {
width: 200px; height: 200px;
border-radius: 50%;
background: linear-gradient(deeppink, deeppink), linear-gradient(deepskyblue, deepskyblue);
/* 應(yīng)用疊加混合模式 */
background-blend-mode: overlay;
}
.ball2 {
width: 200px; height: 200px;
border-radius: 50%;
background: linear-gradient(deepskyblue, deepskyblue), linear-gradient(deeppink, deeppink);
/* 應(yīng)用疊加混合模式 */
background-blend-mode: overlay;
}
結(jié)果下圖所示, .ball 元素表現(xiàn)為 deeppink 疊加后面的 deepskyblue ,最終混合顏色偏藍(lán); .ball2 元素表現(xiàn)為 deepskyblue 疊加后面的 deeppink ,最終混合顏色偏紫。

2. 混合效果是多個混合屬性同時作用的結(jié)果
很多開發(fā)人員并不清楚, background-blend-mode 支持其實(shí)是可以設(shè)置多個混合模式值,分別對應(yīng)不同的背景圖像,這一點(diǎn)和僅僅支持一個混合模式值的 mix-blend-mode 屬性是不一樣的。例如:
.ball {
background: linear-gradient(deeppink, deeppink),
linear-gradient(deepskyblue, deepskyblue);
background-blend-mode: overlay;
}
實(shí)際上等同于:
.ball {
background: linear-gradient(deeppink, deeppink),
linear-gradient(deepskyblue, deepskyblue);
background-blend-mode: overlay overlay;
}
也就是, deeppink 實(shí)際上疊加的是deepskyblue和背景色(此例是透明), deepskyblue 疊加的是背景色(此例是透明)。
換言之,實(shí)際上,每個背景圖像都有一個自己的混合模式值,這是和 mix-blend-mode 屬性有著巨大區(qū)別的!通常,在使用 mix-blend-mode 屬性的場景中,我們只會把混合模式設(shè)置在頂層元素上,而不會每一層元素都設(shè)置,于是帶來了一個由此及彼的嚴(yán)重的思維誤區(qū),以為背景混合模式設(shè)置的值也是作用在對頂層的背景圖像上的,從而導(dǎo)致很多開發(fā)者想不通 background-blend-mode 屬性的渲染表現(xiàn)和自己預(yù)期的不一樣。
我們通過一個案例演示下 background-blend-mode 屬性的多個值是如何和背景圖像一一對應(yīng)的。
<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)生的如下圖所示。

其中:
中間標(biāo)注了序號①的正方形區(qū)域沒有應(yīng)用任何混合模式,顏色就是 deeppink ,作用是方便大家和區(qū)域③、區(qū)域⑤處的顏色進(jìn)行對比。
- 區(qū)域②就是背景色
darkblue,因?yàn)閮蓚€斜向漸變均沒有覆蓋到這個區(qū)域,直接暴露了設(shè)置的背景色。 - 區(qū)域③和區(qū)域⑤是下層漸變,也就是
background屬性值中位置靠后的漸變,對應(yīng)的混合模式也是background-blend-mode屬性值靠后的那個,也就是screen,濾色模式,可以讓顏色變亮。 - 區(qū)域④和區(qū)域⑤是上層漸變,也就是
background屬性值中位置靠前的漸變,對應(yīng)的混合模式也是background-blend-mode屬性值靠前的那個,也就是multiply,正片疊底模式,可以讓顏色變暗。 - 區(qū)域③的顏色表現(xiàn)源自漸變色
deeppink和背景色darkblue進(jìn)行濾色混合的效果,可以看出最終呈現(xiàn)的顏色比deeppink更亮了,最終混合后的色值是rgb(255,20,206)。 - 區(qū)域④的顏色表現(xiàn)源自漸變色
deeppink和背景色darkblue進(jìn)行正片疊底混合的效果,可以看出最終呈現(xiàn)的顏色比darkblue更深了,最終混合后的色值是rgb(0,0,80)。 - 區(qū)域⑤最復(fù)雜,理解了這個,也就理解了大多數(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) 進(jìn)行正片疊底混合后的色值,結(jié)果是 rgb(255,1,119) 。
以上就是 .box 元素5個顏色各自呈現(xiàn)的原理所在。
三、background-blend-mode與漸變圖標(biāo)的實(shí)現(xiàn)
最后再看看看,為何大多數(shù)人沒辦法使用 background-blend-mode 實(shí)現(xiàn)漸變圖標(biāo)的效果。
例如,現(xiàn)在有1個顏色很深的刪除小圖標(biāo),理論上,我們可以使用 lighten 混合模式實(shí)現(xiàn)漸變效果,因?yàn)?lighten 的效果是哪個顏色淺使用哪個顏色,由于圖標(biāo)本身顏色很深,因此,一定會顯示漸變色,只要給圖標(biāo)加一個白色底就可以,于是,按照這個思路,很多人就寫了如下所示的CSS代碼:
.icon-delete {
background: linear-gradient(deepskyblue, deeppink),
url(delete.png), white;
background-blend-mode: lighten;
}
乍一看,似乎邏輯上無懈可擊,漸變和白底黑色的圖標(biāo)進(jìn)行變亮混合,怎么想黑色圖標(biāo)也應(yīng)該變成漸變色啊,很遺憾,最終的漸變并不是漸變色,而是純白色,為什么會有這樣的結(jié)果呢?
那是因?yàn)檫@里的 background-blend-mode:lighten 實(shí)際上是一個縮寫,或者簡寫,實(shí)際上真實(shí)的計(jì)算值是 lighten lighten ,代碼如下所示:
.icon-delete {
background: linear-gradient(deepskyblue, deeppink),
url(delete.png), white;
/* 實(shí)際上的計(jì)算值 */
background-blend-mode: lighten lighten;
}
也就是刪除圖標(biāo) delete.png 也應(yīng)用了混合模式 lighten ,和白色背景色進(jìn)行了混合,于是變成了純白色。
知道了問題所在,也就知道了該如何解決了,很簡單,讓 delete.png 和白色背景色混合后還保持原始圖標(biāo)的模樣即可,下面兩種CSS方法均可以:
.icon-delete {
background: linear-gradient(deepskyblue, deeppink),
url(delete.png), white;
/* PNG圖標(biāo)的混合模式單獨(dú)設(shè)成darken */
background-blend-mode: lighten darken;
}
或者是:
.icon-delete {
background: linear-gradient(deepskyblue, deeppink),
url(delete.png), white;
/* PNG圖標(biāo)的混合模式單獨(dú)設(shè)成normal */
background-blend-mode: lighten normal;
}
推薦使用 normal 關(guān)鍵字,因?yàn)楦擅?,性能也更好一點(diǎn)。最終實(shí)現(xiàn)的效果如下圖所示。

當(dāng)然,漸變圖標(biāo)效果最好的實(shí)現(xiàn)方法肯定是 CSS mask 遮罩屬性 ,這里的使用混合模式實(shí)現(xiàn)的漸變圖標(biāo)會有白色的底,并不是完美的實(shí)現(xiàn)方法,主要目的還是讓大家了解 background-blend-mode 屬性的渲染細(xì)節(jié)。
四、background-blend-mode的補(bǔ)全規(guī)則
當(dāng) background-blend-mode 的屬性值的數(shù)量和 background-image 不匹配的時候,遵循下面的應(yīng)用規(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 ,則會重復(fù)完整的 background-blend-mode 屬性值進(jìn)行補(bǔ)全,例如:
.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 一起進(jìn)行重復(fù),而不是僅僅重復(fù)最后一個混合模式值。因此,補(bǔ)全的值的 lighten 。
五、結(jié)語
CSS background-blend-mode 屬性可以讓各個背景圖像之間應(yīng)用混合模式。
background-blend-mode 屬性的使用頻率要明顯低于 mix-blend-mode 屬性。
原因在于:
1.真實(shí)世界的照片圖像很少作為 background-image 背景圖像呈現(xiàn),因?yàn)椴焕跓o障礙訪問,而混合模式設(shè)計(jì)的初衷就是這類照片圖像的處理;
2.background-blend-mode 屬性作用機(jī)制不像 mix-blend-mode 屬性那么單純,很多開發(fā)人員并不能很好地駕馭。例如請使用混合模式讓透明背景的小圖標(biāo)變成漸變圖標(biāo),使用 mix-blend-mode 屬性實(shí)現(xiàn)的人有很多,但是能夠使用 background-blend-mode 屬性實(shí)現(xiàn)的人寥寥無幾。
因此,目前 background-blend-mode 屬性更常見的應(yīng)用是用來豐富CSS的背景紋理,例如:

具體就不展開,非本文主要內(nèi)容。
本文地址: https://www.zhangxinxu.com/wordpress/?p=9499
到此這篇關(guān)于深入理解CSS background-blend-mode的作用機(jī)制的文章就介紹到這了,更多相關(guān)CSS background-blend-mode的作用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章

CSS3打造的現(xiàn)代交互式登錄界面詳細(xì)實(shí)現(xiàn)過程
本文介紹CSS3和jQuery在登錄界面設(shè)計(jì)中的應(yīng)用,涵蓋動畫、選擇器、自定義字體及盒模型技術(shù),提升界面美觀與交互性,同時優(yōu)化性能和可訪問性,感興趣的朋友跟隨小編一起看看吧2025-06-20CSS普通流、浮動與定位網(wǎng)頁布局三大機(jī)制及最佳實(shí)踐
本文給大家講解CSS 的三種核心布局機(jī)制——普通流(Normal Flow)、浮動(Float)和定位(Positioning)對于創(chuàng)建靈活、響應(yīng)式的網(wǎng)頁至關(guān)重要,本文將深入探討這三種機(jī)制的工作原2025-06-19
css實(shí)現(xiàn)角標(biāo)效果并帶有文章或圖標(biāo)效果(完整代碼)
文章介紹如何用CSS實(shí)現(xiàn)角標(biāo)效果,通過.active類結(jié)合::after和::before偽元素,利用定位、邊框和旋轉(zhuǎn)創(chuàng)建紅色邊框與白色三角形的提示標(biāo)志,適用于按鈕或卡片元素的視覺增強(qiáng)設(shè)計(jì)2025-06-19CSS Anchor Positioning重新定義錨點(diǎn)定位的時代來臨(最新推薦)
CSS Anchor Positioning是一項(xiàng)仍在草案中的新特性,由 Chrome 125 開始提供原生支持需啟用實(shí)驗(yàn) flag,它允許你在 CSS 中通過錨點(diǎn)(anchor)來相對于任意 DOM 元素定位,本文2025-06-17CSS中的Static、Relative、Absolute、Fixed、Sticky的應(yīng)用與詳細(xì)對比
CSS 中的 position 屬性用于控制元素的定位方式,不同的定位方式會影響元素在頁面中的布局和層疊關(guān)系,以下是 static、relative、absolute、fixed、sticky 的詳細(xì)對比和應(yīng)用2025-06-17CSS place-items: center解析與用法詳解
place-items: center; 是一個強(qiáng)大的 CSS 簡寫屬性,用于同時控制 網(wǎng)格(Grid) 和 彈性盒(Flexbox) 布局中的對齊方式,本文給大家介紹CSS place-items: center; 詳解與用法2025-06-17
CSS實(shí)現(xiàn)元素?fù)螡M剩余空間的五種方法
在日常開發(fā)中,我們經(jīng)常需要讓某個元素占據(jù)容器的剩余空間,本文將介紹5種不同的方法來實(shí)現(xiàn)這個需求,并分析各種方法的優(yōu)缺點(diǎn),感興趣的朋友一起看看吧2025-06-17CSS中前端單位 px、vw、vh 等的區(qū)別與使用建議
CSS單位區(qū)別與使用場景總結(jié):px絕對、vw/vh響應(yīng)式,%繼承父尺寸,em/rem文字縮放,vmin/vmax適應(yīng)寬高變化,固定布局用px或%,響應(yīng)式布局用vw/vh/rem,文字用em或rem,本文給大家2025-06-16CSS 樣式表的四種應(yīng)用方式及css注釋的應(yīng)用小結(jié)
這篇文章主要介紹了CSS 樣式表的四種應(yīng)用方式及css注釋的應(yīng)用小結(jié),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2025-05-21- 在CSS布局中,padding屬性是控制元素內(nèi)容與其邊框之間距離的關(guān)鍵工具,本文介紹CSS基礎(chǔ)中padding,通過本文的介紹,我們深入了解了padding的基本概念、簡寫方法以及它對元2025-05-16




