外观
选择器有哪些,优先级怎么算?
选择器从右往左匹配。优先级可以记成四段:行内样式、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覆盖。