首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

CSS 優先級詳解:為什麼 .main ul li 覆蓋 .on 類樣式

     編輯:程式設計綜合問答

問題現象

<style>
.main { width:200px; height:200px; background:black; }
.main ul li { background:white; }   /* A */
.on { background:blue; }            /* B */
</style>

<div class="main">
  <ul>
    <li class="on">第一行文字為什麼不是藍色?</li>  /* 實際顯示白色 */
    <li>第二行</li>
  </ul>
</div>

CSS 優先級計算規則 (W3C 標準)

優先級由四元組 (a, b, c, d) 表示:

  • a:內聯樣式 `style="..."` (1,0,0,0)
  • b:ID 選擇器 `#id` (0,1,0,0)
  • c:類/屬性/偽類 `.class` `[attr]` `:hover` (0,0,1,0)
  • d:元素/偽元素 `div` `::before` (0,0,0,1)

比較規則:從左到右逐位比較,高位優先。!important 最高 (1,0,0,0,0) 但不建議濫用。

具體計算過程

選擇器形式abcd權重值
.main ul li類 + 元素 + 元素00120,0,1,2 = 12
.on類00100,0,1,0 = 10
#onID01000,1,0,0 = 100

結論:.main ul li (12) > .on (10),故白色覆蓋藍色。改用 ID 選擇器 `#on (100)` 則藍色生效。

常見誤區澄清

誤區事實
「類選擇器永遠比元素選擇器優先」❌ .class (0,0,1,0) vs div div div div (0,0,0,4) → 類優先。但 .a .b .c .d .e (0,0,5,0) vs #id (0,1,0,0) → ID 優先
「後寫的樣式優先」❌ 僅在優先級相等時生效 (後來者勝)
「內部樣式表 > 外聯樣式表」❌ 優先級與引入方式無關,僅看選擇器權重
「權重可簡化為數字相加」❌ 進制非十進制,256 個類選擇器也無法超越 1 個 ID

實戰最佳實踐

  1. 避免過度嵌套:`.main ul li` → 盡量扁平化 `.main-li` 或使用 BEM 命名 `.main__list-item`
  2. 善用類選擇器:優先用 `.on` 而非 `.main ul li.on`
  3. 謹慎用 ID:ID 權重極高難以覆蓋,組件內部優先用類
  4. 避免 !important:破壞層疊上下文,維護噩夢。必要時用於第三方庫覆蓋
  5. 利用層疊上下文:`isolation: isolate` 或 `z-index` 管理分層

調試技巧

  • Chrome DevTools → Elements → Styles 面板:刪除線 表示被覆蓋,點擊可跳轉源碼
  • Computed 面板:查看最終生效屬性來源
  • 命令行工具:npx specificity-calculator ".main ul li"

參考資源

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved