<style type="text/css"> span { color: red; } .c { color: blue; } #i { color: green; } </style> <div> <span id="i" class="c">CSS</span> </div>上面的 CSS 字串同時被 span、.c 與 #i 選上,結果是呈現 #i 的綠色。
再看一個複雜一點的狀況。
<style type="text/css"> div span { color: yellow; } span.c { color: pink; } </style> <div> <span id="i" class="c">CSS</span> </div>上面的 CSS 字串同時被 div span 與 span.c 選上,結果是呈現 span.c 的粉紅色,為什麼呢?
邏輯很簡單,每個 CSS Selector 都有一個「優先度」,可以用「數值」來表示。
標籤選擇器,像是 div 或者 span,得 1 分。
類別選擇器,就是 class 定義的名稱,得 10 分。
ID 選擇器,就是 id 定義的名稱,得 100 分。
還有行內選擇器(Inline selector),就是用 style="..." 直接寫在標籤裡的,得 1000 分。
最終以得方最高的選擇器勝出。
上面第一個範例,span 為標籤選擇器,得 1 分,.c 為類別選擇器,得 10 分,#i 為 ID 選擇器,得 100 分,所以 #i 勝出。
第二個範例,div span 等於兩個標籤選擇器(各 1 分),得 2 分,span.c 為一個標籤選擇器(1 分)加上一個類別選擇器(10 分),得 11 分。
另外還有兩個特別的選擇器,擬元素(像是 :first-line)與標籤選擇器相同,得 1 分,擬類別(像是 :hover)與類別選擇器相同,得 10 分。
事實上,上面第二個範例的 div span 稱為後裔選擇器,是由所有列出的選擇器加總而成。
那繼承而來的屬性呢?
<style type="text/css"> span { color: red; } #i { color: green; } </style> <div id="i"> <span>CSS</span> </div>CSS 字串的 color 屬性有兩個來源,第一個是從 div 的 ID 選擇器繼承來的綠色,以及本身 span 標籤選擇器的紅色,會是呈現來自 100 分的 ID 選擇器的綠色?不,是呈現 span 標籤選擇器的紅色。
繼承的屬性只有在元件本身沒有任何選擇器符合時才會套用,沒有任何優先度可言。
最後,當優先度相同時會怎辦?
<style type="text/css"> .d span { color: red; } div .s { color: yellow; } </style> <div class="d"> <span class="s">CSS</span> </div>.d span 與 div .s 的優先度都是 11 分,當優先度相同時勝出的是「最後定義」的 div .s 選擇器。
「最後定義」指的是檔案中最後出現的,這其中包括使用 link 帶入的外部樣式檔,以及使用 style 定義的內部樣式表。
<link rel="stylesheet" href="a.css"> <style type="text/css"> ... </style>以上範例的內部樣式表(style)優於外部樣式檔(link)。
但是如果位置對調。
<style type="text/css"> ... </style> <link rel="stylesheet" href="a.css">就變成外部樣式檔(link)優於內部樣式表(style)。-
內部樣式表(style)與外部樣式檔(link)中相同的優先度最終以「位置」決定。
一般的慣例是先列出所有的外部樣式檔(link),然後才是內部樣式表(style)。
---
---
---
沒有留言:
張貼留言