CSS 玻璃效果是半透明背景、backdrop-filter 模糊以及細微的高光邊框三者的結合,能讓面板後方的內容以柔和、失焦的方式透出來。背景模糊以像素為單位,必須是非負的長度值;填充透明度以介於 0 到 1 之間的 alpha 值表示;而 1 像素的高光邊框則疊加在最上方,使面板呈現為一個明確的平面,而非版面中的破洞。這三個數值各自獨立變動:提高模糊會增加渲染成本,卻不會改變不透明度;降低 alpha 會讓背景透出更多,卻不會改變銳利度;提高邊框不透明度則會讓面板邊緣更銳利,卻不會改變其後方的內容。Glassmorphism 因此最常在這三個屬性中有一個不適合當下情境時失敗——例如填充變成完全不透明、模糊是在沒有可濾鏡像素的純色背景上做判斷,或是父層的堆疊上下文封閉了背景根。必須同時針對最終背景調整這三項,才能確定面板在實際環境中是否能正確呈現。

實際控制 CSS 玻璃效果的三個數值
有四個屬性決定面板的外觀與渲染方式。半透明填充是背景色彩的 alpha 通道——通常以 rgba() 撰寫,在一般 UI 面板中 alpha 約介於 0.15 到 0.40 之間。backdrop-filter 屬性帶有一個以像素為單位的 blur() 長度,桌面 UI 的實際數值大約落在 6 到 24 之間。高光邊框則是一像素的邊框,其顏色由白色衍生並帶有自己的不透明度,因此無論背景偏暗或偏亮都能保持清晰。border-radius 則獨立於其他三者,單獨控制圓角。
這些輸入之所以刻意設定得這麼窄,是因為每個數值都有實質的物理意義。模糊是一個非負的像素長度——在濾鏡語法中負值是無效的。Alpha 是介於 0 到 1 之間的比率。邊框不透明度則是獨立計算的,因為一抹淡淡的光亮邊緣有助於區隔面板與其後的素材,若將其與填充 alpha 混為一談,那條邊緣就無法單獨調整。色彩本身會在套用 alpha 之前先拆成紅、綠、藍三個通道,這也是為什麼像 #3b82f6 這種六位數十六進位值,最終在規則中會變成類似 rgba(59, 130, 246, 0.25) 的形式。
一個常見的錯誤是以為一個「透明度」數值就能涵蓋一切。實際上並非如此。填充 alpha、邊框不透明度,以及背景透出的程度,是三個獨立的決策,只調整其中一個,往往會讓面板看起來要嘛消失不見,要嘛顯得混濁不清。
如何使用產生器打造 CSS 玻璃效果
一個可控的方式來產生這條規則,是使用 CSS Glassmorphism 產生器。每個輸入都會經過驗證,預覽是繪製在彩色背景上而非純色平面,而同樣的計算數值會被寫入你所複製的 CSS 中。
- 挑選玻璃顏色與半透明填充不透明度。從接近 20% 開始,並對著實際頁面背景調整,而非對著工具的預覽調整。
- 設定背景模糊、高光邊框不透明度與圓角。從接近 8 到 16 像素的模糊開始,搭配約 0.25 到 0.50 的淡白色邊框。
- 在內建的彩色背景上檢視面板。若模糊看起來正確,再複製規則。
- 將規則貼入實際元件中,保持填充透明,並在真正的背景圖片、漸層或媒體上驗證面板呈現。
產生器的預覽之所以重要,是因為它將面板置於彩色表面上——絕非純色平面。這個細節能抓出最常見的隱性失敗:在純白或透明的預覽上判斷模糊,而瀏覽器根本沒有可濾鏡的內容。
為什麼 CSS 玻璃效果有時看起來像隱形
模糊其實有套用,但面板看起來就像一塊平面矩形。以下表格列出最常見的原因。
| 症狀 | 可能原因 | 修正方式 |
|---|---|---|
| 面板看起來不透明,看不到模糊 | 背景完全不透明或 alpha 為 1 | 將 alpha 降低到大約 0.15–0.40 |
| 模糊在實際環境中看起來「不對」 | 背景根被父層屬性封閉 | 移動面板或移除造成隔離的父層 |
| 瀏覽器忽略該規則 | 引擎僅實作了 -webkit- 前綴 | 在標準屬性之外保留 WebKit fallback |
| 邊緣看不見 | 邊框不透明度與背景亮度過於接近 | 提高邊框不透明度,或將邊框偏向白色 |
| 規則中出現負值 | 濾鏡語法不接受負值的模糊 | 複製前先將模糊限制在零或以上 |
Glassmorphism 依賴透明度。完全不透光的填充面板沒有任何東西能讓 backdrop-filter 作用,即便模糊值有效,也會看起來毫無效果,因為取樣區域是空的。同樣的邏輯也適用於面板正好位於頁面空白區域的情況:規則本身是正確的,但缺乏視覺訊號來驗證它是否真的有效。
某些瀏覽器版本仍然需要 WebKit 前綴的 fallback,因此任何實際環境使用的規則都應該依瀏覽器期望的順序同時包含兩種宣告。
背景根與堆疊上下文的陷阱
backdrop-filter 屬性影響的是繪製在元素背後的像素,而非元素自身的子元素。「背後」的範圍由背景根決定,而背景根通常是沒有套用任何會建立堆疊上下文屬性的最近祖先。以下幾個常見的屬性都可能在中途改變該根:
- opacity 小於 1
- 任何 filter,包括套用在父層的 blur()
- 父層上的 mask 或 clip-path
- 非 normal 的 mix-blend-mode
- isolation: isolate
- will-change 的某些值,包括 transform 與 filter
一條在產生器中看起來正確的規則,到了複雜的父層中可能會看起來不同,因為取樣區域可能突然比預期更小。backdrop-filter 行為的參考來源是 MDN 上的 backdrop-filter 文件,其中詳細記錄了這些互動關係。W3C Filter Effects Level 1 規格則定義了濾鏡函式參數的底層語法。
正確的做法不是為了補償而把模糊調高。當效果消失時,應先檢查透明度與背景根的界線。只有在掌握實際版面的證據後,才能調高模糊值。
無障礙、對比與 fallback 背景
玻璃面板並不會自動變得可閱讀。雜亂的影像在模糊後仍可能部分可見,而淡色邊框也無法保證內文在所有可能的背景上都達到可用的對比比值。誠實來說,glassmorphism 並不保證文字的可讀性——必須針對使用者可能遇到的所有背景來驗證對比。
這意味著幾項具體的習慣:
- 為不支援 backdrop-filter 的瀏覽器、偏好降低透明度的使用者,以及面板位於無法預期之影像上的環境,加入實心或更不透明的 fallback 背景。
- 避免在多變的影像上放置長篇內文。卡片、標題與短標籤適合;段落則不適合。
- 為面板中任何可互動的內容提供內邊距、合理的最大寬度,以及可見的焦點指示器,因為半透明表面可能會吞掉瀏覽器原生的焦點框。
- 在 forced-colors 模式與 prefers-reduced-transparency 下進行測試。兩者都可能完全覆寫面板的外觀。
Fallback 不需要做得很花俏。在 rgba 規則之上再加上一個背景宣告,使用一個能逼近背景可見平均色的純色,通常就足以在無法進行背景濾鏡時維持文字可讀性。
大面積模糊表面的效能成本
背景模糊會帶來實質的渲染成本,尤其是在大面積、播放中的影片,或多層嵌套的濾鏡上。每當面板後方的任何內容變動,濾鏡區域就會重新計算,因此一張覆蓋整個播放中影片的 100-vh 模糊底圖,會比一張放在靜態漸層上的 200 像素卡片明顯昂貴得多。
請將濾鏡區域控制在合理範圍內,在具代表性的行動裝置硬體上量測效能,並記得較大的模糊數值未必代表更好的效果。多數 UI 面板在 8 到 16 像素的模糊範圍內,搭配 15% 到 30% 的填充不透明度,就能呈現恰當的外觀。針對最終背景進行調整,而非對著工具預覽調整;若版面本身已經很重,寧可選擇更俐落的幾何形狀,也不要堆疊更大的模糊。
若想深入了解同一個工具的設計決策,Create Glassmorphism Effects in CSS with a Visual Generator 這份指南更詳細地說明了背後的視覺邏輯,而 CSS Glassmorphism 產生器本身則會驗證四項核心輸入,並同時輸出標準與 WebKit 兩種宣告,使你複製的規則能直接套用於實際版面。
若你正在多方比較,CSS Glassmorphism Generator Alternative Without Upload 對此有深入的介紹。