本文内容根据 CSS Specificity 整理。
首先,根据优先级从高到低,分为以下三类:
A. ID 选择器(例如,#example)
B. 类选择器 (例如,.example),属性选择器(例如,[type="radio"])和伪类(例如,:hover)
C. 类型选择器(例如,h1)和伪元素(例如,::before)
接下来,我们要想查看一个选择器中各个优先级类别有多少个,使用 A-B-C 这个形式表示。例如:
- x-0-0:x 表示 ID 选择器的数量。
- 0-x-0:x 表示类、属性和伪类选择器的数量。
- 0-0-x:x 表示类型和伪元素的数量。
- *, +, >, ~:全局选择器没有值,当结合了其它选择器时,它们不会提升优先级。
- :not(x):反选伪类选择器没有值,但是传递的参数会提升优先级。
示例
-
*-0-0-0 -
div-0-0-1 -
li > ul-0-0-2 -
.myclass-0-1-0 -
*.myclass-0-1-0
*全局选择器没有值 -
*[type:checkbox]-0-1-0 -
:only-of-type-0-1-0 -
li.myclass-0-1-1 -
li[attr]-0-1-1 -
li:nth-of-type(3n)~li-0-1-2 -
form input[type=email]-0-1-2 -
li.class:nth-of-type(3n)-0-2-1 -
input[type]:not(.class)-0-2-1 -
#myDiv-1-0-0 -
#myDiv li.class a[href]-1-2-2 -
#divitis #myDiv a-2-0-1 -
style=""-1-0-0-0 -
!important-1-0-0-0-0
最后两个都已经不按规则出牌了,明显超出 ID 选择器的优先级了,所以使用它们的时候需要慎重思考。