CSS中的混合模式,製作高階特效的必備技巧

前端小智發表於2022-03-14
作者: Ahmad Shaeed
譯者:前端小智
來源:css-tricks

有夢想,有乾貨,微信搜尋 【大遷世界】 關注這個在凌晨還在刷碗的刷碗智。

本文 GitHub https://github.com/qq449245884/xiaozhi 已收錄,有一線大廠面試完整考點、資料以及我的系列文章。

什麼是混合?

根據維基百科:

數字影像編輯和計算機圖形中的混合模式(或混合模式)用於確定兩個圖層如何相互混合。在大多數應用程式中,預設的混合模式只是通過用頂層的內容覆蓋底層來隱藏底層。

在CSS中,有兩個屬性負責混合。 mix-blend-mode用於混合DOM元素,background-blend-mode用於組合多個CSS背景。

進入mix-Blend-Mode

基礎範例

clipboard.png

我們以一個基本的例子來看一下它是如何工作的。 我的標題上方有一個圓圈。 我要做的是將文字與圓混合。

HTML

<div class="circle"></div>
<p>Blend Me</p>

CSS

為文字元素新增了mix-blend-mode: overlay,從而將其與圓混合。

事例原始碼:https://codepen.io/shadeed/pe...

帶文字的圖片

我認為這是一個廣泛使用的混合模式。文字在上面,圖片在下面。

clipboard.png

在標題中新增了以下內容:

.hero-title {
    color: #000;
    mix-blend-mode: overlay;
}

不僅僅是改變混合模式。 例如,我們可以通過建立動畫來提高創意。

圖片描述

在此示例中,我想探討文字如何與樹葉背景融合。 由於影像中包含暗點和亮點,因此在使文字看起來像在每片葉子下移動一樣,這將起到非常有用的作用。

clipboard.png

事例原始碼:https://codepen.io/shadeed/pe...

帶有SVG圖形的文字

個有趣的效果是在帶有向量和形狀的背景上有一個標題。 當形狀的顏色不同時,它會變得更加有趣。

clipboard.png

我們能用這些斑點形狀做什麼?我使用MorphSVG外掛改變每個部落格形狀的路徑。這產生了一個有趣的結果。

圖片描述

事例原始碼:https://codepen.io/shadeed/pe...

混合真實元素

clipboard.png

吸引我眼球的效果是當元素有白色背景和黑色前景使用mix-blend-mode: screen

大家都說簡歷沒專案寫,我就幫大家找了一個專案,還附贈【搭建教程】

放大鏡類

我使用了SVG,並對其應用了以下內容。 注意使用螢幕時黑色區域如何變為透明。

clipboard.png

事例原始碼:https://codepen.io/shadeed/pe...

視訊封面

對我來說,這是一個非常有用的用例。 我經常需要新增播放圖示以指示文章中有視訊,因此我最終使用了從中心透明的SVG。

clipboard.png

這聽起來似乎正確,但有一定侷限性。 如果要新增懸停效果以填充三角形怎麼辦? 由於在SVG中減去了形狀,因此這是不可能的。 一種解決方法是在SVG後面放置一個圓圈,並在懸停時對其進行著色。

clipboard.png

對我來說,這還不夠。我也想反過來,三角形必須是白色的,其餘的是藍色的。

多虧了混合模式,我可以通過在懸停時控制嵌入式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;
    }
}

clipboard.png

事例原始碼:https://codepen.io/shadeed/pe...

儲值卡

另一種情況是使用裁切影像並將其與其下方的背景融合,結果非常有趣。

img {
    position: absolute;
    right: -15px;
    top: 0;
    width: 110px;
    mix-blend-mode: screen;
}

這個想法是把圖片放在右邊,左邊有標題和描述。

clipboard.png

同樣,通過為每張卡新增多個背景可以更好:

clipboard.png

事例原始碼:https://codepen.io/shadeed/pe...

大家都說簡歷沒專案寫,我就幫大家找了一個專案,還附贈【搭建教程】

從徽標背景中刪除白色

我在Photoshop的早期就知道這個技巧。有時,我需要一個品牌的標誌,它是很難得到一個透明的PNG版本。使用混合模式,這很容易解決。

我模擬了Facebook和Amazon徽標,並在每個徽標下新增了白色背景。

clipboard.png

現在來解決這個問題,新增了以下CSS:

img {
    mix-blend-mode: multiply;
    filter: contrast(2);
}

注意,我新增了filter: contrast(2)來增加徽標的對比度。應用混合效果使他們比原來的顏色深一點。

clipboard.png

問題已解決! 當然,我不建議使用此功能。 但是,如果我被迫這麼做,我將使用它來節省時間,當原始徽標到達時,我可以替換它並消除混合效果。

事例原始碼: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;
}

clipboard.png

如你所見,文字“ 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,但具有多個背景影像。 每個背景可以有自己的混合模式,舉個例子。

clipboard.png

在此示例中,將三層混合在一起:基礎影像,實心填充(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中,應該以正確的方式對每個背景進行排序。 堆疊順序從上到下,如上圖所示。

clipboard.png

事例原始碼: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);
}

clipboard.png

通過對元素應用background-blend-mode: color,結果是影像的去飽和版本。

clipboard.png

事例原始碼:https://codepen.io/shadeed/pe...

瀏覽器支援

clipboard.png


原文:https://css-tricks.com/basics...

編輯中可能存在的bug沒法實時知道,事後為了解決這些bug,花了大量的時間進行log 除錯,這邊順便給大家推薦一個好用的BUG監控工具 Fundebug

交流

有夢想,有乾貨,微信搜尋 【大遷世界】 關注這個在凌晨還在刷碗的刷碗智。

本文 GitHub https://github.com/qq449245884/xiaozhi 已收錄,有一線大廠面試完整考點、資料以及我的系列文章。

相關文章