CSS 中的层叠与特殊性

前言

在样式表中,同一个文档元素可能被定义了多条样式规则。碰到这种情况时,CSS 通过一个被称为 层叠(Cascade) 的过程来处理冲突。本文介绍了层叠的重要度次序以及样式表规则的特殊性。

层叠

CSS 层叠是指 CSS 样式在针对同一元素配置同一属性时,依据层叠规则(权重)来处理冲突,它会选择应用权重高的 CSS 选择器所指定的属性。这个过程一般也被描述为权重高的规则覆盖权重低的规则。

层叠给每个规则分配一个重要度,它的重要度次序如下:

  1. 标有 !important 的用户样式
  2. 标有 !important 的作者样式
  3. 作者样式
  4. 用户样式
  5. 浏览器/用户代理应用的默认样式

作者的样式表是由站点开发者编写的,被认为是最重要的样式表。用户可以通过浏览器应用自己的样式,这些样式表的重要度低一级。最后是浏览器或用户代理使用的默认样式表,它们的重要度是最低的。但是,如果用户一定要使用自己的样式,可以通过将规则指定为 !important 来提高它的重要度,让它优先于任何规则,甚至优先于作者加上 !important 标志的规则。

在比较了样式规则的重要度之后,CSS 还会根据选择器的 特殊性 来决定规则的次序。具有更特殊选择器的规则优先于具有一般选择器的规则。如果两个规则的重要度、来源、特殊性都相同,则后定义的规则优先。

特殊性

特殊性指的是 CSS 选择器的特殊性。在样式表中,每个 CSS 选择器会被分配一个数字值,将规则的每个选择器的值加在一起,就计算出了规则的特殊性。

选择器的特殊性分为四个等级:a、b、c、d。

  • 如果是行内样式,那么a = 1,否则a = 0
  • b = ID选择器的数量
  • c = 类、伪类、属性选择器的数量
  • d = 元素选择器和伪元素选择器的数量

使用这些规则可以计算出任何 CSS 选择器的特殊性,abcd四个数字组合的数值最大的特殊性最大,优先级最大。

注意:通用选择器、子选择器、相邻同胞选择器的特殊性为空。

下表给出了一系列选择器及其相应的特殊性:

选择器 特殊性
style = “” 1, 0, 0, 0
#wrapper #content {} 0, 2, 0, 0
#content .datePosted {} 0, 1, 1, 0
div#content {} 0, 1, 0, 1
#content {} 0, 1, 0, 0
p.comment .datePosted {} 0, 0, 2, 1
p.comment {} 0, 0, 1, 1
div p {} 0, 0, 0, 2
p {} 0, 0, 0, 1

基本上,行内样式总是比其他任何规则特殊,具有ID选择器的规则比没有ID选择器的规则特殊,具有类选择器的规则比只有元素选择器的规则特殊。

记住,如果两个规则的特殊性相同,那么后定义的规则胜出。

继承

继承指的是子元素的样式继承父元素的样式。

很多人将继承和层叠混为一谈,虽然它们初看上去有点相似,但这两个概念实际上是很不一样的。

继承不是层叠。层叠是权重高的样式覆盖权重低的样式,而继承是子元素样式继承父元素样式。

继承而来的样式的特殊性为空(连0特殊性都没有)。如果你在父元素设置了样式,而子元素的样式并没有和父元素样式一样,出现这种情况是因为浏览器带有默认的样式,而继承的样式被浏览器默认的样式覆盖。所以如果不希望使用浏览器的默认样式,需要在样式表开头对样式重置。

------ 本文结束 ------
坚持原创技术分享,您的支持将鼓励我继续创作!