css样式优先级

90 阅读3分钟

1. 选择器优先级(Specificity)

CSS 选择器的权重通过一个数字系统计算,规则如下:

权重值:

  • 内联样式(如 <div style="color: red;">):1000
  • ID 选择器(如 #id):100
  • 类选择器、属性选择器、伪类(如 .class, [type="text"], :hover):10
  • 元素选择器、伪元素(如 div, ::before):1
  • 通配符选择器(如 *):0

计算方法: 将选择器中的权重累加,形成一个数字。例如:

#container .box div { /* 100 (ID) + 10 (类) + 1 (元素) = 111 */
    color: blue;
}
.box div { /* 10 (类) + 1 (元素) = 11 */
    color: red;
}

结果:color: blue 优先,因为权重 111 > 11。

组合选择器: 选择器越具体,权重越高。例如,#id .class(110)比 .class(10)权重高。 多个相同类型选择器会累加,如 .class1.class2(10 + 10 = 20)。

2. 样式来源优先级

样式来源也会影响权重,从高到低依次为:

  • 用户代理 !important(浏览器默认样式的 !important,极少见)
  • 用户样式 !important(用户自定义样式,如浏览器设置)
  • 作者样式 !important(开发者写的 CSS 中的 !important)
  • 作者样式(开发者写的普通 CSS)
  • 用户样式(用户自定义样式)
  • 用户代理样式(浏览器默认样式,如 <h1> 的默认字体大小)

!important 的作用:

!important 会显著提升样式优先级,覆盖其他规则,除非遇到更高来源的 !important。 示例:

.box {
    color: red !important; /* 优先于内联样式 */
}
html
<div class="box" style="color: blue;">文本</div>

结果:文本颜色为 red,因为 !important 优先级高于内联样式(1000)。

3. 代码顺序(就近原则)

当选择器权重和样式来源相同时,浏览器会选择最后定义的规则。这通常被称为“就近原则”。

示例:

.box {
    color: blue; /* 权重 10 */
}
.box {
    color: red;  /* 权重 10,但后定义,优先应用 */
}

结果:color: red。

外部样式表 vs 内联样式: 外部 CSS 文件中,靠后的规则覆盖靠前的规则。 内联样式(style 属性)默认权重 1000,通常优先于外部样式,除非外部样式使用 !important。

4. 与 Normalize.css 的关系

你之前提到 Normalize.css,它属于用户代理样式的标准化,优先级最低(低于作者样式)。如果你的自定义样式与 Normalize.css 冲突,自定义样式会覆盖 Normalize.css 的规则。

5. 实际应用中的注意事项

  • 避免滥用 !important:会导致样式难以维护,调试复杂。
  • 选择器优化:尽量使用简单选择器(如 .class),减少高权重选择器(如 #id .class div)以降低冲突风险。
  • 调试工具:使用浏览器开发者工具(F12)查看“计算样式”(Computed Styles),可以清楚看到哪个规则被应用及原因。

层叠冲突解决: 检查选择器权重。 检查是否使用了 !important。 确认代码顺序,调整规则位置。

6. 示例分析

<div id="container" class="box" style="color: green;">测试文本</div>
#container {
    color: blue; /* 权重 100 */
}
.box {
    color: red !important; /* 权重 10 + !important */
}
div {
    color: black; /* 权重 1 */
}

结果:文本颜色为 red,因为:

.box 的 !important 提升了优先级,覆盖内联样式(color: green, 1000)。 #container(100)和 div(1)权重低于 !important。

7. 总结

CSS 样式权重由以下因素决定:

  • 选择器权重:内联样式 (1000) > ID (100) > 类/伪类 (10) > 元素 (1)。
  • 来源优先级:!important > 作者样式 > 用户样式 > 浏览器默认样式。
  • 代码顺序:权重相同时,后定义的规则优先(就近原则)。 ps:跟class的顺序无关,只跟css定义的顺序有关