兩行 CSS 代碼實現圖片任意顏色賦色技術

来源:http://www.cnblogs.com/coco1s/archive/2017/12/21/8080211.html
-Advertisement-
Play Games

很久之前在張鑫旭大大的博客看到過一篇 PNG格式小圖標的CSS任意顏色賦色技術,當時驚為天人,感慨還可以這樣玩,私底下也曾多次想過有沒有其他方法可以實現,又或者不僅僅局限於 PNG 圖片。 mix-blend-mode 與 background-blend-mode mix-blend-mode 在 ...


很久之前在張鑫旭大大的博客看到過一篇 PNG格式小圖標的CSS任意顏色賦色技術,當時驚為天人,感慨還可以這樣玩,私底下也曾多次想過有沒有其他方法可以實現,又或者不僅僅局限於 PNG 圖片。

  

mix-blend-mode 與 background-blend-mode

mix-blend-mode 在我之前的一篇文章初略介紹過 -- 不可思議的混合模式 mix-blend-mode,與本文的主角 background-blend-mode 一樣,都是實現混合模式的。

混合模式最常見於 photoshop 中,是 PS 中十分強大的功能之一。當然,瞎用亂用混合模式誰都會,利用混合模式將多個圖層混合得到一個新的效果,只是要用到恰到好處,或者說在 CSS 中利用混合模式製作出一些效果則需要對混合模式很深的理解及不斷的嘗試。

簡單區分一下這兩個屬性:

  • mix-blend-mode 用於多個不同標簽間的混合模式
  • background-blend-mode 用於單個標簽間內背景圖與漸變背景間的混合模式。

background-blend-mode 的可用取值與 mix-blend-mode一樣,不重覆介紹,下麵直接進入應用階段。

 

使用 background-blend-mode: lighten 實現任意圖片顏色賦色技術

OK,下麵進入正文。如何通過純 CSS 技術實現任意圖片的任意顏色賦色技術呢?

假設我們有這樣一張圖片,JPG、PNG、GIF 都可以,但是有一個前提要求,就是黑色純色,背景白色

iconmonstr-binoculars-10

利用 background-blend-mode ,我們可以在圖片下疊加多一層其他顏色,通過 background-blend-mode: lighten 這個混合模式實現改變圖片主體顏色黑色為其它顏色的目的。

簡單的 CSS 代碼示意如下:

.pic {
    width: 200px;
    height: 200px;
    background-image: url($img);
    background-size: cover;
}

.pic1 {
    background-image: url($img), linear-gradient(#f00, #f00);
    background-blend-mode: lighten;
    background-size: cover;
}

效果如下:

image

註意,上面 CSS 這一句是關鍵 background-image: url($img), linear-gradient(#f00, #f00); ,這裡我疊加了一層漸變層 linear-gradient(#f00, #f00) ,實現了一個純紅色背景,而不是直接使用 #f00 實現紅色背景。

 

使用 background-blend-mode: lighten 實現主色改為漸變色

這個方法更厲害的地方在於,不單單可以將純色圖片由一種顏色改為另一種顏色,而且可以將圖片內的黑色部分由單色,改為漸變顏色!

簡單的 CSS 代碼如下:

.pic {
    background-image: url($img), linear-gradient(#f00, #00f);
    background-blend-mode: lighten;
    background-size: cover;
}

可以得到這樣的效果:

image

OK,看到這裡,大家伙肯定會有疑問了,這是怎麼實現的呢?

這裡就有必要解釋一下 lighten 這個混合模式了。變亮,變亮模式與變暗模式產生的效果相反:

  1. 用黑色合成圖像時無作用,用白色時則仍為白色
  2. 黑色比任何顏色都要暗,所以黑色會被任何色替換掉。反之,如果素材的底色是黑色,主色是白色。那就應該用變暗(darken)的混合模式

CodePen Demo -- 純色圖片賦色技術嘗試

 

 

局限性嘗試 -- 使用透明底色圖片

上述方法要求了圖片本身內容為純色黑色,底色為白色。那麼如果像 PNG 圖片一樣,只存在主色,而底色是透明的,是否能夠同樣實現效果呢?

假設我們有一張這樣的 PNG 圖片(灰色主色,透明底色):

按照上面的方式實現一遍,結果如下:

image

任意顏色賦色技術嘗試 -- PNG圖片

很遺憾,當底色是透明的時候,會被混合模式混合上疊加層的顏色,無法使用。所有,這個技術也就存在了一個使用前提:

  • 圖片的底色為白色,主色為黑色

當然主色也可以是其他顏色,只是這個時候疊加需要考慮顏色的融合,沒有使用黑色直觀。

 

background-blend-mode 實現圖片任意顏色賦色技術總結

綜上,我們確實只需要兩行代碼就可以實現白色底色黑色主色圖片的任意顏色賦色技術。

{
    background-image: url($img), linear-gradient(#f00, #00f);
    background-blend-mode: lighten;
}

其中,background-image 的第二值就是你希望賦值給的漸變色(當然,漸變色可以生成純色)。

我們同時給一個標簽設置了背景圖片和漸變色,然後利用了 background-blend-mode:lighten 這個關鍵屬性,達到了類似 PS 里的混合模式效果。

看起來 background-blend-mode 名為混合模式,但似乎表現上更像是 PS 當中的一種的剪切蒙板,混合模式是修改圖片本身,蒙版跟遮罩都是在圖片上一層通過疊加其他層對圖像進行調整。

那麼由此方法本身可以想到,一些能對圖形進行色彩調整的 CSS 屬性是否也能達到同樣的功能呢?諸如:

  • filter 濾鏡
  • mask-image
  • mask-clip

感興趣的讀者可以自行嘗試,在接下來的文章我也會繼續進行探討。

黑色純色,背景白色可能局限了這個技巧的使用場景,但是在很多白色底色的頁面中,這個方法還是可以很好的發揮作用,許多 ICON 圖片不再需要兩個或者更多個顏色的版本!

 

background-blend-mode 相容性

相較於 mix-blend-modebackground-blend-mode 的相容性會更好一點。所以本文所介紹的技術在移動端是存在用武之地的:

image

 

最後

當然,background-blend-mode 本身還可以實現其他更多酷炫的效果,將在下一篇文章 不可思議的混合模式 mix-blend-mode(二) 分享給大家,敬請期待。

更多精彩 CSS 技術文章彙總在我的 Github -- iCSS ,持續更新,歡迎點個 star 訂閱收藏。

好了,本文到此結束,希望對你有幫助 :)

如果還有什麼疑問或者建議,可以多多交流,原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 近年來,前端技術的發展迅速,但因為前端知識面龐大,在實際學習當中往往無法理清其中的脈絡。下麵從各種庫、框架、插件的層面上,對前端知識點做一些簡單的梳理。從軟體工程上,將前端分為四個由淺及深的層面或階段。 一、基礎層(瀏覽器原生支持html/css/js) HTML超文本標記語言,用標簽構建網頁的內容 ...
  • 總體過了一下後面的流程,發現Compiler模塊確實不適合單獨講解,這裡繼續講解後面的代碼: 這行代碼與之前設置options預設值非常相似,但是複雜程度根本不是一個次元的。 這一節只能簡單的看一眼內部到底有多少東西,整理後源碼如下: 這個模塊除去父類引入,其餘插件光頂部引入就有34個,簡直就是插件 ...
  • openlayers3教材詳解及demo(完整) OpenLayers 3對OpenLayers網路地圖庫進行了根本的重新設計。版本2雖然被廣泛使用,但從JavaScript開發的早期發展階段開始,已日益現實出它的落後。 OL3已運用現代的設計模式從底層重寫。 最初的版本旨在支持第2版提供的功能,提 ...
  • HTML5 var uaTest = /Android|webOS|Windows Phone|iPhone|ucweb|ucbrowser|iPod|iPad|BlackBerry/i.test(navigator.userAgent.toLowerCase());var touchTest = ...
  • 深入ES6 模塊系統 本文轉載自: "眾成翻譯" 譯者: "neck" 鏈接: "http://www.zcfy.cc/article/4436" 原文: "https://ponyfoo.com/articles/es6 modules in depth the es6 module system ...
  • JavaScript中的工廠方法、構造函數與class 本文轉載自: "眾成翻譯" 譯者: "謝於中" 鏈接: "http://www.zcfy.cc/article/1129" 原文: "https://medium.com/javascript scene/javascript factory ...
  • jQuery代碼: css代碼: 公共樣式css: tips彈框js: 代碼所需圖片: 實現效果: ...
  • 每次代碼變動之後自動加上一個時間戳,使之前舊版本失效把。很多構建工具都可以做到。例如webpack可以對打包後的文件自動加上一個[hash] 時間和固定一個值都可以做到。但是載入太大了。目前就瞭解到這些. 2017-12-21 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...