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定义的顺序有关