[CSS] Cascade and Layer
keywords: css
資料來源
- Introducing the CSS Cascade @ MDN:可以參考裡面 Cascading order 的表
- Intermediate HTML & CSS @ Frontend Masters
Cascade
-
Cascade 指的是針對同一個 HTML element 有多個不同的 CSS 樣式時,判斷要套用哪一個樣式的順序,判斷順序的邏輯稱作 cascade algorithm(由最上面的開始判斷,相同的話在往下):
-
Relevance:是不是相關的 HTML Element,有沒有符合特定的 condition(例如 media query)
-
Origin and importance:有沒有下
!important
;是屬於 User-agent Style(瀏覽器)、Author Style(開發者)或 User style(瀏覽器的使用者)- transitions >
!important (order reverse)
> animations > inline-style > unlayered styles > layered styles - author > user > user-agent
- 如果使用了
!important
,則會和原本的權重反轉,變成 user-agent > user > author
- transitions >
-
Specificity
-
Order of appearance:出現的順序,越後面出現的會覆蓋前面出現過的
-
-
比較的的順序會先 判斷 cascade,一樣的話才會判斷 specificy,也就是說,即使某個 CSS selector 的 specificity 比較高,但 cascade 比較低的話,它還是會被其他 cascade 更高的所覆蓋:
<head>
<style>
p {
border: 3px solid blue;
}
/* 雖然 specificity 較高,但因為 cascade 較低,因此這裡的樣式最終會被覆蓋 */
div p {
border: 3px solid red;
}
</style>
</head>
<body>
<div>
<!-- 雖然 specificity 較低,但 inline-style 的 cascade 較高,因此最終會套用這裡的樣式 -->
<p style="border: 3px solid green;">
What the border color will be?
</p>
</div>
</body> -
透過開發者工具(dev tool)可以檢視 CSS Cascade 的高低,越上面的表示順位越高
Layers
@layer @ MDN
透過 layer,提供了開發者一個操作和改變 cascade 的機會。
/* named layer */
@layer layer-name { rules };
/* anonymous layer */
@layer { rules };
/* define layer and could append rules later */
@layer layer-name;
/* define multiple layers with specific "order", laster-declared layers win */
@layer layer-name, layer-name, layer-name;
/* create layer by using @import, the layer name will be "utilities" */
@import 'theme.css' layer(utilities);
提示
記得 layer-name 前後「不用」加上引號。
任何不在 layer 中的樣式都將被放到一個 anonymous layer 中,並在置於其他 declared layers, named, anonymous layers 之後,也就是說,在不考慮 specificity 的情況下,所有在 layer 外所定義的樣式都能覆蓋寫在 layer 內的樣式。
因此,如果是這樣寫:
<style>
@layer foobar {
/* 雖然 specificity 較高,但因為 cascade 較低,因此這裡的樣式最終會被覆蓋 */
body article figure p {
border: 3px solid red;
}
}
p {
border: 3px solid blue;
}
</style>