CSS 包含模块第 3 级

W3C 工作草案,

关于此文档的更多细节
此版本:
https://www.w3.org/TR/2022/WD-css-contain-3-20220818/
最新发布版本:
https://www.w3.org/TR/css-contain-3/
编辑草案:
https://drafts.csswg.org/css-contain-3/
以前的版本:
历史:
https://www.w3.org/standards/history/css-contain-3
测试套件:
https://test.csswg.org/harness/results/css-contain-1_dev/
反馈:
CSSWG 问题库
文档内联问题
编辑:
Tab Atkins (Google)
Florian Rivoal (代表 Bloomberg)
Miriam E. Suzanne (特邀专家)
为此规范建议编辑:
GitHub 编辑器

摘要

此 CSS 模块描述了 contain 属性,该属性指示元素的子树独立于页面的其余部分。这在使用得当时使用户代理能够进行重大优化。

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

本文件状态

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

本文档由 CSS 工作组 作为 工作草案 使用 推荐 路径 发布。 作为工作草案发布 并不意味着 W3C 及其成员的认可。

这是一个草案文档 可能会随时更新、替换 或被其他文档废止。 引用此文档不适合作为其他工作进展。

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

本文档受 2021年11月2日 W3C 过程文档 的管理。

本文档由一个根据 W3C 专利政策 操作的组生成。 W3C 保持一个 公开的专利披露列表 该页面还包括披露专利的说明。 任何人如果确切了解一个专利,认为该专利 包含 基本权利要求,必须根据 W3C 专利政策第 6 节 披露该信息。

1. 引言

这是一个相较于 CSS Containment Level 2 的差异规范。 它目前是一个探索性工作草案: 如果您正在实施任何内容,请使用第 2 级作为参考。 一旦达到 CR,我们将把第 2 级文本合并到此草案中。

1.1. 模块交互

本文件定义了在早期规范中不存在的新特性。 此外,它旨在替代并取代 [CSS-CONTAIN-1],一旦稳定。

1.2. 值定义

本规范遵循 CSS 属性 定义规范,参考 [CSS2],使用 值定义语法,参考 [CSS-VALUES-3]。 本规范未定义的值类型在 CSS 值与单位 [CSS-VALUES-3] 中定义。 与其他 CSS 模块的组合可能会扩展这些值类型的定义。

除了在其定义中列出的特定属性值外, 本规范定义的所有属性 也接受 CSS-wide 关键字 作为其属性值。 为了可读性,它们未被明确重复。

2. 强包含性:contain 属性

CSS Containment 2 § 2 强包含性:contain 属性

名称: contain
新值: layout || style || paint || [ size | inline-size ]
inline-size
此值为元素启用 inline-size 包含。 这防止了其 inline-size主框 直接依赖于其内容。

注意: 仍然可能存在间接依赖, 见 § 3.1 Inline-Size Containment

3. 包含类型

CSS Containment 2 § 3 包含类型

3.1. 行内大小包含

给元素应用 行内大小包含大小 包含 应用于其 行内轴主要框 的尺寸。 这意味着 行内轴 固有 尺寸 被确定为好像该元素没有内容。 然而,内容仍然会如常影响框的 块轴 固有尺寸, 并且框可以在 块轴 中正常 分割

注意: 在某些情况下, 一个框的 块轴 固有 尺寸 可能会以影响父级 格式化上下文 的方式影响布局,从而影响框的 行内大小(例如,通过在祖先元素上触发滚动条), 造成框的 行内大小 依赖于其自身的内容。 如果这种改变的 行内大小 导致不同的 块大小, 那个新的 块大小 可能会进一步影响父级 格式化上下文, 但不会以重新回到先前有问题的布局的方式。

例如,如果引入了滚动条, 它们不会被移除, 即使随后的 块大小 小到不需要它们; 或者如果一个框的逻辑高度与一个位置较低的浮动相冲突,并且被清除到 也有更多可用的行内空间,因此变得短到不会冲突, 它不会被移回到其先前有问题的大小和位置。

因此,尽管 行内大小包含 防止 框的内容直接影响其 行内 大小 通过其 行内轴 固有 尺寸, 其 行内大小 仍然可能通过其内容的影响 间接依赖于其 块 大小

一般来说, 元素的行内大小与块大小之间的关系 是不可预测和非单调的, 块大小可以在行内大小变化时任意上下移动。 无限循环被防止 通过确保布局不会回退到先前(已知有问题)状态, 即使对约束的天真分析允许这种情况; 换句话说,布局始终“向前移动”。 我们相信当前的 CSS 布局规范已纳入此类规则, 但如果有任何遗漏, 请 通知 CSSWG 以便这些错误可以被 更正。

考虑这个例子, 其中浮动位置创建了块大小对行内大小的依赖:
<section style="width: 200px; border: solid; display: flow-root;">
  <div style="float: left; width: 50px; height: 80px; background: blue;"></div>
  <div style="float: right; width: 50px; height: 80px; background: blue;"></div>
  <div style="float: left; width: 160px; height: 80px; background: navy;"></div>

  <article style="border: solid orangered; display: flow-root; min-width: min-content">
    <div style="background: orange; aspect-ratio: 1/1;">
      Article
    </div>
  </article>
</section>
Article

块布局算法首先会放置浮动框,前两个框分别位于容器的左下角和右下角,第三个框由于过宽而被推到它们下面。

接下来,article 将被布局。由于它是 display: flow-root,它不能与任何浮动框交叉,因此在确定自身的大小和位置时,必须考虑它们。

布局引擎首先尝试将 article 与容器顶部对齐,结果为 100px 宽,足以容纳其 最小内容大小。然而,由于其子元素的 宽高比,这将导致 article 高度也为 100px,与下面的第三个浮动框交叉,因此这个布局机会被丢弃。

然后,它尝试将 article 与第三个浮动框顶部对齐,在它右侧窄 40px 宽的空间内。然而,由于 article最小宽度 使它太大,无法适应旁边的 40px 宽空间,因此它也被推到下面,形成一个 200px 的正方形,位于所有浮动框的下面。

文章

如果从 article 中移除 最小宽度,或者在 articleheader 上添加 行内大小包含(使得 最小宽度: 最小内容 解析为零),那么 article 将适应为 40px 的正方形,位于最后一个浮动 div 旁边(可能会有部分内容溢出)。

此时,article 的宽度和高度(各为 40px)将可以重新适应回第一个考虑的位置,与容器顶部对齐。然而,该框不会返回到先前的位置,因为布局引擎已经知道,这个位置会导致无效布局。

给一个元素 行内大小包含 没有任何效果,如果以下任何条件为真:

4. 容器查询

虽然 媒体查询 提供了一种查询文档显示的用户代理或设备环境 的方法(如视口尺寸或用户偏好),容器查询 允许测试文档内元素的某些方面 (如盒子尺寸或计算样式)。

默认情况下,所有元素都是 查询容器,用于 容器样式查询, 并可以通过使用 container-type 属性 (或 container 简写)来指定额外的查询类型, 以使其成为 查询容器,用于 容器大小 查询。应用于 查询容器 的样式规则 可以通过查询条件来调整, 使用 @container 条件分组规则

例如,我们可以将主内容区域和侧边栏定义为容器, 然后描述一个 .media-object,该对象根据其容器的大小 从垂直布局变为水平布局:
main, aside {
  container: my-layout / inline-size;
}

.media-object {
  display: grid;
  grid-template: 'img' auto 'content' auto / 100
  %;
}

@container my-layout (inline-size > 45
  em) {
  .media-object {
    grid-template: 'img content'
    auto / auto 1fr;
  }
}

主区域和侧边栏中的媒体对象将响应各自的容器上下文。

对于带有伪元素的选择器,可以通过 包含阴影的包容祖先 来建立查询容器, 这是 最终 来源元素 的。

因此:
::before 选择器查询源元素的大小:
<style>
  #container {
    width: 100px;
    container-type: inline-size;
  }
  @container (inline-size < 150px) {
    #inner::before {
      content: "BEFORE";
    }
  }
</style>
<div id=container>
  <span id=inner></span>
</div>
::slotted() 选择器用于样式化影子宿主子元素,可以查询影子树中的容器:
<div id=host style="width:200px">
  <template shadowroot=open>
    <style>
      #container {
        width: 100px;
        container-type: inline-size;
      }
      @container (inline-size < 150px) {
        ::slotted(span) {
          color: green;
        }
      }
    </style>
    <div id=container>
      <slot />
    </div>
  </template>
  <span id=slotted>Green</span>
</div>

4.1. 创建查询容器: container-type 属性

名称: container-type
值: normal || [ size | inline-size ]
初始: normal
适用: 所有元素
继承:
百分比: 不适用
计算值: 关键字 normal 或一个或多个 sizeinline-size
规范顺序: 根据语法
动画类型: 不可动画

container-type 属性将元素定义为 查询容器,用于需要显式包含的 容器查询 (例如 容器大小查询),允许 样式规则 来样式化其后代,以查询其大小和布局的各个方面,并做出相应的响应。

除非另有说明,所有元素都是 查询容器,用于不需要显式包含的 容器查询 (例如 容器样式查询),无论指定的 container-type 如何。

值具有以下含义:

size
建立一个 查询容器,用于 容器大小查询,适用于 行内块轴。 应用 布局包含样式包含,以及 大小包含主盒子
inline-size
建立一个 查询容器,用于 容器大小查询,适用于容器的自身 行内轴。 应用 布局包含样式包含,以及 行内大小包含主盒子
normal
该元素不是任何 查询容器,对于 容器大小查询, 但仍然是 查询容器 对于 容器样式查询
例如,作者可以创建容器响应式排版, 调整 font-sizeline-height 和其他排版问题 基于容器的大小:
aside, main {
  container-type: inline-size;
}

h2 { font-size: 1.2em; }

@container (width > 40em) {
  h2 { font-size: 1.5em; }
}

在查询条件中使用的 40em 值 与相关 计算值 相关的 font-size 在相关的 查询容器 上。

容器还可以暴露计算的样式值以供查询。 这对于在多个属性之间切换行为非常有用:
section {
  container-type: style;
}

@container (--cards: small) {
  article {
    border: thin solid silver;
    border-radius: 0.5em;
    padding: 1em;
  }
}

4.2. 命名查询容器:container-name 属性

名称: container-name
值: none | <custom-ident>+
初始值: none
适用对象: 所有元素
继承:
百分比: 不适用
计算值: 关键字 none,或有序的 标识符 列表
规范顺序: 按语法
动画类型: 不可动画

container-name 属性 指定一组 查询容器名称。 这些名称可以被 @container 规则 用来过滤目标 查询 容器

none
查询容器 没有 查询 容器名称
<custom-ident>
指定一个 查询容器名称,作为一个 标识符。 关键字 nonenot、以及 被排除在此 <custom-ident> 之外。
在某些情况下,我们想查询特定容器的某些方面, 即使它不是最近的祖先容器。 例如,我们可能想查询主内容区域的高度, 以及更嵌套的内联容器的宽度。
main {
  container-type: size;
  container-name: my-page-layout;
}

.my-component {
  container-type: inline-size;
  container-name: my-component-library;
}

@container my-page-layout (block-size > 12em) {
  .card { margin-block: 2em; }
}

@container my-component-library (inline-size > 30em) {
  .card { margin-inline: 2em; }
}

4.3. 创建命名容器:container 简写

名称: container
值: <'container-name'> [ / <'container-type'> ]?
初始值: 见各个属性
适用于: 见各个属性
继承: 见各个属性
百分比: 见各个属性
计算值: 见各个属性
动画类型: 见各个属性
标准顺序: 按语法

container 简写属性 同时设置 container-typecontainer-name 在同一声明中。 如果省略了 <'container-type'>, 它会重置为其初始值

我们可以使用简写语法定义 container-typecontainer-name
main {
  container: my-layout / size;
}

.grid-item {
  container: my-component / inline-size;
}

4.4. 容器查询:@container 规则

@container 规则 是一个 条件组规则,其条件是 一个 容器查询, 这是一个布尔组合的 容器大小查询 和/或 容器样式查询。 在 <样式表> 块中的样式声明 在 @container 规则中 仅在 容器查询 对其元素的 查询容器 为真时生效。

@container 规则的语法是:

@container [ <container-name> ]? <container-condition> {
  <stylesheet>
}

其中:

<container-name> = <custom-ident>
<container-condition> = not <query-in-parens>
                      | <query-in-parens> [ [ and <query-in-parens> ]* | [ or <query-in-parens> ]* ]
<query-in-parens>     = ( <container-condition> )
                      | ( <size-feature> )
                      | style( <style-query> )
                      | <general-enclosed>

<style-query>         = <style-condition> | <style-feature>
<style-condition>     = not <style-in-parens>
                      | <style-in-parens> [ [ and <style-in-parens> ]* | [ or <style-in-parens> ]* ]
<style-in-parens>     = ( <style-condition> )
                      | ( <style-feature> )
                      | <general-enclosed>

关键字 nonenot 被排除在上面的 <custom-ident> 之外。

对于每个元素, 要查询的 查询容器 是从元素的祖先 查询容器 中选择的,这些查询容器 被确认为所有 容器特性 的有效 查询容器<container-condition> 中。 可选的 <container-name> 过滤考虑的 查询容器 集合,仅限于那些具有匹配的 查询容器名称

一旦为一个元素选择了一个合格的 查询 容器, 在 <container-condition> 中的每个 容器特性 都会针对该 查询容器 进行评估。 如果没有祖先是合格的 查询容器, 那么该元素的 容器查询 将是 未知 的。

媒体查询 类似, 我们可以在单个查询列表中串联多个条件:
@container card (inline-size > 30em) and style(--responsive: true) {
  /* 样式 */
}

上述样式仅在存在名为 "card" 的祖先容器,并且满足 inline-size样式 条件时应用。

在多个嵌套的 容器查询 中定义的样式规则,仅在所有包装的 容器查询 对该元素为真时应用。

注意: 嵌套的 容器查询 可以相对于不同的容器进行评估, 因此并不总是可以将单个 <container-condition> 合并 为一个单一的查询。

虽然在单个 容器查询 中 不能查询多个容器, 但可以通过嵌套多个查询来实现:
@container card (inline-size > 30em) {
  @container style(--responsive: true) {
    /* 样式 */
  }
}

上述样式仅在存在名为 "card" 的祖先容器,并且满足 inline-size 条件时应用, 以及满足 样式 条件的祖先容器。

全局、命名定义的 at-rules@keyframes@font-face@layer 定义在 容器查询 内部时,不受 容器查询 条件的限制。

4.5. 动画容器

容器查询的评估变化必须是样式变化事件的一部分, 即使变化是由于动画效果引起的。

一个兄弟元素上的过渡可以间接影响容器的大小, 触发样式变化事件,每当容器查询 由于变化评估而改变时:
main {
  display: flex;
  width: 300px;
}

#container {
  container-type: inline-size;
  flex: 1;
}

/* 初始解析宽度为200px,但随着过渡的进行而改变。 */
#inner {
  transition: 1s background-color;
  background-color: tomato;
}

/* 当此容器查询开始(或停止)应用时,#inner的background-color上必须开始一个过渡。 */
@container (width <= 150px) {
  #inner {
    background-color: skyblue;
  }
}

#sibling {
  width: 100px;
  transition: width 1s;
}

#sibling:hover {
  width: 200px;
}
<main>
  <div id=container>
    <div id=inner>Inner</div>
  </div>
  <div id=sibling>Sibling</div>
</main>

计算值引起的变化容器查询长度单位 也必须是样式变化事件的一部分。

5. 容器特性

A container feature 查询特定方面的查询容器

5.1. 尺寸容器特性

A container size query 允许查询 查询 容器主要盒子的大小。 它是单个 尺寸特性 (<size-feature>) 的布尔组合,每个查询特定的维度特性 查询容器<size-feature> 的语法与媒体特性相同: 一个特性名称、一个比较器和一个值。 [mediaqueries-5]尺寸特性组合成一个尺寸查询的布尔语法和逻辑与CSS特性查询相同。 (参见@supports[CSS-CONDITIONAL-3])

如果查询容器 没有主要盒子, 或主要盒子不是布局包含盒子, 或者查询容器在相关轴上不支持容器大小查询, 则评估尺寸特性的结果未知。

相对长度单位 (包括容器查询长度单位) 在容器查询 条件中 根据计算值 进行评估,评估基于查询容器

注意:这与相对单位在媒体查询中的处理不同。

例如,具有不同字体大小的查询容器 将根据其自身的字体大小评估基于em的查询:
aside, main {
  container-type: inline-size;
}

aside { font-size: 16px; }
main { font-size: 24px; }

@container (width > 40em) {
  h2 { font-size: 1.5em; }
}

查询条件中使用的40em值 相对于相关计算值font-size在相关的查询容器上:

5.1.1. 宽度: width 特性

名称: 宽度
适用于: @container
值: <长度>
类型: 范围

宽度 容器特性 查询宽度查询容器内容框

5.1.2. 高度: height 特性

名称: 高度
适用于: @container
值: <长度>
类型: 范围

高度 容器特性 查询高度查询容器内容框

5.1.3. 行内大小: inline-size 特性

名称: 行内大小
适用于: @container
值: <长度>
类型: 范围

行内大小 容器特性 查询大小查询容器内容框查询 容器行内轴中。

5.1.4. 块大小: block-size 特性

名称: block-size
适用于: @container
值: <长度>
类型: 范围

block-size 容器特性 查询 大小查询容器内容框查询 容器块轴 中。

5.1.5. 纵横比: aspect-ratio 特性

名称: aspect-ratio
适用于: @container
值: <ratio>
类型: 范围

aspect-ratio 容器特性 定义为宽度 容器特性高度 容器特性的比值。

5.1.6. 方向: orientation 特性

名称: orientation
适用于: @container
值: portrait | landscape
类型: 离散
portrait
高度 容器特性 大于或等于宽度 容器特性时,方向 容器特性portrait
landscape
否则方向landscape

5.2. 样式容器特性

一个 容器样式查询 允许查询 计算值查询容器。 它是个布尔组合,包含单独的 样式特性 (<style-feature>) 每个查询一个特定属性的 查询容器<style-feature> 的语法与 声明 [CSS-SYNTAX-3] 相同, 当给定属性在 查询容器 上的 计算值 与给定值匹配时,其查询为真 (该值也相对于 查询容器 计算), 当属性或其值无效或不支持时为未知, 其他情况为假。 布尔语法和逻辑将 样式特性 组合成 样式查询 的方法与 CSS 特性查询 相同。 (请参见 @supports[CSS-CONDITIONAL-3]

样式特性 查询一个 简写属性 时,如果 计算值 对于每个 长属性 匹配,则为真, 否则为假。

级联依赖关键字,例如 revertrevert-layer, 在 样式特性 中作为值无效, 并导致 容器样式查询 为假。

注意: 剩余的非级联依赖 CSS广泛 关键字计算 时相对于 查询容器, 与其他值相同。

6. 容器相对长度: cqw, cqh, cqi, cqb, cqmin, cqmax 单位

容器查询长度单位指定相对于查询容器的长度。 使用容器查询长度单位的样式表可以更容易地将组件从一个查询容器移动到另一个。

容器查询长度单位有:

容器单位的说明性摘要
单位 相对于
cqw 查询容器的宽度的1%
cqh 查询容器的高度的1%
cqi 查询容器的内联大小的1%
cqb 查询容器的块大小的1%
cqmin 较小的cqicqb的值
cqmax 较大的cqicqb的值

对于每个元素,容器查询长度单位被评估为在相关轴(或轴)上进行容器大小查询。 每个轴的查询容器是最近的接受该轴上的容器大小查询的祖先容器。 如果没有合格的查询容器可用,则使用该轴的小视口大小

注意: 在某些情况下,同一元素上的cqicqb单位将相对于不同的查询容器进行评估。 类似地,cqmincqmax单位表示cqicqb单位中的较大或较小值,即使这些维度来自不同的查询容器

子元素不会继承其父元素指定的相对值; 它们继承计算值

作者可以通过将容器查询长度单位应用于依赖于相同container-type容器查询来确保具有适当的查询容器。 自定义回退值可以在容器查询外部定义:
/* 回退值不依赖于包含 */
h2 {font-size:1.2em;}

@container (inline-size >= 0px) {
  /* 仅在可用内联大小容器时应用 */
  h2 { font-size: calc(1.2em + 1cqi); }
}

7. API

7.1. CSSContainerRule 接口

CSSContainerRule 接口表示一个 @container 规则。

[Exposed=Window]
interface CSSContainerRule : CSSConditionRule {
};
conditionText 类型为 CSSOMString(CSSContainerRule 特定于 CSSConditionRule 的属性定义)
conditionText 属性(定义在 CSSConditionRule 父规则上), 在获取时,必须返回指定的条件, 而不进行任何逻辑简化, 以便返回的条件在任何符合本规范的实现中 (包括实现本规范中允许的未来扩展的实现) 都会评估为与指定条件相同的结果。 换句话说, 允许令牌流简化 (例如将空格减少为一个空格 或在已知为可选的情况下省略它), 但不允许逻辑简化(例如删除不必要的括号, 或基于结果评估进行简化)。

为 CSSContainerRule 添加 CSSOM API [问题 #7033]

Container Queries 应该具有 matchContainer 方法。 这将基于 matchMedia()MediaQueryList 接口建模, 但应用于元素而不是窗口。 在测量布局大小时,它的行为类似于 resizeObserver, 但提供了额外的 Container Query 语法和功能。 [问题 #6205]

8. 完全抑制元素内容:content-visibility 属性

CSS Containment 2 § 4 完全抑制元素内容:content-visibility 属性

9. 隐私和安全考虑

CSS Containment 2 § 5 隐私和 安全考虑

附录 A. 变更

本附录为信息性

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

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

CSS Containment Level 2 的变更

CSS Containment 2 §  变更

致谢

感谢以下人员的评论和先前的工作: Adam Argyle, Amelia Bellamy-Royds, Anders Hartvoll Ruud, Brian Kardell, Chris Coyier, Christopher Kirk-Nielsen, David Herron, Elika J. Etemad (fantasai), Eric Portis, Ethan Marcotte, Geoff Graham, Gregory Wild-Smith, Ian Kilpatrick, Jen Simmons, Kenneth Rohde Christiansen, L. David Baron, Lea Verou, Martin Auswöger, Martine Dowden, Mike Riethmuller, Morten Stenshorne, Nicole Sullivan, Rune Lillesveen, Scott Jehl, Scott Kellum, Stacy Kvernmo, Theresa O’Connor, Una Kravets, 以及其他许多人对本规范的贡献。

一致性

文档约定

一致性要求通过描述性断言和 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样式表
渲染器
一个用户代理,其解释样式表的语义并渲染使用这些样式表的文档。
创作工具
一个用户代理,其编写样式表。

如果样式表中的所有语句使用本模块中定义的语法都根据通用 CSS 语法和本模块中定义的每个特性的单独语法有效,则样式表符合本规范。

如果渲染器在解释样式表时,除了按照适当的规范解释样式表外,还支持本规范定义的所有特性,通过正确解析它们并相应地渲染文档,则渲染器符合本规范。然而,用户代理由于设备的限制而无法正确渲染文档并不会使其不符合规范。(例如,用户代理不要求在单色显示器上渲染颜色。)

如果创作工具编写的样式表根据通用 CSS 语法和本模块中每个特性的单独语法是语法正确的,并满足本模块中描述的样式表的所有其他一致性要求,则创作工具符合本规范。

部分实现

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

不稳定和专有特性的实现

为了避免与未来稳定 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]
Dean Jackson; et al. CSS 动画 1 级. 2018 年 10 月 11 日. WD. URL: https://www.w3.org/TR/css-animations-1/
[CSS-BOX-4]
Elika Etemad. CSS 盒子模型模块 4 级. 2020 年 4 月 21 日. WD. URL: https://www.w3.org/TR/css-box-4/
[CSS-BREAK-3]
Rossen Atanassov; Elika Etemad. CSS 碎片化模块 3 级. 2018 年 12 月 4 日. CR. URL: https://www.w3.org/TR/css-break-3/
[CSS-CASCADE-4]
CSS 层叠和继承 4 级 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-3]
David Baron; Elika Etemad; Chris Lilley. CSS 条件规则模块 3 级. 2022 年 1 月 13 日. CR. URL: https://www.w3.org/TR/css-conditional-3/
[CSS-CONTAIN-1]
Tab Atkins Jr.; Florian Rivoal. CSS 包含模块 1 级. 2020 年 12 月 22 日. REC. URL: https://www.w3.org/TR/css-contain-1/
[CSS-CONTAIN-2]
CSS 包含模块 2 级 URL: https://drafts.csswg.org/css-contain-2/
[CSS-DISPLAY-3]
Tab Atkins Jr.; Elika Etemad. CSS 显示模块 3 级. 2021 年 9 月 3 日. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-FONTS-5]
Myles Maxfield; Chris Lilley. CSS 字体模块 5 级. 2021 年 12 月 21 日. WD. URL: https://www.w3.org/TR/css-fonts-5/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS 盒子大小模块 3 级. 2021 年 12 月 17 日. WD. URL: https://www.w3.org/TR/css-sizing-3/
[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; et al. CSS 过渡. 2018 年 10 月 11 日. WD. URL: https://www.w3.org/TR/css-transitions-1/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS 值和单位模块 3 级. 2019 年 6 月 6 日. CR. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 值和单位模块 4 级. 2021 年 12 月 16 日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS 写作模式 4 级. 2019 年 7 月 30 日. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS2]
Bert Bos; et al. 层叠样式表 2 级修订版 1 (CSS 2.1) 规范. 2011 年 6 月 7 日. REC. URL: https://www.w3.org/TR/CSS21/
[CSSOM-VIEW-1]
Simon Pieters. CSSOM 视图模块. 2016 年 3 月 17 日. WD. URL: https://www.w3.org/TR/cssom-view-1/
[DOM]
Anne van Kesteren. DOM 现行标准. 现行标准. URL: https://dom.spec.whatwg.org/
[MEDIAQUERIES-5]
Dean Jackson; et al. 媒体查询 5 级. 2021 年 12 月 18 日. WD. URL: https://www.w3.org/TR/mediaqueries-5/
[RFC2119]
S. Bradner. 在 RFC 中使用的关键字以指示要求级别. 1997 年 3 月. 最佳当前实践. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. 选择器 4 级. 2022 年 5 月 7 日. WD. URL: https://www.w3.org/TR/selectors-4/
[WEB-ANIMATIONS-1]
Brian Birtles; et al. 网页动画. 2021 年 5 月 18 日. WD. URL: https://www.w3.org/TR/web-animations-1/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 现行标准. 现行标准. URL: https://webidl.spec.whatwg.org/

信息性参考文献

[CSS-FONTS-4]
John Daggett; Myles Maxfield; Chris Lilley. CSS 字体模块 4 级. 2021 年 12 月 21 日. WD. URL: https://www.w3.org/TR/css-fonts-4/
[CSS-PSEUDO-4]
Daniel Glazman; Elika Etemad; Alan Stearns. CSS 伪元素模块 4 级. 2020 年 12 月 31 日. WD. URL: https://www.w3.org/TR/css-pseudo-4/
[CSS-SCOPING-1]
Tab Atkins Jr.; Elika Etemad. CSS 范围模块 1 级. 2014 年 4 月 3 日. WD. URL: https://www.w3.org/TR/css-scoping-1/
[CSS-SHADOW-PARTS-1]
Tab Atkins Jr.; Fergal Daly. CSS 阴影部分. 2018 年 11 月 15 日. WD. URL: https://www.w3.org/TR/css-shadow-parts-1/
[CSS-SIZING-4]
Tab Atkins Jr.; Elika Etemad; Jen Simmons. CSS 盒子大小模块 4 级. 2021 年 5 月 20 日. WD. URL: https://www.w3.org/TR/css-sizing-4/
[FULLSCREEN]
Philip Jägenstedt. 全屏 API 现行标准. 现行标准. URL: https://fullscreen.spec.whatwg.org/

属性索引

名称 初始值 适用元素 继承 %ages 动画类型 规范顺序 计算值
container <'container-name'> [ / <'container-type'> ]? 参见各个属性 参见各个属性 参见各个属性 参见各个属性 参见各个属性 根据语法 参见各个属性
container-name none | <custom-ident>+ none 所有元素 n/a 不可动画 根据语法 关键字 none,或有序标识符列表
container-type normal || [ size | inline-size ] normal 所有元素 n/a 不可动画 根据语法 关键字 normal 或一个或多个 size、inline-size

@container 描述符

名称 初始值 类型
aspect-ratio <ratio> 范围
block-size <length> 范围
height <length> 范围
inline-size <length> 范围
orientation portrait | landscape 离散
width <length> 范围

IDL 索引

[Exposed=Window]
interface CSSContainerRule : CSSConditionRule {
};

问题索引

这是对 CSS Containment Level 2 的差异规范。 目前这是一个探索性工作草案: 如果您正在实现任何内容,请以第二级作为参考。 一旦第二级文本达到 CR,我们将把它合并到此草案中。
CSS Containment 2 § 2 强约束:contain 属性
CSS Containment 2 § 3 约束类型
一般来说,元素的行内大小 和块大小之间的关系 是不可预测和非单调的, 块大小可能会随行内大小的变化 而任意上下波动。 无限循环被防止 通过确保布局不会恢复到先前的(已知有问题的)状态, 即使对约束的简单分析允许如此; 换句话说,布局始终“向前移动”。 我们相信当前的 CSS 布局规范包含了这样的规则, 但在它们不包含的情况下, 请 通知 CSSWG 以便这些错误可以被 纠正。
添加 CSSContainerRule 的 CSSOM API [Issue #7033]
Container Queries 应该有一个 matchContainer 方法。 这将以 matchMedia()MediaQueryList 接口为模型, 但应用于元素而不是窗口。 在测量布局大小时,它的行为类似于 resizeObserver, 但提供了额外的 Container Query 语法和特性。 [Issue #6205]
CSS Containment 2 § 4 完全抑制元素内容:content-visibility 属性
CSS Containment 2 § 5 隐私和安全考虑
CSS Containment 2 §  变更