作者: Ahmad Shaeed
譯者:前端小智
來源:css-tricks
有夢想,有乾貨,微信搜尋 【大遷世界】 關注這個在凌晨還在刷碗的刷碗智。
本文 GitHub https://github.com/qq449245884/xiaozhi 已收錄,有一線大廠面試完整考點、資料以及我的系列文章。
什麼是混合?
根據維基百科:
數字影像編輯和計算機圖形中的混合模式(或混合模式)用於確定兩個圖層如何相互混合。在大多數應用程式中,預設的混合模式只是通過用頂層的內容覆蓋底層來隱藏底層。
在CSS中,有兩個屬性負責混合。 mix-blend-mode
用於混合DOM元素,background-blend-mode
用於組合多個CSS背景。
進入mix-Blend-Mode
基礎範例
我們以一個基本的例子來看一下它是如何工作的。 我的標題上方有一個圓圈。 我要做的是將文字與圓混合。
HTML
<div class="circle"></div>
<p>Blend Me</p>
CSS
為文字元素新增了mix-blend-mode: overlay
,從而將其與圓混合。
事例原始碼:https://codepen.io/shadeed/pe...
帶文字的圖片
我認為這是一個廣泛使用的混合模式。文字在上面,圖片在下面。
在標題中新增了以下內容:
.hero-title {
color: #000;
mix-blend-mode: overlay;
}
不僅僅是改變混合模式。 例如,我們可以通過建立動畫來提高創意。
在此示例中,我想探討文字如何與樹葉背景融合。 由於影像中包含暗點和亮點,因此在使文字看起來像在每片葉子下移動一樣,這將起到非常有用的作用。
事例原始碼:https://codepen.io/shadeed/pe...
帶有SVG圖形的文字
個有趣的效果是在帶有向量和形狀的背景上有一個標題。 當形狀的顏色不同時,它會變得更加有趣。
我們能用這些斑點形狀做什麼?我使用MorphSVG外掛改變每個部落格形狀的路徑。這產生了一個有趣的結果。
事例原始碼:https://codepen.io/shadeed/pe...
混合真實元素
吸引我眼球的效果是當元素有白色背景和黑色前景使用mix-blend-mode: screen
。
大家都說簡歷沒專案寫,我就幫大家找了一個專案,還附贈【搭建教程】。
放大鏡類
我使用了SVG,並對其應用了以下內容。 注意使用螢幕時黑色區域如何變為透明。
事例原始碼:https://codepen.io/shadeed/pe...
視訊封面
對我來說,這是一個非常有用的用例。 我經常需要新增播放圖示以指示文章中有視訊,因此我最終使用了從中心透明的SVG。
這聽起來似乎正確,但有一定侷限性。 如果要新增懸停效果以填充三角形怎麼辦? 由於在SVG中減去了形狀,因此這是不可能的。 一種解決方法是在SVG後面放置一個圓圈,並在懸停時對其進行著色。
對我來說,這還不夠。我也想反過來,三角形必須是白色的,其餘的是藍色的。
多虧了混合模式,我可以通過在懸停時控制嵌入式SVG快速實現改效果。
.article__play {
mix-blend-mode: screen;
}
.article:hover .article__play {
mix-blend-mode: normal;
}
.article:hover .article__play {
.play__base {
fill: #005FFF;
}
.play__icon {
fill: #fff;
}
}
事例原始碼:https://codepen.io/shadeed/pe...
儲值卡
另一種情況是使用裁切影像並將其與其下方的背景融合,結果非常有趣。
img {
position: absolute;
right: -15px;
top: 0;
width: 110px;
mix-blend-mode: screen;
}
這個想法是把圖片放在右邊,左邊有標題和描述。
同樣,通過為每張卡新增多個背景可以更好:
事例原始碼:https://codepen.io/shadeed/pe...
大家都說簡歷沒專案寫,我就幫大家找了一個專案,還附贈【搭建教程】。
從徽標背景中刪除白色
我在Photoshop的早期就知道這個技巧。有時,我需要一個品牌的標誌,它是很難得到一個透明的PNG版本。使用混合模式,這很容易解決。
我模擬了Facebook和Amazon徽標,並在每個徽標下新增了白色背景。
現在來解決這個問題,新增了以下CSS:
img {
mix-blend-mode: multiply;
filter: contrast(2);
}
注意,我新增了filter: contrast(2)
來增加徽標的對比度。應用混合效果使他們比原來的顏色深一點。
問題已解決! 當然,我不建議使用此功能。 但是,如果我被迫這麼做,我將使用它來節省時間,當原始徽標到達時,我可以替換它並消除混合效果。
事例原始碼:https://codepen.io/shadeed/pe...
Isolation
isolation
CSS屬性定義該元素是否必須建立一個新的層疊上下文(stacking context)。
該屬性的主要作用是當和background-blend-mode
屬性一起使用時,可以只混合一個指定元素棧的背景:它允許使一組元素從它們後面的背景中獨立出來,只混合這組元素的背景。
html
<div>
<span>CSS is Awesome</span>
</div>
css
div {
isolation: isolate; /* Creates a new stacking context */
}
span {
mix-blend-mode: difference;
}
如你所見,文字“ CSS很棒”僅在其父代的邊界內融合。 外面的東西不會混在一起。 換句話說,它是孤立的。
事例原始碼:https://codepen.io/shadeed/pe...
isolation
可以通過使用建立新的堆疊上下文的屬性來實現。例如,如果父元素具有opacity
屬性,這將影響結果。
html
<div>
<img src="cake.jpg" alt="">
</div>
css
div {
opacity: 0.99; /* Creates a new stacking context, which result to an isolated group */
}
img {
mix-blend-mode: difference;
}
事例原始碼:https://codepen.io/shadeed/pe...
進入Background-Blend-Mode
它的工作方式類似mix-blend-mode
,但具有多個背景影像。 每個背景可以有自己的混合模式,舉個例子。
在此示例中,將三層混合在一起:基礎影像,實心填充(Solid Fill)和漸變填充(radient Fill.)。
.elem {
background: linear-gradient(45deg, #000 10%, transparent),
linear-gradient(#3754C7, #3754C7),
url(nature.jpg);
background-size: cover;
background-blend-mode: overlay, color;
}
在CSS中,應該以正確的方式對每個背景進行排序。 堆疊順序從上到下,如上圖所示。
事例原始碼:https://codepen.io/shadeed/pe...
著色影像
通過使用徑向梯度,有一些有趣的結果比有用。這個想法是新增一個彩色的影像,使它與它混合。
:root {
--color: #000;
--size: 250px; /* Gradient Size */
}
.elem-1 {
background: radial-gradient(circle var(--size) at center, transparent, var(--color)),
url(nature.jpg);
}
通過對元素應用background-blend-mode: color
,結果是影像的去飽和版本。
事例原始碼:https://codepen.io/shadeed/pe...
瀏覽器支援
原文:https://css-tricks.com/basics...
編輯中可能存在的bug沒法實時知道,事後為了解決這些bug,花了大量的時間進行log 除錯,這邊順便給大家推薦一個好用的BUG監控工具 Fundebug。
交流
有夢想,有乾貨,微信搜尋 【大遷世界】 關注這個在凌晨還在刷碗的刷碗智。
本文 GitHub https://github.com/qq449245884/xiaozhi 已收錄,有一線大廠面試完整考點、資料以及我的系列文章。