在 CSS 中,当多个选择器对同一元素的相同属性(如颜色)定义发生冲突时,浏览器会通过层叠规则(Cascading)解决冲突。具体优先级从高到低如下:
1. !important
规则(最高优先级)
- 在属性值后添加
!important
的声明优先级最高。 - 不推荐滥用(可能导致维护困难)。
.text { color: blue !important; } /* 最终生效 */
2. 来源和重要性
- 优先级排序:
- 用户代理样式(浏览器默认样式)中的
!important
- 用户样式(用户自定义,如浏览器插件)中的
!important
- 作者样式(开发者写的 CSS)中的
!important
- 作者样式(普通)
- 用户样式(普通)
- 用户代理样式(普通)
- 用户代理样式(浏览器默认样式)中的
3. 选择器特异性(Specificity)(核心规则)
当没有 !important
时,通过选择器特异性权重决定优先级。权重由四部分构成(从高到低):
a
:行内样式(style="color: red;"
,权重1,0,0,0
)b
:ID 选择器的数量(如#header
)c
:类/伪类/属性选择器的数量(如.class
,:hover
,[type="text"]
)d
:元素/伪元素选择器的数量(如div
,::before
)
比较规则:从左到右逐级比较(a > b > c > d
)。
示例:
#nav .item a { color: red; } /* 特异性:0,1,1,1 (a=0, b=1, c=1, d=1) */
div ul li.active { color: blue; } /* 特异性:0,0,1,3 (a=0, b=0, c=1, d=3) */
- 第一条规则胜出(
b
的权重更高)。
4. 源码顺序(最后规则)
如果选择器特异性完全相同,则后定义的样式生效:
.title { color: green; }
.title { color: orange; } /* 最终生效 */
解决冲突的实用技巧
-
避免滥用
!important
仅在覆盖第三方库等特殊场景使用。 -
增加特异性
通过添加父选择器提升权重:.parent .text { color: red; } /* 特异性 0,0,2,0 */
-
使用 CSS 变量
通过变量统一管理颜色,减少冲突::root { --main-color: red; } .text { color: var(--main-color); }
-
模块化 CSS
使用 BEM、CSS Modules 等方法隔离作用域。
示例分析
<div class="box" id="unique">Hello</div>
#unique { color: blue; } /* 特异性:0,1,0,0 */
div.box { color: green; } /* 特异性:0,0,1,1 */
.box { color: red; } /* 特异性:0,0,1,0 */
- 最终颜色为
blue
(ID 选择器特异性最高)。
通过理解这些规则,您可以精确控制样式的优先级,高效解决冲突问题。