Skip to content

选择器有哪些,优先级怎么算? ​

选择器从右往左匹配。优先级可以记成四段:行内样式、ID、类/属性/伪类、元素/伪元素。比较时从高段到低段,不要把它们加成一个「总数」来跨段进位。

原理 ​

同一段里数量多的赢。#a 高于 .b .c .d,因为 ID 这一段已经更大。!important 单独一层,来源顺序是:作者重要 > 作者普通,再看选择器优先级,还相同就看谁写在后面。

继承来的属性没有选择器优先级,任何直接指定都会盖过继承。可继承的大多是文本相关:color、font、line-height、visibility。盒模型相关的 margin、padding、border、width 不继承。

*、>、+、~ 和组合器不增加优先级。:where() 的优先级是 0,:is() 取括号里最高的那个。

追问 ​

为什么少用 ID 选择器?

ID 优先级高,后面要用类覆盖就得再堆 ID 或 !important。组件样式用类,并且把选择器写短。

inherit、initial、unset 呢?

inherit 跟父元素。initial 用属性的初始值,不一定是父元素的值。unset 对可继承属性相当于 inherit,否则相当于 initial。

易错点 ​

  • 把优先级当成 100、10、1 相加。十一类不会凑成一个 ID。
  • 写在后面的规则,只有在优先级相同或更高时才生效。
  • !important 用多了,后面只能再靠 !important 覆盖。

相关 ​