# [CSS] 優先權 ###### tags: `CSS` * 選到同一個物件才有優先權的判斷和比較 * 明確性越高,優先權越高 * 相同選取器下,原始碼順序後者蓋掉前者 * 優先權大至小 1. 具備 `!important` 的 CSS 屬性 2. Animation(動畫執行期間) 3. inline style 4. ID 5. class、pseudo-class 偽類、屬性選取器 6. Tag、pseudo-element 偽元素 7. \* 號萬用選取器 8. 繼承而來的屬性 * 若有使用 `@layer`,參考 [[CSS] @layer 筆記內的優先權](https://hackmd.io/@yuna9068/SJ9JT0Alh#優先權) ## 選取器分數 | 選取器 | 分數 | | ------------------------------------------------------------ | ------- | | ID | (1,0,0) | | class、pseudo-class 偽類、屬性選取器 | (0,1,0) | | Tag、pseudo-element 偽元素 | (0,0,1) | | * 號萬用選取器、繼承、`:where()`、`+`、`>`、`~`、後代選取器、`\|\|` | (0,0,0) | * `:nth-child()`、`:nth-last-child()` 會將本身 pseudo-class 再加上 `()` 中的選取器計算分數 * `:nth-child(even of li, .item)`:(0,2,0) * `:nth-child(even of li)`:(0,1,1) * `:is()`、`:not()`、`:has()` 會依據 `()` 中的選取器計算分數 * `:is(em, #foo)`:(1,0,0) * `:is(em)`:(0,0,1) * `:not(em, strong#foo)`:(1,0,1) * `:where()` 不計分 * `.qux:where(em, #foo#bar#baz)`:(0,1,0) * `*` 不計分 兩者優先權相等,後面會蓋掉前面,故 `.box` 的顏色會是 `#000000` ```css * .box { background: #ffaacc; } .box { background: #000000; } ``` * 比較分數時從最左側開始,數值相同才比下一個數值 `#primary` 的分數為 (1,0,0),`.a.b.c.d.e.f.g.h.i.j.k` 的分數為 (0,11,0),無論有多少個 class,優先權仍低於 ID,故 `div` 內的文字 color 為 `#0000ff` ```htmlembedded <div id="primary" class="a b c d e f g h i j k">color</div> ``` ```css #primary { color: #0000ff; } .a.b.c.d.e.f.g.h.i.j.k { color: #ff0000; } ``` * 同分時,後者覆蓋掉前者 `* div` 和 `body *` 分數皆為(0,0,1),`body *` 撰寫順序在 `* div` 後面,故 `div` 內的文字 color 為 `#00ff00` ```htmlembedded <div>color</div> ``` ```css * div { color: #ff0000; } body * { color: #00ff00; } ``` ### 權重分數計算網站 * [CSS Selector Specificity Calculator](https://polypane.app/css-specificity-calculator/) * [Specificity Calculator](https://specificity.keegan.st/) ## 設定超連結狀態的撰寫順序 1. `a` 2. `a:link`:尚未點擊,有 `href` 屬性才有作用 3. `a:visited`:點擊過後 4. `a:hover`:滑鼠觸碰 5. `a:active`:按住,點擊當下 6. `a:focus`:取得焦點 但實務上還是要看需求,需求有可能是造訪過的連結不希望 hover 有變化,那就得調整順序將 `:visited` 放在 `:hover` 後面 ## 參考資料 * [Calculating a selector’s specificity](https://www.w3.org/TR/selectors-4/#specificity-rules "W3C Selectors Level 4") * [李建杭(Amos),《金魚都能懂的 CSS 選取器:金魚都能懂了你還怕學不會嗎》(博碩文化,2020),第1-3章、第4-2章。](https://www.drmaster.com.tw/Bookinfo.asp?BookID=MP22010) --- :::info 建立日期:2024-02-25 更新日期:2024-02-25 :::