Skip to content

css优先级

important > id > class > *

logo

CSS优先级(Specificity)用于确定当多个规则作用于同一元素时,哪个样式将生效。其计算规则基于选择器的类型,优先级从高到低如下:


1. 优先级层级(由高到低)

选择器类型示例权重值表示法 (A,B,C,D)
内联样式<div style="...">1,0,0,0
ID选择器#header0,1,0,0
类/伪类/属性选择器.class, :hover0,0,1,0
元素/伪元素选择器div, ::before0,0,0,1
通配符/继承/子选择器*, >0,0,0,0

2. 计算规则

  • 将选择器拆分为四组 (A, B, C, D)

    • A:内联样式(存在则为1,否则0)。
    • B:ID选择器的数量。
    • C:类、伪类(:hover)、属性选择器([type="text"])的数量。
    • D:元素选择器(div)、伪元素(::before)的数量。
  • 比较方法
    从左到右逐级比较(A → B → C → D),数值大的优先级更高。
    示例

    css
    #nav .item a:hover  /* (0,1,2,1) → A=0, B=1, C=2, D=1 */
    body #sidebar .link  /* (0,1,1,1) → A=0, B=1, C=1, D=1 */

    第一个选择器优先级更高(比较到C时,2 > 1)。


3. 特殊情况规则

  • !important
    直接覆盖所有其他规则(慎用),但内联样式加 !important 的优先级最高。

    css
    p { color: red !important; } /* 最高优先级 */
  • 相同优先级
    后定义的样式覆盖先定义的(源码顺序靠后的生效)。

  • 继承的样式
    优先级最低(低于通配符 *)。

  • 组合选择器
    +, >, ~ 等组合符不增加优先级,仅影响选择逻辑。

  • :not() 伪类
    自身不计入优先级,但内部的选择器参与计算。

    css
    div:not(#id)  /* 优先级 = (0,1,0,1)(#id 参与计算) */

4. 示例对比

选择器示例权重值计算逻辑
style="color:red"1,0,0,0内联样式
#main .list li.active0,1,2,11个ID + 2个类 + 1个元素
ul#menu li.item0,1,1,21个ID + 1个类 + 2个元素
a:hover0,0,1,11个伪类 + 1个元素
div p0,0,0,22个元素
*0,0,0,0通配符

5. 优先级速记技巧

  • ID选择器 是最高权重(除内联和!important)。
  • 100个类 < 1个ID(因为比较顺序:B > C)。
  • 实际开发中避免过度嵌套,用类选择器更可控。

💡 总结:优先级计算 = 内联 > ID > 类/伪类 > 元素,比较时从左到右逐级对比。