CSS 级联与继承 第6级

W3C 工作草案,

关于此文档的更多信息
此版本:
https://www.w3.org/TR/2024/WD-css-cascade-6-20240906/
最新发布版本:
https://www.w3.org/TR/css-cascade-6/
编辑草案:
https://drafts.csswg.org/css-cascade-6/
以前版本:
历史记录:
https://www.w3.org/standards/history/css-cascade-6/
反馈:
CSS 工作组问题存储库
规范中的内联反馈
编辑:
Elika J. Etemad / fantasai (Apple)
Miriam E. Suzanne (受邀专家)
Tab Atkins Jr. (谷歌)
建议对本规范进行编辑:
GitHub 编辑器

摘要

此 CSS 模块描述了如何整理样式规则并为所有元素上的所有属性分配值。通过级联和继承,值会被传播到所有元素的所有属性。

本级新增内容为§ 2.5 作用域样式:@scope 规则

CSS 是一种描述结构化文档(如 HTML 和 XML)在屏幕、纸张等上的呈现的语言。

本文档的状态

本节描述了本文档在发布时的状态。 当前 W3C 出版物列表和此技术报告的最新版本可在 W3C 技术报告索引 https://www.w3.org/TR/ 中找到。

本文档由 CSS 工作组 作为工作草案发布,采用推荐标准流程。 作为工作草案发布不代表 W3C 和其成员的认可。

本文档是草案,可能随时被更新、替换或废弃。 不适合引用此文档,除非作为尚在进行中的工作。

请通过在 GitHub 中提交问题(优先),在标题中包含规范代码“css-cascade”,例如:“[css-cascade] …评论摘要…”来提交反馈。所有问题和评论都在档案中。或者,可以将反馈发送到(已归档)公共邮件列表 www-style@w3.org

本文档受 2023年11月3日 W3C 流程文档 约束。

本文档由遵循 W3C 专利政策 的小组生产。W3C 维护了与小组交付物相关的 公开专利披露列表;该页面还包括披露专利的说明。个人如果实际知道某专利并相信其中包含 必要的声明,必须按照 W3C 专利政策第6节的规定披露信息。

1. 引言与缺失部分

这是一个关于 CSS 级联与继承 第5级 的差异规范。 它目前是探索性工作草案: 如果你正在实现任何内容,请参考第5级。 一旦本草案达到 CR,我们将合并第5级的文本。

2. 级联

级联 处理给定元素上某属性的一组无序 声明值, 按照下述方式根据 声明 的优先级进行排序, 并输出一个单一的 级联值

2.1. 层叠排序顺序

层叠会根据以下标准对声明进行排序,按优先级递减:

来源和重要性
声明来源取决于其出处, 以及其重要性,即是否使用了!important(见下文)。 各种来源的优先级从高到低为:
  1. 过渡声明 [css-transitions-1]
  2. 重要的 用户代理声明
  3. 重要的 用户声明
  4. 重要的 作者声明
  5. 动画声明 [css-animations-1]
  6. 普通的 作者声明
  7. 普通的 用户声明
  8. 普通的 用户代理声明

列表中靠前的来源声明优先于后面的来源声明。

上下文
文档语言可以提供来自不同封装上下文声明的混合,例如在树上下文中嵌套的影子树

当比较来自不同封装上下文的两个声明时, 对于普通的规则, 外部上下文的声明优先, 对于重要的规则, 内部上下文的声明优先。 为此,[DOM]中 的 树上下文被认为是嵌套在 包含阴影的树顺序中。

注意:这实际上意味着属于某个 封装上下文普通声明可以设置默认值, 这些默认值容易被外部上下文覆盖, 而属于某个封装上下文的重要声明 可以强制要求这些声明不能被外部上下文覆盖。

样式属性
分别对于普通重要声明, 直接附加到元素上的声明 (例如样式属性的内容) 优先于通过样式规则选择器间接映射的声明。
每个声明可以被显式分配到 来源上下文中的 层叠层。 在本步骤中, 没有分配到显式层的声明会被加入到一个隐式的最终层。

层叠层(与声明一样)按出现顺序进行排序, 见 § 2.4.1 层顺序。 当比较属于不同层的声明时, 对于普通规则, 在层顺序中最新的层叠层中的声明获胜, 而对于重要规则, 在层顺序中最早的层叠层中的声明获胜。

注意:这与 普通重要来源的优先级逻辑相同, 因此!important标志在这两种设置中都保持了相同的“覆盖”用途。

特异性
选择器模块 [SELECT]描述了如何计算选择器的特异性。 每个声明的特异性与它所出现的样式规则的特异性相同。 具有最高特异性的声明获胜。
范围接近性
当比较在样式规则中出现的声明时, 这些规则具有不同的作用范围根, 则声明的作用范围根范围样式规则主题之间的代际或兄弟元素跳跃次数越少,声明越优先。 对于没有作用范围根的样式规则,视为具有无限接近跳跃次数。
出现顺序
文档顺序中最后的声明获胜。 为此:
  • 样式表的顺序如 最终 CSS 样式表中所示。
  • 来自导入样式表的声明按其样式表替换 @import规则的位置顺序。
  • 由源文档独立链接的样式表中的声明被视为按链接顺序串联起来, 链接顺序由主机文档语言决定。
  • 来自样式属性的声明按其所在元素的文档顺序进行排序, 且都排在任何样式表之后。[CSSSTYLEATTR]

层叠的输出 是每个元素上每个属性的(可能为空的)排序列表 已声明值

2.2. 层叠来源

CSS 层叠 5 § 6.2 层叠来源

层叠来源

2.3. 重要声明:!important 注释

CSS 层叠 5 § 6.3 重要声明: !important 注释

重要 普通

2.4. 层叠层

CSS 层叠 5 § 6.4 层叠层

2.4.1. 层顺序

CSS 层叠 5 § 6.4.3 层顺序

2.5. 作用域样式:@scope 规则

作用域是文档的一个子树或片段, 可以被选择器用于更有针对性的匹配。 作用域通过以下方式确定:

如果一个元素满足以下条件,则该元素为在作用域内

注意:阴影封装不同, 阴影封装在 DOM 中描述了一个持续的一对一关系, 关系发生在阴影宿主与其嵌套的阴影树之间, 而多个重叠的作用域可以与相同的元素建立关系。

作用域样式在 CSS 中使用@scope 块 at 规则描述, 该规则声明了一个作用域根和一组关联的可选作用域限制以及一组样式规则

例如, 作者可能有广泛的配色方案作用域, 它与一些更狭义的设计模式重叠, 例如媒体对象。 @scope规则中的选择器 建立了作用域根和可选的作用域限制元素, 而嵌套的选择器只匹配处于 所产生的作用域内的元素:
@scope (.light-scheme) {
  /* 仅匹配 light-scheme 内的链接 */
  a { color: darkmagenta; }
}

@scope (.dark-scheme) {
  /* 仅匹配 dark-scheme 内的链接 */
  a { color: plum; }
}

@scope (.media-object) {
  /* 仅匹配 media-object 内的作者图片 */
  .author-image { border-radius: 50%; }
}
通过提供作用域限制, 作者可以限制匹配更深层的后代。 例如:
@scope (.media-object) to (.content > *) {
  img { border-radius: 50%; }
  .content { padding: 1em; }
}

img选择器将仅匹配 DOM 片段中起始于任何 .media-object并包括其到 .content类的任何子节点的图像标签。

是否应在 作用域选择器的定义中添加作用域限制?

2.5.1. @scope 的影响

@scope at 规则对其包含的 样式规则有三个主要影响:

注意:嵌套不同, @scope 规则中的选择器 不会继承 @scope 前言中的父选择器的特异性。

以下选择器具有相同的特异性(0,0,1):
@scope (#hero) {
  img { border-radius: 50%; }
}

:where(#hero) img { border-radius: 50%; }

额外的 #hero 选择器特异性 不适用于作用域选择器的特异性。 然而,由于其中一个 img 选择器具有作用域, 因此该选择器在层叠中被赋予更高的权重, 通过应用作用域接近性

许多现有工具通过应用唯一的类或属性 给定作用域中的每个元素 或“单文件组件”来实现“作用域样式”。 在此示例中有两个作用域 (main-componentsub-component) 并且每个元素都通过使用 data-scope 属性标记为一个或两个作用域的一部分:
<section data-scope="main-component">
  <p data-scope="main-component">...<p>

  <!-- sub-component root is in both scopes -->
  <section data-scope="main-component sub-component">
    <!-- children are only in the inner scope -->
    <p data-scope="sub-component">...<p>
  </section>
</section>

然后这些自定义作用域属性会附加到 CSS 中的每个选择器上:

p[data-scope~='main-component'] { color: red; }
p[data-scope~='sub-component'] { color: blue; }

/* 两个部分都是外层作用域的一部分 */
section[data-scope~='main-component'] { background: snow; }

/* 内部部分也是内部作用域的一部分 */
section[data-scope~='sub-component'] { color: ghostwhite; }

使用 @scope 规则, 作者和工具可以仅通过将唯一的属性或类应用于 作用域根来复制类似的行为:

<section data-scope="main-component">
  <p>...<p>
  <section data-scope="sub-component">
    <p>...<p>
  </section>
</section>

然后类或属性可以用于同时建立上限和下限。 由下限选择器匹配的元素将被排除在结果作用域之外, 这样作者可以默认创建不重叠的作用域:

@scope ([data-scope='main-component']) to ([data-scope]) {
  p { color: red; }

  /* 仅外层部分是外层作用域的一部分 */
  section { background: snow; }
}

@scope ([data-scope='sub-component']) to ([data-scope]) {
  p { color: blue; }

  /* 内层部分仅是内部作用域的一部分 */
  section { color: ghostwhite; }
}

然而,作者可以使用子代组合器和通用选择器创建重叠的作用域边界, 使得内部作用域根成为两个作用域的一部分:

@scope ([data-scope='main-component']) to ([data-scope] > *) {
  p { color: red; }

  /* 两个部分都是外层作用域的一部分 */
  section { background: snow; }
}

2.5.2. @scope 的语法

@scope 规则的语法为:

@scope [(<scope-start>)]? [to (<scope-end>)]? {
  <rule-list>
}

其中:

伪元素不能作为作用域根作用域限制; 它们在 <scope-start><scope-end> 中都是无效的。

2.5.3. 作用域样式规则

作用域样式规则 与非作用域规则在以下方面有所不同:

默认情况下,作用域样式规则中的选择器是 相对选择器, 起始位置隐含了作用域根后代组合器。 以下选择器将匹配相同的元素:
@scope (#my-component) {
  p { color: green; }
  :scope p { color: green; }
}

作者可以通过添加显式的组合器来调整隐含的关系:

@scope (#my-component) {
  > p { color: green; }
  :scope > p { color: green; }
}

作者还可以在选择器中通过包含 作用域根 来定位或显式地对其进行定位, 使用 :scope&

@scope (#my-component) {
  :scope { border: thin solid; }
  & { border: thin solid; }

  main :scope p { color: green; }
  main & p { color: green; }
}

虽然:scope& 选择器 都可以引用作用域根, 但在此上下文中它们有不同的含义:

选择器匹配的差异

:scope 选择器将仅匹配 作用域根本身, 而& 选择器能够匹配任何由 <scope-start> 选择器列表 匹配的元素。

选择器特异性的差异

:scope 选择器的特异性 等同于其他伪类, 而& 选择器的特异性等于 <scope-start> 中 最特定的选择器。

2.5.4. 识别作用域根和限制

@scope 规则会根据以下方式生成一个或多个作用域

找到 作用域根

对于由 <scope-start> 匹配的每个元素, 使用该元素创建一个作用域作为 作用域根。 如果未指定 <scope-start>, 则 作用域根为定义 @scope 规则的样式表的 父元素。 (如果不存在这样的元素,并且包含的节点树是一个 影子树, 则 作用域根影子宿主。 否则, 作用域根为包含的 节点树的根节点。) <scope-start> 中的任何 :scope& 选择器在其外部上下文中定义。

找到任何 作用域限制

对于由 作用域根创建的每个 作用域, 其作用域限制设置为 匹配 <scope-end>在作用域内的所有元素, 解释 :scope&作用域样式规则 中完全相同。

作者可以通过省略 <scope-start> 选择器来为 style 元素建立局部作用域。 例如:
<div>
  <style>
    @scope {
      p { color: red; }
    }
  </style>
  <p>this is red</p>
</div>
<p>not red</p>

这相当于:

<div id="foo">
  <style>
    @scope (#foo) {
      p { color: red; }
    }
  </style>
  <p>this is red</p>
</div>
<p>not red</p>
作用域限制可以使用 :scope 伪类来要求与作用域根的特定关系:
/* .content 仅当它是 :scope 的直接子元素时才是限制 */
@scope (.media-object) to (:scope > .content) { ... }

作用域限制还可以通过使用 :scope 引用其作用域根外部的元素。 例如:

/* .content 仅当 :scope 位于 .sidebar 内时才是限制 */
@scope (.media-object) to (.sidebar :scope .content) { ... }

2.5.5. 作用域嵌套

@scope 规则可以嵌套。 在这种情况下,就像嵌套样式规则一样, 内部 @scope 的前导选择器(那些定义其 作用域) 由外部选择器限定

注意:对于进一步嵌套的 作用域样式规则,结果作用域实际上受到外部和内部 @scope 规则的约束, 但作用域根由最内部的 @scope 定义。 由于作用域接近度是测量 作用域样式规则的 对象与作用域根之间的距离, 所以对于嵌套的 @scope 规则,只有最内部的 @scope 才重要。

作用域接近度计算是否应受嵌套作用域的影响? [Issue #10795]

当在其他 @scope 规则中嵌套 @scope 规则, 或者在其他选择器中嵌套时, <scope-start> 选择器是相对于嵌套上下文的 相对选择器, 而 <scope-end> 和任何 作用域样式规则 则是相对于 作用域根。例如,以下代码:
@scope (.parent-scope) {
  @scope (:scope > .child-scope) to (:scope .limit) {
    :scope .content {
      color: red;
    }
  }
}

相当于:

@scope (.parent-scope > .child-scope) to (.parent-scope > .child-scope .limit) {
  .parent-scope > .child-scope .content {
    color: red;
  }
}

全局名称定义的at 规则, 例如 @keyframes@font-face@layer,如果定义在 @scope 内是有效的, 但它们不会被封闭的 @scope 规则所作用或影响。 但是,由这些规则包含的任何 样式规则(例如在 @layer 中) 都是作用域样式规则

2.6. 非CSS呈现提示的优先级

CSS Cascading 5 § 6.4 级联层

3. CSSOM

3.1. CSSScopeRule 接口

CSSScopeRule 接口表示 @scope 规则:

[Exposed=Window]
interface CSSScopeRule : CSSGroupingRule {
  readonly attribute CSSOMString? start;
  readonly attribute CSSOMString? end;
};
start 类型为 CSSOMString
start 属性返回序列化规则的 <scope-start> 的结果 (不包括外围括号), 如果没有 <scope-start>,则为 null。
end 类型为 CSSOMString
end 属性返回序列化规则的 <scope-end> 的结果 (不包括外围括号), 如果没有 <scope-end>,则为 null。

4. 更改

本附录是信息性的。

4.1. 自 2023 年 3 月 21 日工作草案以来的更改

2023 年 3 月 21 日工作草案以来的重大更改包括:

4.2. 自 2021 年 12 月 21 日首次公开工作草案以来的更改

2021 年 12 月 21 日首次公开工作草案以来的重大更改包括:

4.3. 自第 5 级以来的新增内容

第 5 级以来,添加了以下功能:

4.4. 自第 4 级以来的新增内容

第 4 级以来,添加了以下功能:

4.5. 自第 3 级以来的新增内容

第 3 级以来,添加了以下功能:

4.6. 自第 2 级以来的新增内容

第 2 级以来,添加了以下功能:

致谢

David Baron, Tantek Çelik, Keith Grant, Giuseppe Gurgone, Theresa O’Connor, Florian Rivoal, Noam Rosenthal, Simon Sapin, Jen Simmons, Nicole Sullivan, Lea Verou, 和 Boris Zbarsky 对本规范作出了贡献。

5. 隐私注意事项

6. 安全注意事项

一致性

文档约定

一致性要求通过描述性声明和 RFC 2119 术语的组合来表达。关键字“必须(MUST)”、“不得(MUST NOT)”、“必要(REQUIRED)”、“应(SHALL)”、“不得(SHALL NOT)”、“应该(SHOULD)”、“不应该(SHOULD NOT)”、“建议(RECOMMENDED)”、“可以(MAY)”和“可选(OPTIONAL)”在本规范的规范部分中应按照 RFC 2119 的描述进行解释。然而,为了可读性,这些词在本规范中不会全部以大写字母出现。

本规范的所有文本均为规范性内容,除非明确标记为非规范性部分、示例和注释。[RFC2119]

本规范中的示例以“例如”一词开头,或者与规范文本分开,使用 class="example",如下所示:

这是一个信息性示例。

信息性注释以“注意”一词开头,并与规范文本分开,使用 class="note",如下所示:

注意,这是一个信息性注释。

建议是规范性部分,旨在引起特别注意,并使用 <strong class="advisement"> 与其他规范性文本分开,例如:用户代理必须提供一个可访问的替代方案。

一致性类别

本规范的符合性定义了三种符合性类别:

样式表
一个 CSS 样式表
渲染器
一个解释样式表语义并渲染使用它们的文档的 用户代理(UA)
创作工具
一个编写样式表的 用户代理(UA)

如果样式表中使用的语法符合此模块定义的通用 CSS 语法和各个功能的语法,则该样式表符合本规范。

如果渲染器除了按照适当的规范解释样式表外,还正确解析并渲染本规范定义的所有功能,则该渲染器符合本规范。然而,因设备限制导致用户代理无法正确渲染文档的情况并不使其不符合规范。(例如,用户代理不要求在单色显示器上渲染颜色。)

如果创作工具编写的样式表符合此模块定义的通用 CSS 语法和各个功能的语法,并符合本模块描述的样式表的其他符合性要求,则该创作工具符合本规范。

部分实现

为了使作者能够利用向前兼容的解析规则分配回退值,CSS 渲染器必须将任何没有可用级别支持的 at 规则、属性、属性值、关键字和其他语法结构视为无效(并适当忽略)。特别是,用户代理不得在单个多值属性声明中选择性地忽略不受支持的组件值并保留受支持的值:如果某个值被视为无效(如不受支持的值必须是的那样),CSS 要求整个声明被忽略。

不稳定和专有功能的实现

为了避免与将来的稳定 CSS 功能发生冲突,CSS 工作组建议遵循最佳实践,以实现 不稳定的功能和 专有扩展

非实验性实现

一旦规范达到候选推荐阶段,非实验性实现就可以进行,且实现者应当发布任何 CR 级功能的无前缀实现,前提是它们可以证明其实现符合规范。

为了建立和保持 CSS 在不同实现中的互操作性,CSS 工作组要求非实验性的 CSS 渲染器在发布任何 CSS 功能的无前缀实现之前向 W3C 提交实现报告(如果需要,还要提交用于该实现报告的测试用例)。提交给 W3C 的测试用例将由 CSS 工作组进行审核和修订。

有关提交测试用例和实现报告的更多信息,请访问 CSS 工作组的网站:https://www.w3.org/Style/CSS/Test/。问题应发送至public-css-testsuite@w3.org 邮件列表。

索引

本规范定义的术语

引用定义的术语

参考文献

规范性引用

[CSS-ANIMATIONS-1]
David Baron 等. CSS 动画 第 1 级. 2023 年 3 月 2 日. WD. URL: https://www.w3.org/TR/css-animations-1/
[CSS-CASCADE-4]
Elika Etemad; Tab Atkins Jr. CSS 层叠和继承 第 4 级. 2022 年 1 月 13 日. CR. URL: https://www.w3.org/TR/css-cascade-4/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr. CSS 层叠和继承 第 5 级. 2022 年 1 月 13 日. CR. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-CONDITIONAL-5]
Chris Lilley; David Baron; Elika Etemad. CSS 条件规则模块 第 5 级. 2024 年 7 月 23 日. WD. URL: https://www.w3.org/TR/css-conditional-5/
[CSS-FONTS-5]
Chris Lilley. CSS 字体模块 第 5 级. 2024 年 2 月 6 日. WD. URL: https://www.w3.org/TR/css-fonts-5/
[CSS-NESTING-1]
Tab Atkins Jr.; Adam Argyle. CSS 嵌套模块. 2023 年 2 月 14 日. WD. URL: https://www.w3.org/TR/css-nesting-1/
[CSS-SCOPING-1]
Tab Atkins Jr.; Elika Etemad. CSS 作用域模块 第 1 级. 2014 年 4 月 3 日. WD. URL: https://www.w3.org/TR/css-scoping-1/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS 语法模块 第 3 级. 2021 年 12 月 24 日. CR. URL: https://www.w3.org/TR/css-syntax-3/
[CSS-TRANSITIONS-1]
David Baron 等. CSS 过渡. 2018 年 10 月 11 日. WD. URL: https://www.w3.org/TR/css-transitions-1/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS 值和单位模块 第 3 级. 2024 年 3 月 22 日. CR. URL: https://www.w3.org/TR/css-values-3/
[CSS21]
Bert Bos 等. 层叠样式表 第 2 级 修订版 (CSS 2.1) 规范. 2011 年 6 月 7 日. REC. URL: https://www.w3.org/TR/CSS21/
[CSSOM-1]
Daniel Glazman; Emilio Cobos Álvarez. CSS 对象模型 (CSSOM). 2021 年 8 月 26 日. WD. URL: https://www.w3.org/TR/cssom-1/
[CSSSTYLEATTR]
Tantek Çelik; Elika Etemad. CSS 样式属性. 2013 年 11 月 7 日. REC. URL: https://www.w3.org/TR/css-style-attr/
[DOM]
Anne van Kesteren. DOM 标准. 现行标准. URL: https://dom.spec.whatwg.org/
[FETCH]
Anne van Kesteren. Fetch 标准. 现行标准. URL: https://fetch.spec.whatwg.org/
[RFC2119]
S. Bradner. 在 RFC 中表示需求级别的关键字. 1997 年 3 月. 最佳现行实践. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECT]
Tantek Çelik 等. 选择器 第 3 级. 2018 年 11 月 6 日. REC. URL: https://www.w3.org/TR/selectors-3/
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr. 选择器 第 4 级. 2022 年 11 月 11 日. WD. URL: https://www.w3.org/TR/selectors-4/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 标准. 现行标准. URL: https://webidl.spec.whatwg.org/

参考性引用

[HTML]
Anne van Kesteren 等. HTML 标准. 现行标准. URL: https://html.spec.whatwg.org/multipage/

IDL 索引

[Exposed=Window]
interface CSSScopeRule : CSSGroupingRule {
  readonly attribute CSSOMString? start;
  readonly attribute CSSOMString? end;
};

问题索引

这是基于 CSS 层叠和继承 第 5 级 的差异规范。 它目前是一个探索性工作草案: 如果您正在实现任何内容,请使用第 5 级作为参考。 我们将在此草案达到 CR 时将第 5 级的内容合并进来。
CSS 层叠 5 § 6.2 层叠来源
CSS 层叠 5 § 6.3 重要声明:!important 注释
CSS 层叠 5 § 6.4 层叠层
CSS 层叠 5 § 6.4.3 层次顺序
应在 范围选择器 的定义中添加作用域限制吗?
作用域接近度的计算是否应该受到嵌套作用域的影响?[问题 #10795]
CSS 层叠 5 § 6.4 层叠层