笔试时遇到一个很有意思的 CSS 权重题目:
HTML:
1  | <div class="outer" id="app">  | 
CSS:
1  | #app .inner:not(#div) .highlight {  | 
请问 测试文本 的颜色为?
根据很久之前看过的一篇博文,隐约记得里面有一个权重口诀:
从 0 开始,一个行内样式 +1000,一个 id +100,一个 class / 属性选择器或者伪类 +10,一个元素名或者伪元素 +1,通配符 * 不计权重。
我天真的选择了:测试文本,蓝色。😭
正确答案为:测试文本,红色!
权重计算:
要特别注意
:not()伪类,在优先级计算中不会被看作是伪类,但是在计算选择器数量时会把 其中的选择器 当做普通选择器进行计数,MDN权重为:100 (
#app) + 10 (.inner) + 100 (#div) + 10 (.highlight) = 2201
2
3#app .inner:not(#div) .highlight {
color: red;
}权重为:100 (
#app) + 10 (.highlight) + 10 (:nth-of-type(1)) + 10 (:nth-last-of-type(1)) = 1301
2
3#app .highlight:nth-of-type(1):nth-last-of-type(1) {
color: blue;
}所以最终颜色为红色
权重等级
根据选择器种类的不同可以分为四类,也决定了四种不同等级的权重值。
行内样式
行内样式包含在你的 html 中 对你的元素产生直接作用,比如:
1  | <h1 style="color: #fff;">header</h1>  | 
ID 选择器
Id 也是元素的一种标识,比如 #div
类,属性选择器和伪类选择器
这一类包括各种 class;属性选择器,比如: [title];伪类选择器,比如 :hover 等等
元素和伪元素
元素跟伪元素选择器,比如 div、::before、::after、::first-letter、::first-line、::selecton
如何快速确定权重
记忆口诀:从 0 开始,一个行内样式 +1000,一个 id +100,一个 class / 属性选择器或者伪类 +10,一个元素名或者伪元素 +1,通配符 * 不计权重。
例如:
1  | body #content .data img:hover {  | 
最终权重为:1 (body) + 100 (#content) + 10 (.data) + 1 (img) + 10 (:hover) = 122
权重的基本规则
- 不同的权重,权重值高则生效
 - 相同的权重:以后面出现的选择器为最后规则
 - 无论多少个元素组成的选择器,都没有一个 class 选择器权重高(不要被元素 +1,class +10 迷惑)
 - 要特别注意 
:not()伪类,在优先级计算中不会被看作是伪类,但是在计算选择器数量时会把 其中的选择器 当做普通选择器进行计数 
关于 !important
!important 会覆盖任何其他的样式声明。
这个规则有点毒,除非特殊情况,不然不要使用。