Cascade
级联
级联
是CSS的一个基本特征。它是一种定义如何组合来自不同来源的属性值的算法。它的名字就是CSS的核心:层叠
样式表。
CSS实体参与级联
只有CSS声明(即属性/值对)
参与级联。这意味着包含声明以外的实体的规则(例如@font-face
包含描述符
)
不参与级联。在这种情况下,只有整个规则参与级联; 这里是由其font-family
描述符
标识的@ font-face 。如果@font-face
定义了几个具有相同描述符
的描述符
,则只@font-face
考虑整体上最合适的描述符
。
虽然在规则中包含大多数的声明-比如那些@media
,@documents
或@supports
-参加级联,包含在声明中@keyframes
没有。与之类似@font-face
,通过级联算法仅选择规则作为整体。
最后注意@import
并@charset
遵守特定的算法,不受级联算法的影响。
Origin of CSS declarations
CSS级联算法想要选择CSS声明来为CSS属性设置正确的值。CSS声明来自不同的来源:
- 浏览器有一个基本样式表,为任何文档提供默认样式。这些样式表被命名为
用户代理样式表
。一些浏览器使用实际样式表来执行此操作,而其他浏览器使用代码模拟它们,但这两种许用户修改用户代理样式表
。尽管HTML规范设置了一些用户代理样式表
的约束,但浏览器仍然有很大的自由度:这意味着从一个浏览器到另一个浏览器存在显着差异。为了简化他们的开发并降低工作的基础,Web开发人员经常使用CSS重置样式表,将公共属性值强制为已知状态。
虽然样式表来自这些不同的来源,但它们在范围上重叠:级联算法定义它们如何交互。
级联顺序
级联算法确定如何找到应用于每个文档元素的每个属性的值。
- 它首先过滤来自不同来源的所有规则,以仅保留适用于给定元素的规则。这意味着规则的选择符与给定元素相匹配,哪些是适当媒体规则的一部分。
CSS动画和级联
CSS动画,使用@keyframes
at-rules定义状态之间的动画。关键帧不会级联,这意味着CSS在任何时候都从一个单独获取值,@keyframes
并且从不混合其中的几个值。
当几个关键帧合适时,它会选择最重要的文档中定义的最新版本,但从未将所有关键帧合并在一起。
还要注意,@keyframes
at-rules 内的值会覆盖所有正常值,但会被!important
值覆盖。
例
用户代理CSS:
li { margin-left: 10px }
Author CSS 1:
li { margin-left: 0 } /* This is a reset */
Author CSS 2:
@media screen {
li { margin-left: 3px }
}
@media print {
li { margin-left: 1px }
}
User CSS:
.specific { margin-left: 1em }
HTML:
<ul>
<li class="specific">1<sup>st</sup></li>
<li>2<sup>nd</sup></li>
</ul>
在这种情况下,内部申报li
和.specific
规则应适用。没有声明被标记为!important
优先顺序是用户样式表或用户代理样式表之前的作者样式表。
所以有三个声明在竞争中:
margin-left: 0
margin-left: 3px
margin-left: 1px
最后一个被忽略(在屏幕上),并且两个第一个具有相同的选择器,因此具有相同的特征:它是最后选择的最后一个:
margin-left: 3px
请注意,用户CSS中定义的声明虽然具有较高的特定性,但未选择,因为在特定性算法之前应用了级联算法。