CSS 的層疊新秩序:了解 @layer
為什麼需要 @layer?
在 CSS 的世界裡,樣式的優先順序遵循一套既定規則:來源 (inline > 內部載入 > 外部載入)、特殊宣告 (!important)、選擇器權重 (specificity) 以及撰寫順序 (後者覆蓋前者)。這套邏輯雖然運行多年,但隨著專案規模擴大、框架與工具的盛行,常常會遇到樣式「莫名被覆蓋」或者「不小心影響到全域」的問題。
這樣的情況下,光靠「誰寫在後面就贏」已經不夠直觀了。為了解決這個痛點,CSS Working Group 引入了 @layer
,它能在程式碼層面上,為 CSS 樣式設定一個「分層」的秩序,讓層疊更有計畫性。
@layer 的基本語法
@layer
的核心概念就是先定義好一組「層級順序」,再把樣式放到對應的分層裡。
/* 宣告層的順序 */
@layer reset, base, components, utilities;
/* Reset 樣式 :: 消除不同瀏覽器在解釋 HTML 元素和套用預設樣式時的差異 */
@layer reset {
* { margin: 0; padding: 0; }
}
/* 全域基本樣式 :: 所有或大部分元素定義通用、基礎的外觀和風格 */
@layer base {
body { font-family: "Montserrat", sans-serif; }
}
/* 元件樣式 :: 可重複使用的 UI 元件定義專屬的樣式 */
@layer components {
.btn { padding: 8px 16px; }
}
/* 工具類樣式 :: 單一、特定、可重複使用的樣式規則,用於快速修改元素的特定屬性 */
@layer utilities {
.text-center { text-align: center; }
}
在上面的範例中,無論 CSS 出現順序為何,樣式套用時都會依照 reset → base → components → utilities 的先後層級來決定優先權。而同一分層裡的規則,依然會遵循一般 CSS 的層疊邏輯順序。
應用情境
- 大型專案樣式管理
將 reset、base、components、utilities 分層,可以降低樣式互相覆蓋的狀況 - 多人協作開發
不同團隊或模組能在不同層中撰寫 CSS,避免因撰寫順序不同而造成樣式衝突 - 框架與自訂樣式並用
例如在 Bootstrap 中加入自訂樣式時,可以透過@layer
來確保框架樣式與自訂樣式的優先順序
搭配 SCSS 的寫法
由於 SCSS 支援巢狀結構,@layer
的寫法能夠自然融入其中,讓樣式更有組織性:
@layer components {
.card {
padding: 16px;
border: 1px solid #ddd;
.card-title {
font-size: 1.125rem;
font-weight: bold;
}
}
}
這樣的寫法,不僅保持了分層的清晰性,也保留了 SCSS 的可讀性與維護性。
另外,現在原生 CSS 已支援 Nesting,不需再依賴預處理器,就能直接在 CSS 裡撰寫巢狀選擇器,語法更直觀,降低編譯依賴,提升效能與可讀性,下一篇文章再詳細說明。
瀏覽器支援度
目前 @layer
已經進入主流瀏覽器支援範圍:
- Chrome 99+
- Edge 99+
- Safari 15.4+
- Firefox 97+
若專案需要兼容舊版本瀏覽器,則可能需要加上 fallback 樣式,確保基礎功能不受影響。
結語
@layer
為 CSS 帶來了一個「層疊新秩序」。它的出現讓我們不再依賴「後覆蓋前」這種隱性規則,而是透過「層級順序」來有計畫地管理樣式。無論在中大型專案、多人協作或框架並用的場景中,@layer
都能發揮強大作用。建議大家逐步嘗試,體驗更乾淨、可控的 CSS 。