简单地说:一个 ID 总是会击败任意数量的类、伪类、属性选择器或类型选择器,但不一定是另一个 ID。这就是您需要记住的全部内容。
或者进入技术细节:特异性不计入我们都使用的一些十进制数字基数。ID 不值“100 分”,类/属性/伪类不是“10 分”,类型/伪元素不是“1 分”,等等。您不要将这些数字相加并在数学上进行比较,基于它们的总和;这不是它的工作原理。(您确实将单独的 ID 数量、类/属性/伪类的数量等相加,但您不会将所有单独的数字相加成一个总数。)
这些简单选择器的特殊性以完全不同的方式计算。规范说得最好:
9. 计算选择器的特异性
选择器的特异性计算如下:
- 计算选择器中 ID 选择器的数量 (= a)
- 统计选择器中的类选择器、属性选择器和伪类的数量(= b)
- 计算选择器中类型选择器和伪元素的数量 (= c)
- 忽略通用选择器
否定伪类中的选择器与其他选择器一样计算,但否定本身不计为伪类。
连接三个数字 abc(在具有大基数的数字系统中)给出了特异性。
例子:
* /* a=0 b=0 c=0 -> specificity = 0 */
LI /* a=0 b=0 c=1 -> specificity = 1 */
UL LI /* a=0 b=0 c=2 -> specificity = 2 */
UL OL+LI /* a=0 b=0 c=3 -> specificity = 3 */
H1 + *[REL=up] /* a=0 b=1 c=1 -> specificity = 11 */
UL OL LI.red /* a=0 b=1 c=3 -> specificity = 13 */
LI.red.level /* a=0 b=2 c=1 -> specificity = 21 */
#x34y /* a=1 b=0 c=0 -> specificity = 100 */
#s12:not(FOO) /* a=1 b=0 c=1 -> specificity = 101 */
请注意,它说的是“连接”(如将字符串连接在一起),而不是“添加”(如算术意义上的 2 + 2 = 4)。
另请注意,它说的是“具有大基数的数字系统”;这只是为了说明您不要将这些特异性分数作为十进制数,其中 13 × 10 = 130 大于 1 × 100 = 100 通俗地说。
这是计算选择器特异性的方法:
/* 1 ID, 1 class -> specificity = 1-1-0 */
#big .little
/* 1 ID, 2 classes -> specificity = 1-2-0 */
#big .little.little
/* 0 IDs, 13 classes -> specificity = 0-13-0 */
.little.little.little.little.little.little.little.little.little.little.little.little.little
现在注意第三个选择器的特异性如何小于前两个,因为没有使用 ID 选择器?
当比较另外两个选择器时,它们都有一个 ID 选择器,你会发现第二个选择器多了一个类。在这种情况下,由于额外的类选择器,第二个选择器获胜,即使每个选择器都有一个 ID 选择器,因为 ID 选择器本身共享相同的特异性。