你真的了解css选择器权重大小吗?

203 阅读2分钟

首先,先来判断一下下列选择器的权重大小

#wrap {}
.container {}
div {}

很显然,大家肯定都知道这里是id选择器 > 类选择器 > 元素选择器,即:#wrap > .container > div

那么,如果是下列选择器呢,你还知道他们的权重大小吗?可能这时已经不好判断了。

#wrap .container div {}
#wrap .form input[type='text'] {}
.container #box p::before {}
.container ul li a:hover {}

在搞清楚上面的问题之前,我们先来了解一下css底层判断权重大小的算法规则。

规则

首先,css会对每个选择器使用三个数(x,y,z)来表示对应的权重值,这三个数的含义如下:

  • x:id选择器的数量
  • y:类选择器、伪类选择器、属性选择器的数量
  • z:元素选择器、伪元素选择器的数量

其次,css会将每个选择器对应的(x,y,z)数量值算出来,如下:

#wrap {}        /* (1,0,0) */
.container {}   /* (0,1,0) */
div {}          /* (0,0,1) */

然后,再对每个选择器的x,y,z三个值一一进行对比,对比规则如下:

  1. x中谁值最大,谁就权重最大,然后就直接退出对比
  2. 如果x都相同,那么就对y进行对比,y中谁值最大,谁就权重最大,然后直接退出对比
  3. 如果y都相同,同理就对z进行对比,z中谁值最大,谁就权重最大

综上所述,以上三个选择器的权重大小就为:#wrap > .container > div


那么,接下来就带着结论,解答最开始的问题,判断以下选择器的权重大小

#wrap .container div {}            /* (1,1,1) */
#wrap .form input[type='text'] {}  /* (1,2,1) */
.container #box p::before {}       /* (1,1,2) */
.container ul li a:hover {}        /* (0,2,3) */

由上计算出的权重值可得:#wrap .form input[type='text'] > .container #box p::before > #wrap .container div > .container ul li a:hover

怎么样,现在是不是对css选择器权重大小的判断规则有了新的理解。其实我们可以在vscode中将鼠标移动到选择器上面,选择器上方就会提示对应的权重值,原理是一样的,如下图:

image.png

以上就是关于css是如何判断权重大小的问题,觉得讲得不错的朋友,希望能点个赞支持下,谢谢!