CSS filter有哪些神奇用途

2021-12-29 web前端開發

來源 | https://www.cnblogs.com/dragonir/p/14807272.html 

作者 | dragonir


背景基本概念css filter 屬性將模糊或顏色偏移等圖形效果應用於元素形成濾鏡,濾鏡通常用於調整圖像,背景和邊框的渲染。它的值可以為 filter 函數 <filter-function> 或使用 url 添加的svg濾鏡。

filter: <filter-function> [<filter-function>]* | nonefilter: url(file.svg#filter-element-id)

<filter-function> 可以用於 filter 和 backdrop-filter 屬性。它的數據類型由下列過濾器函數之一指定。每個函數需要一個參數,如果參數無效,則濾鏡不會生效。以下是對濾鏡函數含義的解釋:

blur():模糊圖像
brightness() :讓圖像更明亮或更暗淡
contrast():增加或減少圖像的對比度
drop-shadow():在圖像後方應用投影
grayscale():將圖像轉為灰度圖
hue-rotate():改變圖像的整體色調
invert():反轉圖像顏色
opacity():改變圖像透明度
saturate():超飽和或去飽和輸入的圖像
sepia():將圖像轉為棕褐色

用法示例:

filter: url("filters.svg#filter-id");filter: blur(5px);filter: brightness(0.4);filter: contrast(200%);filter: drop-shadow(16px 16px 20px blue);filter: grayscale(50%);filter: hue-rotate(90deg);filter: invert(75%);filter: opacity(25%);filter: saturate(30%);filter: sepia(60%);filter: contrast(175%) brightness(3%);filter: none;filter: inherit;filter: initial;filter: unset;


應用案例更加智能的陰影效果

在給元素添加陰影的時候,我們一般採用 box-shadow 屬性,通過 box-shadow(x偏移, y偏移, 模糊大小, 陰影大小, 色值, inset) 的語法形式很容易為元素添加陰影效果,但 box-shadow 也有一個缺點,就是在給透明圖片添加陰影效果時,無法穿透元素,只能添加到透明圖片元素的盒模型上。

這個時候,filter 屬性的 drop-shadow 方法就能很好的解決這個問題,用它添加的陰影可以穿透元素,而不是添加到元素的盒模型邊框上。

drop-shadow 添加的陰影除了可以穿透透明元素外,陰影效果和 box-shadow 是相同的,如果瀏覽器支持硬體加速的話,使用 filter 添加的陰影效果會更加逼真。

drop-shadow 語法如下(它除了不支持設置 inset,其他和 box-shadow 是完全相同的):

filter: drop-shadow(x偏移, y偏移, 模糊大小, 色值);

如:

filter: drop-shadow(1px 1px 15px rgba(0, 0, 0, .5));

下圖是分別使用 box-shadow 和 filter: drop-shadow 為透明元素添加陰影的對比:


<img src="futurama.png" /><img src="futurama.png" />

.box-shadow {  box-shadow: 1px 1px 15px rgba(0, 0, 0, .5);}.drop-shadow {  filter: drop-shadow(1px 1px 15px rgba(0, 0, 0, .5));}

元素、網頁置灰

發生重大災害事故或其他哀悼日時,國企政府網站往往有網頁全部置灰的需求。或者很多網頁中有滑鼠 hover 懸浮到灰色元素上時變成彩色的樣式效果。

此時就可以使用 filter 屬性的 grayscale 方法實現,它可以調整元素灰度,通過給頁面元素設置 filter: grayscale(100%) 就可將頁面元素置灰。

以下示例中,body 標籤下有 h1 和 img 標籤,未添加 filter 樣式前如下所示。

<body>  <h1>FUTURAMA</h1>  <img width="500" src="./images/futurama.png" /></body>


現在我們給 body 元素添加一個 .gray 類,<body> 就可實現整個網頁置灰效果。

.gray {  filter: grayscale(100%);}


為了兼容 IE8 等其他低版本瀏覽器,我們可以加上瀏覽器前綴和 svg 濾鏡。

.gray {  -webkit-filter: grayscale(1);  -webkit-filter: grayscale(100%);  -moz-filter: grayscale(100%);  -ms-filter: grayscale(100%);  -o-filter: grayscale(100%);  filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale");  filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);  filter: grayscale(100%);}

在做緊急置灰網頁需求時,上線一段時間往往需要撤掉這個功能,我們還可以在首次上線時添加以下類似的方法,來控制置灰效果的自動上下線時間,這樣到達預定時間就可自動撤去,不用走兩次施工流程。

(function setGray() {  var endTime = Date.parse("Apr 06 2077 00:00:01");  var timestamp = Date.parse(new Date());  if (timestamp <= endTime) {    document.querySelector('html').classList.add('gray');  }})();

元素強調、高亮

brightness 方法實現元素高亮的效果,可以應用到菜單欄、圖片列表 hover 效果,來強調滑鼠當前懸浮或選中的內容。

下面是對一組按鈕菜單欄添加 brightness 和 saturate 兩個方法,通過改變亮度和飽和度來高亮元素。

<div>  <a>1</a>  <a>1</a>  <a>1</a></div>

.container {  margin: 40px;}.button {  padding: 0.5em 0.5em;  background: #E0E0E0;  border-radius: 3px;}.button.dark {  background: #333;}.button:hover:not(.disabled) {  cursor: pointer;  border-radius: 3px;  filter: brightness(110%) saturate(140%);}.button.disabled {  filter: grayscale(100%);}

毛玻璃效果

毛玻璃(Frosted glass)效果,顧名思義就是類似半透明毛玻璃的效果,在 iOS 系統、Windows 10 等系統 UI 中有廣泛應用,使用毛玻璃效果可以增強視覺體驗。

在 《css揭秘》 等著作中也有系統講解,下面是我對分別使用 filter: blur 和 backdrop-filter: blur兩種方法實現這種效果的總結。

有兩個含有相同類名 glass 的 div 元素,它們分別被添加兩個類 glass-by-filter 和 glass-by-backdrop-filter 來區分兩種方法。

通用樣式,設置毛玻璃元素的大小、圓角等基本樣式:

.glass {  height: 300px;  width: 300px;  border: 1px groove #EFEFEF;  border-radius: 12px;  background: rgba(242, 242, 242, 0.5);  box-shadow: 0 0.3px 0.7px rgba(0, 0, 0, 0.126),    0 0.9px 1.7px rgba(0, 0, 0, 0.179), 0 1.8px 3.5px rgba(0, 0, 0, 0.224),    0 3.7px 7.3px rgba(0, 0, 0, 0.277), 0 10px 20px rgba(0, 0, 0, 0.4);}

filter: blur 方法,給元素添加了一個 ::before 偽類設置 blur 方法並將其置於底層實現毛玻璃效果。

.glass-by-filter {  z-index: 1;  box-sizing: border-box;  position: relative;}.glass-by-filter::before {  content: "";  position: absolute;  top: 0; right: 0; bottom: 0; left: 0;  z-index: -1;  background: inherit;  filter: blur(10px);}

backdrop-filter: blur 直接在元素上添加 blur 方法實現毛玻璃效果。

.glass-by-backdrop-filter {  backdrop-filter: blur(10px);}

實現效果如下圖所示(左:filter、右:backdrop-filter):


【閱讀擴展】毛玻璃邊框效果:https://css-tricks.com/blurred-borders-in-css

藝術照!甚至可以實現簡易版 insatagram

復古、版畫、油畫、漫畫、液化、老照片、性冷淡、莫蘭迪、賽博朋克、旺達幻視風格通通都可以實現!

通過結合使用 filter 的所有方法,可以搭配出任意自己想要的效果。

以下是一個簡單的 filter 方法調節器,可以調整每個方法的值,同時實時展示圖片的濾鏡效果。如下圖所示。


頁面主要代碼如下,控制區 #imageEditor 是一個 form 表單,表單每一行分別控制一種filter方法的值,展示區 #imageContainer 內部包含一個 img 元素,產生的 filter 濾鏡作用在該元素上。

<form id="imageEditor">  <p>    <label for="gs">Grayscale</label>    <input id="gs" name="gs" type="range" min="0" max="100" value="0">  </p>  <p>    <label for="blur">Blur</label>    <input id="blur" name="blur" type="range" min="0" max="10" value="0">  </p>  <p>    <label for="br">Exposure</label>    <input id="br" name="br" type="range" min="0" max="200" value="100">  </p>  <p>    <label for="ct">Contrast</label>    <input id="ct" name="ct" type="range" min="0" max="200" value="100">  </p>  <p>    <label for="huer">Hue Rotate</label>    <input id="huer" name="huer" type="range" min="0" max="360" value="0">  </p>  <p>    <label for="opacity">Opacity</label>    <input id="opacity" name="opacity" type="range" min="0" max="100" value="100">  </p>  <p>    <label for="invert">Invert</label>    <input id="invert" name="invert" type="range" min="0" max="100" value="0">  </p>  <p>    <label for="saturate">Saturate</label>    <input id="saturate" name="saturate" type="range" min="0" max="500" value="100">  </p>  <p>    <label for="sepia">Sepia</label>    <input id="sepia" name="sepia" type="range" min="0" max="100" value="0">  </p>  <input type="reset" form="imageEditor" id="reset" value="Reset" /></form><div id="imageContainer">  <img src="futurama.png"></div>

function editImage() {  var gs = $("#gs").val();                  var blur = $("#blur").val();              var br = $("#br").val();                  var ct = $("#ct").val();                  var huer = $("#huer").val();              var opacity = $("#opacity").val();        var invert = $("#invert").val();          var saturate = $("#saturate").val();      var sepia = $("#sepia").val();            $("#imageContainer img").css(    "filter", 'grayscale(' + gs+    '%) blur(' + blur +    'px) brightness(' + br +    '%) contrast(' + ct +    '%) hue-rotate(' + huer +    'deg) opacity(' + opacity +    '%) invert(' + invert +    '%) saturate(' + saturate +    '%) sepia(' + sepia + '%)'  );  $("#imageContainer img").css(    "-webkit-filter", 'grayscale(' + gs+    '%) blur(' + blur +    'px) brightness(' + br +    '%) contrast(' + ct +    '%) hue-rotate(' + huer +    'deg) opacity(' + opacity +    '%) invert(' + invert +    '%) saturate(' + saturate +    '%) sepia(' + sepia + '%)'  );}$("input[type=range]").change(editImage).mousemove(editImage);

現在只是實現了濾鏡的實時預覽,後續待實現功能包括支持複雜的 svg 濾鏡模版、導出下載等,完成這些步驟,以後照片添加濾鏡再也不用下載其他 APP了。實例完整版代碼:https://codepen.io/dragonir/pen/abJmqxM

節省空間,提高網頁加載速度

實踐證明,同一圖片減小亮度和對比度及色相飽和度之後的體積與原圖相比,可以減小很大一部分體積空間 2M 左右的圖片經過弱化後保存,就可以壓縮到 1M 左右。

在網頁中我們可以使用經過 弱化 的圖片,然後通過 CSS filter 將其還原。這樣就可以達到壓縮資源體積,提升網頁加載速度、提高用戶體驗的目的。

具體操作可閱讀以下教程:

對比度交換技術:使用 CSS filter 提高圖像性能 https://css-tricks.com/contrast-swap-technique-improved-image-performance-css-filters

兼容性

從 caniuse 查詢結果可以看出,css filter 屬性在現代瀏覽器中的支持性已經很好了,除了 IE 瀏覽器之外,其他瀏覽器中大多可以正常使用,必要時可添加瀏覽器內核前綴。

但是官網也有以下3個issue 提示,相信後續隨著瀏覽器的升級,這些問題也會被逐步修復:

在 Safari 瀏覽器中,如果子元素具有動畫效果,則不會被應用濾鏡。

目前沒有瀏覽器支持 drop-shadow 濾鏡的 spread-radius 方法。

在 Edge 瀏覽器中如果元素或子元素被設置了 負值z-index,則無法應用濾鏡。


總結

本篇文章只是簡單列舉了幾種使用 CSS filter 常用的頁面效果,其實 filter 的每一種內置方法都可以有無限可能的擴展應用,如 invert 反轉色同樣也可以應用到 hover 效果上、調整網頁sepia 褐色值可以實現護眼效果等。

只要發揮想像力和創造力,filter 都可以在實踐中得到很好的應用。

以下一些例子就是很好的應用,大家有興趣可以拓展閱讀學習:

毛玻璃效果 https://codepen.io/KazuyoshiGoto/pen/nhstF
破碎玻璃效果 https://codepen.io/bajjy/pen/vwrKk
使用filter實現的hover效果 https://codepen.io/nxworld/details/ZYNOBZ
反色按鈕 https://codepen.io/monkey-company/pen/zZZvRp
老照片 https://codepen.io/dudleystorey/pen/pKoqa
高級版filter編輯器:https://codepen.io/stoumann/pen/MWeNmyb

最後附上一張用上面濾鏡編輯器調出來的 復古莫蘭迪色性冷淡油畫效果 濾鏡圖片。(哇塞,這也太哇塞了吧,CSS 絕絕子 yyds)


學習更多技能

請點擊下方公眾號

相關焦點

  • 細數 CSS filter 那些神奇用途
    或者很多網頁中有滑鼠 hover 懸浮到灰色元素上時變成彩色的樣式效果。此時就可以使用 filter 屬性的 grayscale 方法實現,它可以調整元素灰度,通過給頁面元素設置 filter: grayscale(100%) 就可將頁面元素置灰。以下示例中,body 標籤下有 h1 和 img 標籤,未添加 filter 樣式前如下所示。
  • 【第93期】CSS3 Filter的十種特效
    大家先來看個效果吧:我想光看上面的效果就能吸引你了,要是你自己動手的話,我想您更會感到神奇。細一看,這些效果就像是photoshop整出來的一樣,其實是真是這樣的,有很多效果都是類似於photoshop中的特效。不過有一點大家需要特別的注意:此處的CSS3 filter和css filter完全是兩樣東東。更不是我們一直說的IE濾鏡。具體所指的是什麼?
  • 【乾貨】css常用代碼大全
    css常見的快捷開發代碼匯總(長期更新),包括CSS3代碼,有一些css效果很頑固,經常會一時找不出解決方案,網絡上也有很多的工具和高手提供了具體的瀏覽器兼容代碼
  • CSS改變SVG顏色
    這樣項目裡會有兩個形狀一樣SVG,只是顏色不同,如果有很多圖標需要變色的效果,就會有很多兩個一樣的圖標,這樣做就很浪費,不是好的方案。那下面介紹一個用CSS3實現SVG切換顏色的方案:filter: drop-shadow(color x y)原理就是drop-shadow生成一個原圖的陰影,比如filter: drop-shadow(red 31px 0)生成距離原圖X軸31px的紅色陰影,然後transform: translateX(-31px)圖標整體向X軸偏移-31px,
  • 好玩的 CSS - 40 個有趣的 CSS 網站
    🌐 基礎學習cssreference.io/[1] CSS 參考書chokcoco.github.io/CSS-Inspira…[2] CSS 靈感www.awwwards.com/sites/zero-…[3] UI 設計師的靈感源泉
  • 深刻認識css中的陰影
    css中可以寫陰影的屬性有:字體陰影(text-shadow)、盒陰影(box-shadow)、陰影(filter:drop-shaddow)。不多bb,下面北冥帶大家一起來學習這些屬性的用法和要點。上面對陰影有了認識,下面就不再做過細的效果分解。
  • 使用 CSS 輕鬆構建高級感拉滿的磨砂玻璃漸變背景
    實現高斯模糊蒙版接下來,這一步最為關鍵,就是使用 backdrop-filter 實現高斯模糊蒙版。: blur(),而不是 filter: blur(),如果你對這兩個濾鏡是使用選擇還有所疑惑,可以看看的我的這篇文章講解 -- 深入探討 filter 與 backdrop-filter 的異同[2]藉助 CSS-doodle 工具,批量產生該效果簡單了解了原理之後,我們就可以藉助 CSS-doodle 嘗試批量來生成這個效果了。
  • 10個非常實用的CSS技巧
    CSS 有一些驚人的隱藏提示和技巧,可以用來改善你網站的外觀。在本文中,我們將介紹每個前端開發人員在開發出色且用戶友好的網頁時需要知道的一些很棒的 CSS 技巧。現在,就讓我們開始吧。1、首字下沉我們可以在 CSS 中實現首字下沉。它比看起來簡單得多。查看下面顯示的圖像和代碼片段。
  • 【CSS】1062- 49 個常用 CSS 樣式清單整理
    硬體加速在移動端尤其有用,因為它可以有效的減少資源的利用。目前主流瀏覽器會檢測到頁面中某個DOM元素應用了某些CSS規則時就會開啟,最顯著的特徵的元素的3D變換。44、CSS不同單位的運算css自己也能夠進行簡單的運算,主要是用到了calc這個函數。
  • 僅使用 HTML 和 CSS 實現毛玻璃效果(Glassmorphism)
    我很喜歡 Inter 字體,在 head 標籤中將其引入:<link rel="preconnect" href="https://fonts.gstatic.com"><link href="https://fonts.googleapis.com/css2?
  • 49個常用的CSS代碼片段,建議整理收藏
    硬體加速在移動端尤其有用,因為它可以有效的減少資源的利用。目前主流瀏覽器會檢測到頁面中某個DOM元素應用了某些CSS規則時就會開啟,最顯著的特徵的元素的3D變換。44、CSS不同單位的運算css自己也能夠進行簡單的運算,主要是用到了calc這個函數。
  • CSS高級特效的必備技巧
    我的標題上方有一個圓圈。我要做的是將文本與圓混合。: contrast(2);}注意,我添加了filter: contrast(2)來增加徽標的對比度。editors=1100著色圖像通過使用徑向梯度,有一些有趣的結果比有用。這個想法是添加一個彩色的圖像,使它與它混合。
  • CSS高級技巧:陰影效果
    點擊上方「web前端網頁設計」一鍵關注,更多網頁設計 UI設計 Html div css HTML5+CSS3、JavaScript
  • CSS魔法堂:Box-Shadow沒那麼簡單啦:)
    但有一點我們需要注意的,那就是模糊效果會擴大陰影的面積。@張鑫旭老師提到在模擬blur radius效果時,採用以下方案.ieBlock{    height:100px;    width:100px;    background:#000;    filter:progid:DXImageTransform.Microsoft.Blur(pixelradius=10);
  • 兩行CSS實現毛玻璃效果
    backdrop-filter: url(commonfilters.svg#filter);/* <filter-function> 濾鏡函數值 */backdrop-filter: blur(2px);backdrop-filter: brightness(60%);backdrop-filter: contrast(40%);backdrop-filter
  • 聊聊純 CSS 圖標
    現有方案有個名為 `css.gg`[8] 的純 CSS 圖標解決方案,它完全通過偽元素(::before,::after)來構建圖標。使用這種方案意味著你需要對 CSS 工作原理有深刻的理解,但同時也很難創造更為複雜的圖標(只有3個元素可以使用)。
  • 前端常用的CSS代碼
    line-height: 1.0em; color: #333; }10、清除浮動.clearfix:before, .container:after { content: ""; display: table; }.clearfix:after { clear: both; }.clearfix { zoom: 1; }11、css
  • 八個CSS函數的小技巧
    然後你就可以在你的CSS文件中添加以下的代碼通過attr()函數來顯示提示文字:相當簡單對吧?當然實際上我們還需要更多的代碼來給提示增加樣式,但是不用擔心,已經有了為此設計的強大且純粹的叫Hint.css的CSS庫和Balloon.css。
  • 用Filter巧妙實現內凹的平滑圓角
    是因為我們又要運用 filter: contrast() 和 filter: blur() 這對神奇的組合。: white,給 .g-filter 添加了 filter: blur(10px)。神奇的事情發生了,我們得到了這樣一個效果:
  • CSS入門筆記 - 初識CSS
    </p style="color:red">並且css樣式代碼要寫在style=""雙引號中,如果有多條css樣式代碼設置可以寫在一起,中間用分號隔開。如下代碼:<p style="color:red;font-size:12px">這裡文字是紅色。