参考链接
(部分案例可能有误,最好自己动手瞅瞅)
CSS选择器权重
同一元素的同一属性权重:
!important > 行内样式 > id 选择器 > (class 、属性、伪类选择器 )> (标签、伪元素选择器 )> 通配选择器
具体计算规则见下文。
注意,优先级比较的是相同元素的相同属性
- 如果!important被用于一个简写的样式属性,那么这条简写的样式属性所代表的子属性都会被应用上!important。 例如:background: blue !important;
- 如果两条样式都使用!important,则权重值高的优先级更高
- 样式指向同一元素,权重规则生效,权重大的被应用
- 样式指向同一元素,权重规则生效,权重相同时,就近原则生效,后面定义的被应用
- 样式不指向同一元素时,权重规则失效,就近原则生效,离目标元素最近的样式被应用
- 层次选择器不改变优先级
优先级是由 A 、B、C、D 的值来决定的,其中它们的值计算规则如下:
- 如果存在行内样式,那么
A = 1,否则A = 0; - B 的值等于
ID选择器(#id)出现的次数; - C 的值等于
类选择器(.class)和属性选择器(a[href^="https"])和伪类(:first-child)出现的总次数; - D 的值等于
标签选择器(h1,a,div)和伪元素(::before,::after)出现的总次数。
从左至右比较,如果是样式优先级相等,取后面出现的样式。
补充说明
其他的情况测试在上面的参考链接中大都有提到,这里不再赘述。
想专门补充和注意的是,伪元素和外层标签取到的不是同一个元素!
来看下面的例子
HTML
<div id="div1">123 <br>456</div>
CSS
div::after{content: 'after';color: lawngreen;}div::first-line {color: deepskyblue;}#div1 {color: red;}

不对啊,按照前面的规则,这里修改的都是同一个div 里面的 color 属性,按理说的 id 选择器应该是权重最大的,所有字体都应该是 红色 啊。
事实上,这里修改的确实都是 color 属性,但并不是都修改了同一个元素,我们来看下面的例子 。
HTML
<div id="div1">123 <br>456</div>
CSS
div::after{content: 'after';background-color: greenyellow;}div::first-line {background-color: orange;}#div1 {color: red;}div {width: 80px;height: 80px;background-color: deepskyblue;}

可以看到,伪元素取到的 **background** 和标签取到的 **background** 并不相同,因此,于是得到前面例子的结果就不奇怪了,因为压根操作就不是同一个元素。
可能有人会和我第一反应一样:那这伪类还怎么比较,这不是跳出规则了吗?
所以再补充个简单的例子。
HTML
<div id="div1">123</div>
CSS
#div1::after {color: red;}div::after{content: 'after';color: lawngreen;}

