成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

傻傻分不清楚?深入探討 Filter 與Backdrop-filter 的異同

開發 前端
本文將深入探討在 CSS 中兩個非常類似的屬性 -- filter 和 backdrop-filter。它們都能完成某些濾鏡功能,但是它們肯定也存在差異。那么,為什么在 CSS 中有了 filter 還誕生了 backdrop-filter 了?

[[442715]]

本文將深入探討在 CSS 中兩個非常類似的屬性 -- filter 和 backdrop-filter。它們都能完成某些濾鏡功能,但是它們肯定也存在差異。那么,為什么在 CSS 中有了 filter 還誕生了 backdrop-filter 了?

帶著這個疑問,開始今天的正文。

filter VS backdrop-filter

在 CSS 中,有兩個和濾鏡相關的屬性 -- filter 和 backdrop-filter。

backdrop-filter[1] 是更為新的規范推出的新屬性,可以點擊查看 Filter Effects Module Level 2。

  • filter:該屬性將模糊或顏色偏移等圖形效果應用于元素。
  • backdrop-filter:該屬性可以讓你為一個元素后面區域添加圖形效果(如模糊或顏色偏移)。它適用于元素背后的所有元素,為了看到效果,必須使元素或其背景至少部分透明。

注意兩者之間的差異,filter 是作用于元素本身,而 backdrop-filter 是作用于元素背后的區域所覆蓋的所有元素。

它們所支持的濾鏡種類:

可以看到,兩者所支持的濾鏡種類是一模一樣的。

也就是說,它們必然存在諸多差異,下面就讓我們逐一探討。

作用對象的差異

backdrop-filter 最常用的功能,就是用于實現毛玻璃效果。

我們通過實現毛玻璃效果來理解 filter 和 backdrop-filter 使用上的一些差異。

在 backdrop-filter 沒有誕生前,我們想實現這樣一個毛玻璃效果,是比較困難的:

 

有了它,實現毛玻璃效果就非常 Easy 了,看這樣一段代碼:

  1. <div class="bg"
  2.     <div>Normal</div> 
  3.     <div class="g-filter">filter</div> 
  4.     <div class="g-backdrop-filter">backdrop-filter</div> 
  5. </div> 
  1. .bg { 
  2.     background: url(image.png); 
  3.      
  4.     & > div { 
  5.         width: 300px; 
  6.         height: 200px; 
  7.         background: rgba(255, 255, 255, .7); 
  8.     } 
  9.     .g-filter { 
  10.         filter: blur(6px); 
  11.     } 
  12.     .g-backdrop-filter { 
  13.         backdrop-filter: blur(6px); 
  14.     } 

CodePen Demo -- filter 與 backdrop-filter 對比[2]

filter 和 backdrop-filter 使用上最明顯的差異在于:

  • filter 作用于當前元素,并且它的后代元素也會繼承這個屬性
  • backdrop-filter 作用于元素背后的所有元素

仔細區分理解,一個是當前元素和它的后代元素,一個是元素背后的所有元素。

理解了這個,就能夠明白為什么有了 filter,還會有 backdrop-filter。

效果上的差異

下面來看一些實際使用上,效果的差異。

譬如,我們想實現這樣一個圖片的蒙版 Hover 效果:

[[442717]]

使用 backdrop-filter 可以輕松的勝任,因為它就是用于產生蒙版,作用于蒙版背后的元素,其核心偽代碼如下:

  1. <div></div> 
  1. div { 
  2.     position: relative
  3.     background: url(https://www.wptunnel.com/wp-content/uploads/2021/07/wptunnel-hd-beautiful-wallpaper-4.jpg); 
  4.  
  5. div::before { 
  6.     content: ""
  7.     position: absolute
  8.     top: 0; 
  9.     left: 0; 
  10.     bottom: 0; 
  11.     right: 0; 
  12.     backdrop-filter: grayscale(100%); 
  13.     transition: .3s transform; 
  14.  
  15. div:hover::before { 
  16.     transform: translate(100%, 0); 

思考如果使用 filter,如何實現上述的效果呢?比較麻煩,因為 filter 是作用于元素上的,所以,它只能是實現類似于這樣的 Hover 效果:

[[442718]]

上述兩個效果 DEMO:CodePen -- filter VS backdrop-filter[3]

核心代碼:

  1. div { 
  2.     filter: grayscale(100%); 
  3.     transition: .3s filter; 
  4. div:hover { 
  5.     filter: grayscale(0); 

通過這個例子,應該可以更好的理解它們之間的差異。

性能的差異

最早想寫這篇文章的初衷,是因為認為 filter 和 backdrop-filter 可能實際存在性能上的差異。

但是隨著我使用多個 DEMO 驗證, 利用 filter 和 backdrop-filter 實現相同的動畫效果,獲取在動畫期間的頁面的幀率變化。

除了 Chrome 自帶的頁面幀率控制面板,還有一種利用 rAF 近似計算頁面幀率的方案,可以戳這里 -- Web 動畫幀率(FPS)計算[4]

實際對比之后,發現其實兩者并無多大性能上的差異。(當然,也可能是我的實驗不夠嚴謹。歡迎有更為準確的數據的同學指出)。

因此,如果利用 filter 和 backdrop-filter 都可以實現同一個效果,僅僅是性能這個角度,兩者在性能上其實不會有多大差異,二者選其一即可。

Backdrop Root

接下來這一點很有意思。有必要再好好講一講。

當然,這一點 filter 和 backdrop-filter 都一樣,那就是作用了 filter 和 backdrop-filter 的元素(值不為 none),都會生成 Backdrop Root。

什么是 Backdrop Root 呢?(規范戳我 -- CSS 草案 -- Backdrop Root[5])也就是我們常說的,生成了自己的堆疊上下文(Stacking Context)。

我們直接來看,它會造成什么問題:

生成了 Backdrop Root 的元素會使 CSS 3D 失效

我之前寫過一個 3D 球的旋轉動畫,大概是這樣:

這個 Demo 你可以戳這里:CodePen Demo - 3D ball[6]:

然而,如果我們給上述動畫的容器,添加一個 filter 或者 backdrop-filter:

  1.     filter: blur(1px); 

整個 3D 動畫就會坍縮為 2D 動畫:

更為具體的探討,你可以看看我的這篇文章 -- 探究 CSS 混合模式\濾鏡導致 CSS 3D 失效問題[7]

作用了 filter 和 backdrop-filter 的元素會使內部的 fixed 定位失效

另外這個問題也是比較常見的問題。

我們都知道,CSS 中 position: fixed 是相對于屏幕視口進行定位的。

然而,作用了 filter 和 backdrop-filter 的元素的元素會使得其內部的 position: fixed 元素不再相對于屏幕視口進行定位,而是相對這個 Backdrop Root 元素進行定位,其表現就是 position: fixed 定位的元素退化為了 position: absolute。

當然,除了 filter 和 backdrop-filter 之外,在 CSS 中目前一共有 7 種方式可以讓元素內部的 position: fixed 基于該元素定位:

  1. transform 屬性值不為 none 的元素
  2. 設置了 transform-style: preserve-3d 的元素
  3. perspective 值不為 none 的元素
  4. 在 will-change 中指定了任意 CSS 屬性
  5. 設置了 contain: paint
  6. filter 值不為 none 的元素
  7. backdrop-filter 值不為 none的元素

更為具體的探討,你可以看看我的這篇文章 -- fixed 定位失效 | 不受控制的 position:fixed[8]

兼容性的差異

最后,我們再來看看兼容性方面的差異。

到今天,不考慮 IE,filter 的兼容其實已經非常非常的好了(2021-12-27):

而 dropback-filter 則一直沒得到 Firefox 系列的支持:

因此,Firefox 的跟進支持一直是阻礙 dropback-filter 在生產環境使用最重要的一環。僅僅從兼容性角度考慮,使用它倆都能實現的效果我們應該盡可能的選擇 filter。

最后

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

參考資料

[1]backdrop-filter:

https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty

[2]CodePen Demo -- filter 與 backdrop-filter 對比:

https://codepen.io/Chokcoco/pen/WNjebrr

[3]CodePen -- filter VS backdrop-filter:

https://codepen.io/Chokcoco/pen/VwzQYRV

[4]Web 動畫幀率(FPS)計算:

https://github.com/chokcoco/cnblogsArticle/issues/17

[5]CSS 草案 -- Backdrop Root:

https://drafts.fxtf.org/filter-effects-2/#BackdropRoot

[6]CodePen Demo - 3D ball:

https://codepen.io/Chokcoco/pen/JwdvmJ

[7]探究 CSS 混合模式\濾鏡導致 CSS 3D 失效問題:

https://github.com/chokcoco/iCSS/issues/41

[8]fixed 定位失效 | 不受控制的 position:fixed:

https://github.com/chokcoco/iCSS/issues/24

 

責任編輯:姜華 來源: iCSS前端趣聞
相關推薦

2021-03-10 08:56:37

Zookeeper

2024-02-29 09:08:56

Encoding算法加密

2022-05-15 21:52:04

typeTypeScriptinterface

2021-07-27 07:31:16

JavaArrayList數組

2021-11-09 06:01:35

前端JITAOT

2018-12-17 12:30:05

Kubernetes存儲存儲卷

2020-10-30 08:20:04

SD卡TF卡存儲

2018-05-22 16:24:20

HashMapJavaJDK

2024-11-04 00:00:03

viewportDOMSPA

2025-05-12 08:40:00

前端監控DOM

2023-09-03 21:18:07

Python編程語言

2020-03-03 17:35:09

Full GCMinor

2023-02-27 15:46:19

數據元元數據

2016-11-04 12:51:46

Unix網絡IO 模型

2022-02-25 09:14:33

類變量共享實例變量

2021-02-08 23:47:51

文件存儲塊存儲對象存儲

2020-11-11 07:32:18

MySQL InnoDB 存儲

2023-04-11 15:57:49

JavaScriptCSSHTML

2021-01-13 08:10:26

接口IEnumeratorIEnumerable

2021-02-14 22:33:23

Java字符字段
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品黄色 | 黄色片在线观看网址 | 国产精品免费一区二区 | 在线中文视频 | 巨大荫蒂视频欧美另类大 | 亚洲精品久久久久久久不卡四虎 | 欧美国产精品 | 毛片一级片| 日本黄色大片免费 | 午夜精品| 欧美一区在线视频 | 久久久精品 | 国产一区二区三区免费观看在线 | 国产日产精品一区二区三区四区 | 永久看片 | 91精品久久久久久综合五月天 | 久久久久久精 | 美女久久 | 婷婷综合五月天 | 国产精品乱码一区二区三区 | 91国产视频在线观看 | 日韩在线小视频 | 欧美日韩在线免费 | 久久久久久亚洲 | 精品国产乱码久久久久久影片 | 精品国产乱码久久久久久蜜柚 | 国产精品久久久久久久久久久免费看 | 影音先锋成人资源 | 国产一区二区在线看 | 亚洲欧美日韩一区二区 | 国产精品视频导航 | 亚洲91精品 | 一区二区三区视频在线观看 | 日本在线综合 | www.日韩av.com | 日韩乱码av| 欧美 视频 | 国产999精品久久久久久 | 男女网站视频 | 国产区免费视频 | 国产精品久久亚洲7777 |