當兩條 CSS 規則指向同一個元素、又設定同一個屬性時,瀏覽器需要一個裁判:特異性。每個選擇器得到一個以三個數字 a, b, c 表示的權重。由左而右比較,高者勝。只有完全相同時,才由原始碼順序(或 !important)決定。這就是為什麼一條更具體的規則會悄悄蓋掉你剛寫的那條。
a 欄數 ID 選擇器,b 欄數 class、屬性與 pseudo-class,c 欄數元素型別與 pseudo-element。萬用選擇器、組合子與 :where() 不加分。:is()、:not()、:has() 貢獻其內部最具體參數的特異性。本工具替每個 token 標色,讓你看見它灌進哪一欄。
關於這個主題的常見疑問與實用解答。
通常是另一條指向同一元素的規則特異性更高,所以就算你的寫在後面也是它贏。把兩個選擇器貼進來比較 (a, b, c) 權重,就能看出是哪一欄決定的。
:where() 就是設計成不加特異性,讓裡面的東西容易被覆蓋。萬用選擇器 * 與組合子也不加分。相對地 :is() 與 :not() 會取其內部最具體參數的特異性。
不會。所有解析與比較完全在你的瀏覽器中執行,你輸入的任何內容都不會離開你的裝置。