搜尋
首頁web前端css教學利用CSS如何達到全相容的毛玻璃效果? (代碼詳解)

本篇文章帶大家了解CS​​S backdrop-filter屬性,看看該屬性的兼容性,介紹如何實現全兼容毛玻璃效果。

利用CSS如何達到全相容的毛玻璃效果? (代碼詳解)

透過本文,你能了解到

  • #最基本的使用CSS backdrop-filter 實現磨砂玻璃(毛玻璃)的效果

  • 在至今不相容backdrop-filter 的firefox 瀏覽器,如何利用一些技巧性的操作,巧妙的同樣實現毛玻璃效果,讓這個效果真正能運用在業務當中

什麼是backdrop-filter

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

backdrop-filterfilter 非常類似,可以取的值都是一樣的,但是一個是作用於整個元素,一個是只作用於元素後面的區域。

backdrop-filterfilter 比較

我們使用backdrop-filterfilter 同時實現一個毛玻璃效果作為對比,偽代碼如下:

<div class="bg">
    <div>Normal</div>
    <div class="g-filter">filter</div>
    <div class="g-backdrop-filter">backdrop-filter</div>
</div>
.bg {
    background: url(image.png);
    
    & > div {
        width: 300px;
        height: 200px;
        background: rgba(255, 255, 255, .7);
    }
    .g-filter {
        filter: blur(6px);
    }
    .g-backdrop-filter {
        backdrop-filter: blur(6px);
    }
}

利用CSS如何達到全相容的毛玻璃效果? (代碼詳解)

CodePen Demo -- filter 與backdrop-filter 對比

#網址:https://codepen.io/Chokcoco/pen/WNjebrr

backdrop-filter 之前,想實現上述的只給元素背景添加濾鏡效果還是非常困難的,而且,對於靜態畫面還好,如果背景還是可以滾動的動態背景,通常CSS 是無能為力的。

backdrop-filter 正是為了在元素後的內容中添加濾鏡而不影響元素本身而誕生的。使用它可以非常方便的實現磨砂玻璃效果(毛玻璃)!

backdrop-filter 的兼容性

backdrop-filter 其實已經誕生挺久了,然而,firefox 至今都不相容它!

利用CSS如何達到全相容的毛玻璃效果? (代碼詳解)

對於部分已經放棄了IE 的PC 端業務而言,firefox 還是需要相容的,想要讓使用backdrop-filter 實現毛玻璃效果應用落地,firefox 的兼容問題必須解決。

在firefox 中實現毛玻璃效果

OK,本文的重點是如何在firefox 中,不使用backdrop-filter 而盡可能的還原毛玻璃的效果。

先來看看,如果是正常使用 backdrop-filter,還是上述的例子效果如下,是沒有毛玻璃效果的:

利用CSS如何達到全相容的毛玻璃效果? (代碼詳解)

使用background-attachment: fixed 相容靜態背景圖

如果在firefox 上想使用毛玻璃效果。應用毛玻璃元素的背景只是一張靜態背景圖,其實方法是有很多的。

我們只需在元素的背後,疊加一張相同的圖片,利用background-attachment: fixed 將疊加在元素下面的圖片定位到與背景相同的座標,再使用filter: blur() 對其進行模糊處理即可。

偽代碼如下:

<div class="g-glossy">frosted glass effect </div>
$img: &#39;https://static.pexels.com/photos/373934/pexels-photo-373934.jpeg&#39;;

body {
    height: 100vh;
    display: flex;
    background-image: url($img);
    background-repeat: no-repeat;
    background-attachment: fixed;
    background-size: cover;
}

.g-glossy {
    position: relative;
    width: 600px;
    height: 300px;
    background-color: rgba(255, 255, 255, 0.5);
    overflow: hidden;
    z-index: 10;
    
    &::before {
        content: "";
        position: absolute;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        background-image: url($img);
        background-repeat: no-repeat;
        background-attachment: fixed;
        background-size: cover;
        filter: blur(10px);
        z-index: -1;
    }
}

效果如下:

利用CSS如何達到全相容的毛玻璃效果? (代碼詳解)

此方法也是在沒有backdrop-filter 之前,在各個瀏覽器想實現簡單毛玻璃效果最常用的方法之一。

CodePen Demo -- 使用background-attachment: fixed | filter: bulr() 實現毛玻璃效果

#位址:https://codepen.io/Chokcoco/pen/XWRrVma

使用background-attachment: fixed 相容靜態背景圖的缺點

不過這種方法也有兩個缺點:

##1、由於使用了偽元素疊加了一層背景,因為層級關係,父元素的background 是在最下層的,所以元素本身的背景色其實並沒有被充分體現,可以對比下兩種方法的實際效果圖:

利用CSS如何達到全相容的毛玻璃效果? (代碼詳解)

解決方案是再透過另一個偽元素再疊加一層背景色,這個背景色應該是原本賦值給父元素本身的。

疊加之後的效果如下:

利用CSS如何達到全相容的毛玻璃效果? (代碼詳解)#

CodePen Demo -- 使用 background-attachment: fixed | filter: bulr() 实现毛玻璃效果优化

地址:https://codepen.io/Chokcoco/pen/abWbzKG

2、上述效果已经非常接近了,硬要挑刺的话,就是应用了模糊滤镜的伪元素的边缘有白边瑕疵,这一点其实是滤镜本身的问题,也非常好解决,我们只需要将伪元素的范围扩大一点即可:

.g-glossy {
    overflow: hidden;
    ....
    &::before {
        content: "";
        position: absolute;
        top: -100px;
        left: -100px;
        right: -100px;
        bottom: -100px;
    }
}

定位的代码由 top: 0px; 改为 top: -100px,四个方位都是如此即可。如此一来,就能做到基本上是百分百的模拟。

使用 moz-element() 配合 filter: blur() 实现复杂背景毛玻璃效果

下面这种方法就非常巧妙了,正常而言,运用毛玻璃效果的背景元素,都不是一张图片那么简单!背后通常都是整个页面复杂的结构,多层 DOM 的嵌套。

那么通过叠加一张简单的图片,就无法奏效了,我们得想办法模拟整个 DOM 元素。

而恰好,在 Firefox 中,有这么一个属性 -- -moz-element()

何为 -moz-element()MDN-element) 的解释是,CSS 函数 element() 定义了一个从任意的 HTML 元素中生成的图像 <image></image> 值。该图像值是实时的,这意味着如果被指定的 HTML 元素被更改,应用了该属性的元素的背景也会相应更改。

它其实是个草案规范,但是一直以来,只有 Firefox 支持它 -- CAN I USE -- CSS element()

利用CSS如何達到全相容的毛玻璃效果? (代碼詳解)

它有什么作用呢?

-moz-element() 如何使用

那么 -moz-element() 如何使用呢?简而言之,它能够复制一个元素内部渲染出来的 UI,并且能够实时同步变化。

假设我们有这样一个简单的结构,元素背景和内容都在运动:

<div id="bg" class="g-normal">
    <p>Content</p>
</div>
.g-normal {
    margin: auto;
    width: 200px;
    height: 200px;
    animation: change 5s infinite;
    background: linear-gradient(deeppink, yellowgreen);
}

p {
    animation: move 5s infinite;
}

@keyframes change {
    0% {
        filter: hue-rotate(0);
    }
    100% {
        filter: hue-rotate(360deg);
    }
}

@keyframes move {
    0% {
        transform: translate(0, 0);
    }
    100% {
        transform: translate(150px, 150px);
    }
}

它的效果大概是这样:

利用CSS如何達到全相容的毛玻璃效果? (代碼詳解)

我们就假设这个结构就是我们页面某一块的内容,然后,我们就可以使用 background: -moz-element(#id) 这种方式,将这个元素内绘制的 UI 内容完全拷贝至另外一个元素,看看效果。

我们添加一个元素 <div class="g-element-copy"></div>,在这个元素内模拟 #bg 内的内容:

<div id="bg" class="g-normal">
    <p>Content</p>
</div>
<div class="g-element-copy"></div>
.g-element-copy {
    margin: auto;
    width: 200px;
    height: 200px;
    // 核心代码
    background: -moz-element(#bg);
}

它可以完全复制另外一个元素内绘制出来的 UI,并且能追踪实时变化:

利用CSS如何達到全相容的毛玻璃效果? (代碼詳解)

CodePen Demo -- -moz-element Demo(Firefox Only)

地址:https://codepen.io/Chokcoco/pen/jOmOPPL

在 firefox 中使用 element 复制 UI,用作毛玻璃元素背景

这样,有了上面的铺垫,下面的内容就比较好理解了。

和上述的 background-attachment: fixed 方案对比,我们还是通过伪元素叠加一层背景,只不过背景内的内容由单纯一张图片,变成了由 -moz-element() 复制的整段 UI 内容。

其次,上面的方案我们使用 background-attachment: fixed 使背景图和伪元素内叠加的图片的位置对齐,在这里,我们需要借助 Javascript 进行简单的运算,确定背景内容元素的相关位置,计算对齐量。

来看这样一个 DEMO:

模拟真实 DOM
模拟真实 DOM
模拟真实 DOM
模拟真实 DOM
模拟真实 DOM
模拟真实 DOM
模拟真实 DOM
模拟真实 DOM
模拟真实 DOM
<div class="g-glossy">frosted glass effect </div>

其中,.g-glossy 是在正常情况下 backdrop-filter 兼容时,我们的毛玻璃元素,而 .g-glossy-firefox 则是不兼容 backdrop-filter 时,我们需要模拟整个 DOM 背景 UI时候的元素,可以通过 CSS 特性检测 CSS @support 进行控制:

核心 CSS 代码:

.bg {
    // 整个页面的 DOM 结构
}

.g-glossy {
    position: fixed;
    width: 600px;
    height: 300px;
    background-color: rgba(255, 255, 255, 0.5);
    backdrop-filter: blur(10px);
}

.g-glossy-firefox {
    display: none;
}

@supports (background: -moz-element(#bg)) {
    .g-glossy-firefox {
        display: block;
        position: fixed;
        width: 600px;
        height: 300px;
        background: -moz-element(#bg) no-repeat;
        filter: blur(10px);
    }
}

简单解读一下:

  • 对于兼容 backdrop-filter 的,.g-glossy 内的代码将直接生效,并且 .g-glossy-firefox 不会展示

  • 对于 Firefox 浏览器,因为 backdrop-filter 必然不兼容,所以 .g-glossy 内的 backdrop-filter: blur(10px) 不会生效,而 @supports (background: -moz-element(#bg)) 内的样式会生效,此时 .g-glossy-firefox 将会利用 background: -moz-element(#bg) no-repeat; 模拟 id 为 bg 的元素

当然,这里我们需要借助一定的 JavaScript 代码,计算我们的模拟页面 UI 的元素 .g-glossy-firefox 相对它模拟的 #bg 元素,也就是页面布局的一个定位偏差:

$(function() {
        let blur = $(&#39;.g-glossy-firefox&#39;)[0].style;
        let offset = $(&#39;.g-glossy&#39;).eq(0).offset();

        function updateBlur() {
            blur.backgroundPosition = 
                `${-window.scrollX - offset.left}px ` + 
                `${-window.scrollY - offset.top}px`;
        }
        document.addEventListener(&#39;scroll&#39;, updateBlur, false), updateBlur();
});

OK,至此,我们就能完美的在 Firefox 上也实现毛玻璃的效果了:

利用CSS如何達到全相容的毛玻璃效果? (代碼詳解)

它相对于上面的第一种方案而言,最大的不同之处在于,它可以模拟各式各样的背景元素,背景元素可以不仅仅只是一张图片!它可以是各种复杂的结构!

这种方案是我的 CSS 群中,风海流 同学提供的一种思路,非常的巧妙,并且,他自己也对这种方案进行了完整的阐述,你可以戳这里看看:在网页中实现标题栏「毛玻璃」效果,本文也是经过他的同意,重新整理发出。

上述效果的完整代码,你可以戳这里:

CodePen Demo -- 兼容 Firefox 的复杂背景毛玻璃(磨砂玻璃)效果

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

总结一下

简单对上述内容进行一个总结:

  • 你可以使用 backdrop-filter 对兼容它的浏览器非常简单的实现毛玻璃(磨砂玻璃)效果
  • 对于不兼容 backdrop-filter 的浏览器,如果它只是简单背景,可以使用 background-attachment: fixed 配合 filter: blur() 进行模拟
  • 对于 firefox 浏览器,你还可以使用 moz-element() 配合 filter: blur() 实现复杂背景毛玻璃效果
  • 对于不兼容的上述 3 种效果的其他浏览器,设置了毛玻璃效果的元素,可以通过设置类似 background: rgba(255, 255, 255, 0.5) 的样式,使之回退到半透明效果,也算一种非常合理的降级效果,不会引起 Bug

原文地址:https://segmentfault.com/a/1190000040263452

作者:ChokCoco

更多编程相关知识,请访问:编程视频!!

以上是利用CSS如何達到全相容的毛玻璃效果? (代碼詳解)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:segmentfault--ChokCoco。如有侵權,請聯絡admin@php.cn刪除
丟失的CSS技巧cohost.org丟失的CSS技巧cohost.orgApr 25, 2025 am 09:51 AM

在這篇文章中,布萊克·莫里(Blackle Mori)向您展示了一些駭客,同時試圖推動同位HTML支持的極限。如果您敢於使用這些,以免您也被標記為CSS罪犯。

光標的下一個CSS樣式光標的下一個CSS樣式Apr 23, 2025 am 11:04 AM

具有CSS的自定義光標很棒,但是我們可以將JavaScript提升到一個新的水平。使用JavaScript,我們可以在光標狀態之間過渡,將動態文本放置在光標中,應用複雜的動畫並應用過濾器。

世界碰撞:使用樣式查詢的鑰匙幀碰撞檢測世界碰撞:使用樣式查詢的鑰匙幀碰撞檢測Apr 23, 2025 am 10:42 AM

互動CSS動畫和元素相互啟動的元素在2025年似乎更合理。雖然不需要在CSS中實施乒乓球,但CSS的靈活性和力量的增加,可以懷疑Lee&Aver Lee有一天會成為一種

使用CSS背景過濾器進行UI效果使用CSS背景過濾器進行UI效果Apr 23, 2025 am 10:20 AM

有關利用CSS背景濾波器屬性來樣式用戶界面的提示和技巧。您將學習如何在多個元素之間進行背景過濾器,並將它們與其他CSS圖形效果集成在一起以創建精心設計的設計。

微笑嗎?微笑嗎?Apr 23, 2025 am 09:57 AM

好吧,事實證明,SVG的內置動畫功能從未按計劃進行棄用。當然,CSS和JavaScript具有承載負載的能力,但是很高興知道Smil並沒有像以前那樣死在水中

'漂亮”在情人眼中'漂亮”在情人眼中Apr 23, 2025 am 09:40 AM

是的,讓#039;跳上文字包裝:Safari Technology Preview In Pretty Landing!但是請注意,它與在鉻瀏覽器中的工作方式不同。

CSS-tricks編年史XLIIICSS-tricks編年史XLIIIApr 23, 2025 am 09:35 AM

此CSS-tricks更新了,重點介紹了年鑑,最近的播客出現,新的CSS計數器指南以及增加了幾位新作者,這些新作者貢獻了有價值的內容。

tailwind的@Apply功能比聽起來更好tailwind的@Apply功能比聽起來更好Apr 23, 2025 am 09:23 AM

在大多數情況下,人們展示了@Apply的@Apply功能,其中包括Tailwind的單個property實用程序之一(會改變單個CSS聲明)。當以這種方式展示時,@Apply聽起來似乎很有希望。如此明顯

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中