彻底弄懂CSS选择器权重

101 阅读1分钟

css选择器有很多,id选择器,class选择器,元素选择器,伪类选择器,伪元素选择器,属性选择器等。

场景选择器的权重大小:内联样式 -> id选择器 -> class / 伪类 / 属性选择器 -> 元素 / 伪元素选择器

那么我们应该如何去计算这些选择器的权重呢?

以下哪一个选择器的优先级最高呢?
#list {}
div {}
.container {}
.container #list::before {}
.container #list a::before {}
.container .form input[type="text"] {}
.container ul a:hover {}

这个需要选择器权重的计算,css一共将选择器分为三类,假设x / y / z

  • xid选择器
  • y:类选择器,属性选择器,伪类选择器
  • z:元素选择器,伪元素选择器

统计选择器当中x / y / z各自的数量,会组成一共三元组,根据三元组来判断选择器的权重大小

#list {} (1, 0, 0)
div {} (0, 0, 1)
.container {} (0, 1, 0)
.container #list::before {} (1, 1, 1)
.container #list a::before {} (1, 1, 2)
.container .form input[type="text"] {} (0, 3, 1)
.container ul a:hover {} (0, 2, 2)

.container .form input[type="text"] {} (0, 3, 1)以这个选择器来进行解释:其中存在两个class选择器和一个属性选择器,所以y = 3;其中存在一个元素选择器,所以z = 1,不存在id选择器,所以x = 0

所以该选择器的权重表达式:0, 3, 1

如何比较权重的大小呢?

逐位比较,从左到右,如果大于了则停止比较,如果相同则继续比较后面的值

(1, 0, 0) < (1, 1, 1)  
(1, 1, 1) < (1, 1, 2)

所以在上面几个选择器中:.container #list a::before {}的优先级最高。