CSS2学习笔记05

结构的特殊性

系列文章

合法的HTML文档会生成一个结构树,可以根据选择器选择树中的特定位置。
继承(inheritance)是从一个元素向其后代元素传递属性值所采用的机制。确定应当向一个元素应用哪些值时,用户代理不仅要考虑继承,还要考虑声明的特殊性,另外需要考虑声明本身的来源。这个过程就称为层叠(cascade)。

特殊性的概念

可是使用多种选择器来选择同一个元素。对于同一种元素,当多个相同样式属性作用于它时,只有特殊性(specificity)最高的规则中的样式有效。
选择器的特殊性由选择器本身的组件确定。特殊性值表示为4个部分,记为:(0,0,0,0)

一个选择器的具体特殊性由以下方式确定:

一个选择器如果包含多个以上的内容,那么这些内容将会叠加(尽管它们可能只涉及选择同一个元素)。
(显然,选择的中间步骤越详细,选择的指向性就越强,更应该作为主导的规则)

声明与特殊性

一旦确定一个选择器的特殊性,这个值将授予其包含的所有相关声明。
用户代理会将其解组为单独的规则。

如果一个选择器中包含了以逗号分隔的多个选择器,那么它们会被处理成多个并列的规则。

通配选择器特殊性

通配选择器的特殊性为 0 。因此,通配选择器的样式规则会被任意选择器的样式规则覆盖。

通配选择器可以为整个页面统一定调。

ID和属性选择器的特殊性

注意,ID选择器和指定id的属性选择器在特殊性上差别很大。所以它们并不具有相同的效果。
因此,尽量不应该采用指定id的属性选择器。

内联样式特殊性

特殊性的最高位是为内联样式保留的,它比所有的其它声明特殊性都高。

内联样式的修改最精细,修改范围也最小,几乎不会影响其余元素,因此它的优先级最高。

在CSS2中,内联样式的特殊性与ID选择器的特殊性相同。(当时的特殊性只有三位)
不过在CSS2.1中,规则被修改成现在的了。

重要性

有时某个声明可能非常重要,甚至超过了所有其它声明。CSS2.1称之为重要声明,通过在声明的结束分号之前插入 !important 来标志。例如:

blockquote.reference {
    color: gray !important;
}

必须正确放置 !important 标志,否则声明将无效。!important 总是放在声明的最后,分号之前,与其余规则部分都不相关。

标志为 !important 的声明会分组在一起。重要声明的规则优先级比非重要声明的优先级高,而重要声明和非重要声明内部的优先级再由特殊性决定。