CSS 包含模块第 3 级

W3C 工作草案

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

摘要

本 CSS 模块描述了 contain 属性,该属性表明元素的子树与页面的其余部分无关。在合理使用时,这使得用户代理能够进行大量的性能优化。

CSS 是一种用于描述结构化文档(如 HTML 和 XML)在屏幕、纸张等介质上渲染方式的语言。

关于本文档

本部分描述了本文档在发布时的状态。当前 W3C 出版物列表及本技术报告的最新版本可在 W3C 技术报告索引(https://w3org.cn/TR/)中找到。

本文件由 CSS 工作组推荐标准轨道 (Recommendation track) 下的 工作草案 (Working Draft) 形式发布。以工作草案形式发布并不代表 W3C 及其成员的认可。

这是一份草案文档,可能会随时被其他文档更新、替换或废弃。将其作为非进行中工作引用是不恰当的。

请通过 在 GitHub 提交 Issue(首选)发送反馈,在标题中包含规范代号 “css-contain”,如:“[css-contain] …评论摘要…”。所有 Issue 和评论均 归档。也可将反馈发送至(归档)公共邮件列表 www-style@w3.org

本文档受 2021 年 11 月 2 日版 W3C 流程文档管辖。

本文档由在 W3C 专利政策下运作的组织制作。W3C 维护一份与该组织交付成果相关的 公开专利披露列表;该页面还包含披露专利的说明。任何知悉其认为包含 必要权利要求 的专利的个人,必须按照 W3C 专利政策第 6 节披露该信息。

1. 简介

本文档是 CSS 包含级别 2 的差异规范。它目前处于探索性工作草案阶段:如果您正在进行实现,请以级别 2 作为参考。一旦达到 CR(候选推荐标准)阶段,我们将把级别 2 的文本合并到本草案中。

1.1. 模块交互

本文档定义了早期规范中不存在的新功能。此外,它旨在稳定后取代并超越 [CSS-CONTAIN-1]

1.2. 值定义

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

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

2. 强包含:contain 属性

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

名称contain
新值 layout || style || paint || [ size | inline-size ]
inline-size
此值开启该元素的内联尺寸包含。这防止了其主体盒 (principal box)内联尺寸直接依赖于其内容。

注意:仍然可能存在间接依赖关系,请参阅 § 3.1 内联尺寸包含

3. 封装类型

CSS 包含 2 § 3 包含类型

3.1. 内联尺寸包含

为元素赋予内联尺寸包含,会将尺寸包含应用于其主体盒内联轴 (inline-axis) 尺寸调整。这意味着内联轴固有尺寸 (intrinsic sizes)主体盒被确定的方式就好像该元素没有内容一样。然而,内容会继续照常影响盒子的块级轴 (block-axis) 固有尺寸,并且该盒子被允许在块级轴上正常分片 (fragment)

注意:在某些情况下,盒子的块级轴固有尺寸可能会以影响盒子内联尺寸的方式影响父级格式化上下文中的布局(例如通过触发祖先元素上的滚动条),从而使盒子的内联尺寸产生对其自身内容的依赖。如果这种改变后的内联尺寸导致了不同的块级尺寸,则该新的块级尺寸可能会循环影响父级格式化上下文,但不会使其回到先前出现问题的布局状态。

例如,如果引入了滚动条,即使随后的块级尺寸足够小而不需要它们,也不会将其移除;或者如果一个盒子的逻辑高度与下方放置的浮动元素碰撞,并被清除到它也拥有更多可用内联空间且因此变得足够短而没有碰撞的位置,它也不会被移回其先前出现问题的尺寸和位置。

因此,尽管内联尺寸包含防止了盒子的内容通过其内联轴固有尺寸直接影响其内联尺寸,但其内联尺寸仍可能通过内容对其块级尺寸的影响而间接依赖于其内容。

通常,元素的内联尺寸与其块级尺寸之间的关系是不可预测且非单调的,块级尺寸可能会随着内联尺寸的改变而任意上下移动。通过确保布局不会回退到先前的(已知有问题的)状态来防止无限循环,即使对约束的简单分析允许这样做;换句话说,布局总是“向前移动”。我们相信当前的 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 将被布局。因为它被设置为 display: flow-root,它不能与任何浮动相交,因此在计算如何调整自身尺寸和位置时必须将它们考虑在内。

布局引擎首先尝试将 article 与容器顶部对齐放置,导致 100px 的宽度,这足够宽以容纳其最小内容尺寸。然而,由于其子元素的纵横比,这也会导致 article 的高度为 100px,这将与下方 80px 处的第三个浮动元素相交,因此该布局方案被丢弃。

然后它尝试将 article 与第三个浮动元素的顶部对齐,放置在其右侧 40px 宽的狭窄空间中。然而,由于 article最小宽度使其太大而无法放入第三个浮动元素旁边的 40px 宽空间,它也移动到了该元素下方,在所有浮动框下方形成了一个 200px 的正方形。

文章

如果从 article 中移除最小宽度,或者如果将内联尺寸包含添加到 articleheader(导致 min-width: min-content 解析为零),那么 article 将作为 40px 的正方形放入最后一个浮动 div 的旁边(内容可能会溢出)。

此时,article 的宽度和高度(各 40px)*将*能回到之前考虑的空间,与容器顶部对齐。然而,该盒子不会回到之前的位置,因为布局引擎已经知道该位置会导致无效布局。

如果以下任何条件成立,赋予元素内联尺寸包含将无效:

4. 容器查询

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

默认情况下,所有元素都是用于容器样式查询查询容器,并可以通过使用 container-type 属性(或 container 简写属性)指定额外的查询类型,确立为容器尺寸查询查询容器。应用于查询容器包含 Shadow DOM 的后代的样式规则,可以通过使用 @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 > 45em) {
  .media-object {
    grid-template: 'img content' auto / auto 1fr;
  }
}

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

对于带有伪元素的选定器,查询容器可以由包含 Shadow DOM 的包含祖先确立,作为最终起源元素

由此可知:
一个 ::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
应用于 所有元素
可继承
百分比 不可用
计算值 关键字 normalsizeinline-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>
查询容器名称指定为标识符。关键字 noneandnotor 从此 <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 规则的 <stylesheet> 块内的样式声明由其条件过滤,仅当容器查询对其元素的查询容器为真时才匹配。

@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>

关键字 noneandnotor 从上面的 <custom-ident> 中排除。

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

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

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

上述样式仅在存在名为 "card" 的祖先容器且同时满足内联尺寸样式条件时才会被应用。

定义在多个嵌套容器查询内部的元素上的样式规则,在该元素的所有外层容器查询都为真时应用。

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

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

上述样式仅在存在名为 "card" 的祖先容器满足内联尺寸条件,且存在满足样式条件的祖先容器时才会被应用。

容器查询内部定义的全局名称定义预定义规则(如 @keyframes@font-face@layer)不受容器查询条件的约束。

4.5. 动画容器

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

同级元素上的过渡可以间接影响容器的大小,从而在容器查询评估因此发生变化时触发样式变更事件
main {
  display: flex;
  width: 300px;
}

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

/* Resolved width is initially 200px, but changes as the transition
   on #sibling progresses. */
#inner {
  transition: 1s background-color;
  background-color: tomato;
}

/* When this container query starts (or stops) applying, a transition
   must start on background-color on #inner. */
@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. 容器特性

容器特性查询查询容器的特定方面。

5.1. 尺寸容器特性

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

如果查询容器没有主体盒,或者主体盒不是布局包含盒,或者查询容器不支持相关轴上的容器尺寸查询,则评估尺寸特性的结果为 unknown。

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

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

例如,具有不同 font-size 的查询容器将相对于其自身的 font-size 评估基于 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 特性

名称width
对于@container
<length>(长度)
类型值域 (range)

width 容器特性查询查询容器主体盒内容盒 (content box) 宽度。

5.1.2. 高度:height 特性

名称height
对于@container
<length>(长度)
类型值域 (range)

height 容器特性查询查询容器内容盒高度。

5.1.3. 内联尺寸:inline-size 特性

名称inline-size
对于@container
<length>(长度)
类型值域 (range)

inline-size 容器特性查询查询容器内容盒查询容器内联轴上的尺寸

5.1.4. 块级尺寸:block-size 特性

名称block-size
对于@container
<length>(长度)
类型值域 (range)

block-size 容器特性查询查询容器内容盒查询容器块级轴上的尺寸

5.1.5. 纵横比:aspect-ratio 特性

名称aspect-ratio
对于@container
<ratio>
类型值域 (range)

aspect-ratio 容器特性定义为 width 容器特性的值与 height 容器特性的值之比。

5.1.6. 方向:orientation 特性

名称orientation
对于@container
portrait | landscape
类型离散 (discrete)
portrait
height 容器特性的值大于或等于 width 容器特性的值时,orientation 容器特性portrait
landscape
否则 orientationlandscape

5.2. 样式容器特性

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

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

级联依赖关键字(如 revertrevert-layer)作为样式特性中的值是无效的,会导致容器样式查询为假。

注意:其余非级联依赖的CSS 范围关键字相对于查询容器进行计算,与其他值相同。

6. 容器相对长度:cqwcqhcqicqbcqmincqmax 单位

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

容器查询长度单位为

容器单位信息摘要
unit相对于
cqw 查询容器宽度的 1%
cqh 查询容器高度的 1%
cqi 查询容器内联尺寸的 1%
cqb 查询容器块级尺寸的 1%
cqmin cqicqb 中的较小值
cqmax cqicqb 中的较大值

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

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

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

作者可以通过在依赖相同 container-type容器查询内部应用容器查询长度单位,确保它们拥有合适的查询容器。自定义回退值可以在容器查询外部定义
/* The fallback value does not rely on containment */
h2 { font-size: 1.2em; }

@container (inline-size >= 0px) {
  /* only applies when an inline-size container is available */
  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 父规则上),在获取时,必须返回指定的条件,不包含任何逻辑简化,以便返回的条件在符合本规范的任何实现中(包括实现本规范中允许的 <general-enclosed> 可扩展性机制的实现)都将评估为与指定条件相同的结果。换句话说,允许标记流简化(例如将空白减少为单个空格或在已知为可选的情况下省略),但不允许逻辑简化(例如删除不必要的括号或基于评估结果的简化)。

为 CSSContainerRule 添加 CSSOM API [Issue #7033]

容器查询应具有 matchContainer 方法。这将参照 matchMedia()MediaQueryList 接口进行建模,但应用于元素而不是 Window。在测量布局大小时,它的行为类似于 resizeObserver,但它提供了额外的容器查询语法和功能。[Issue #6205]

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

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

9. 隐私与安全注意事项

CSS 包含 2 § 5 隐私与安全注意事项

附录 A. 变更

本附录是信息性的

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

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

CSS 包含级别 2 以来的变更

CSS 包含 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" 与规范性文本隔开,如下所示

这是一个说明性示例。

说明性注释以“Note”一词开头,并使用 class="note" 与规范性文本隔开,如下所示

注意,这是一个说明性注释。

建议(Advisements)是规范性章节,旨在引起特别注意,并使用 <strong class="advisement"> 与其他规范性文本区分开来,如下所示: 用户代理必须提供可访问的替代方案。

一致性类别

本规范为三类一致性定义了一致性要求。

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

如果样式表包含的所有使用本模块定义语法的语句,根据通用 CSS 语法及本模块定义的各功能语法均有效,则该样式表符合本规范。

如果渲染器除了按相应规范解释样式表外,还通过正确解析本规范定义的所有功能并相应地渲染文档来支持这些功能,则该渲染器符合本规范。然而,由于设备限制导致 UA 无法正确渲染文档,并不意味着该 UA 不符合规范。(例如,UA 无需在单色显示器上渲染颜色。)

如果创作工具编写的样式表根据通用 CSS 语法及本模块中各功能的语法是句法正确的,并符合本模块中描述的所有其他样式表一致性要求,则该创作工具符合本规范。

部分实现

为了使作者能够利用前向兼容的解析规则来指定后备值,CSS 渲染器 **必须** 将其无法使用支持级别的任何 @规则、属性、属性值、关键字和其他语法结构视为无效(并 适当忽略)。特别地,用户代理 **不得** 在单一多值属性声明中选择性地忽略不支持的组件值而保留支持的值:如果任何值被视为无效(因为不支持的值必须如此),CSS 要求忽略整个声明。

不稳定和专有特性的实现

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

非实验性实现

一旦规范达到候选推荐阶段,非实验性实现即可成为可能,实现者应发布他们能够证明根据规范正确实现的任何 CR 级别特性的无前缀实现。

为建立并保持 CSS 在不同实现间的互操作性,CSS 工作组请求非实验性的 CSS 渲染器在发布任何 CSS 功能的无前缀实现之前,向 W3C 提交一份实现报告(并在必要时提交用于该实现报告的测试用例)。提交给 W3C 的测试用例需经 CSS 工作组审阅和修正。

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

索引

本规范定义的术语

通过引用定义的术语

引用

规范性引用

[CSS-ANIMATIONS-1]
Dean Jackson; et al. CSS 动画 Level 1. 2018 年 10 月 11 日. WD. URL: https://w3org.cn/TR/css-animations-1/
[CSS-BOX-4]
Elika Etemad. CSS 盒模型模块 Level 4. 2020年4月21日. WD. URL: https://w3org.cn/TR/css-box-4/
[CSS-BREAK-3]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 3. 2018年12月4日. CR. URL: https://w3org.cn/TR/css-break-3/
[CSS-CASCADE-4]
CSS 级联与继承级别 4 URL: https://w3org.cn/TR/css-cascade-4/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 2022年1月13日. CR. URL: https://w3org.cn/TR/css-cascade-5/
[CSS-CONDITIONAL-3]
David Baron; Elika Etemad; Chris Lilley. CSS Conditional Rules Module Level 3. 2022年1月13日. CR. URL: https://w3org.cn/TR/css-conditional-3/
[CSS-CONTAIN-1]
Tab Atkins Jr.; Florian Rivoal. CSS Containment Module Level 1. 2020年12月22日. REC. URL: https://w3org.cn/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 Display Module Level 3. 2021年9月3日. CR. URL: https://w3org.cn/TR/css-display-3/
[CSS-FONTS-5]
Myles Maxfield; Chris Lilley. CSS 字体模块 Level 5. 2021 年 12 月 21 日. WD. URL: https://w3org.cn/TR/css-fonts-5/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS Box Sizing Module Level 3. 2021年12月17日. WD. URL: https://w3org.cn/TR/css-sizing-3/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 2021年12月24日. CR. URL: https://w3org.cn/TR/css-syntax-3/
[CSS-TRANSITIONS-1]
David Baron; et al. CSS Transitions. 2018年10月11日. WD. URL: https://w3org.cn/TR/css-transitions-1/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS 值与单位模块 Level 3. 2019 年 6 月 6 日. CR. URL: https://w3org.cn/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 值与单位模块 Level 4. 2021 年 12 月 16 日. WD. URL: https://w3org.cn/TR/css-values-4/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 2019年7月30日. CR. URL: https://w3org.cn/TR/css-writing-modes-4/
[CSS2]
Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. REC. URL: https://w3org.cn/TR/CSS21/
[CSSOM-VIEW-1]
Simon Pieters. CSSOM 视图模块. 2016 年 3 月 17 日. WD. URL: https://w3org.cn/TR/cssom-view-1/
[DOM]
Anne van Kesteren. DOM 标准. Living Standard. URL: https://dom.spec.whatwg.org/
[MEDIAQUERIES-5]
Dean Jackson; 等人. Media Queries Level 5. 2021年12月18日. WD. URL: https://w3org.cn/TR/mediaqueries-5/
[RFC2119]
S. Bradner. RFC 中用于指示要求级别的关键词. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. 选择器级别 4. 2022年5月7日. WD. URL: https://w3org.cn/TR/selectors-4/
[WEB-ANIMATIONS-1]
Brian Birtles; et al. Web 动画. 2021年5月18日. WD. URL: https://w3org.cn/TR/web-animations-1/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 标准. Living Standard. URL: https://webidl.spec.whatwg.org/

参考资料

[CSS-FONTS-4]
John Daggett; Myles Maxfield; Chris Lilley. CSS 字体模块第 4 级. 2021 年 12 月 21 日. WD. URL: https://w3org.cn/TR/css-fonts-4/
[CSS-PSEUDO-4]
Daniel Glazman; Elika Etemad; Alan Stearns. CSS Pseudo-Elements Module Level 4. 2020年12月31日. WD. URL: https://w3org.cn/TR/css-pseudo-4/
[CSS-SCOPING-1]
Tab Atkins Jr.; Elika Etemad. CSS Scoping Module Level 1. 2014年4月3日. WD. URL: https://w3org.cn/TR/css-scoping-1/
[CSS-SHADOW-PARTS-1]
Tab Atkins Jr.; Fergal Daly. CSS 影子部分. 2018 年 11 月 15 日. WD. URL: https://w3org.cn/TR/css-shadow-parts-1/
[CSS-SIZING-4]
Tab Atkins Jr.; Elika Etemad; Jen Simmons. CSS 盒模型尺寸模块第 4 级. 2021年5月20日. WD. URL: https://w3org.cn/TR/css-sizing-4/
[FULLSCREEN]
Philip Jägenstedt. 全屏 API 标准。现行标准。URL: https://fullscreen.spec.whatwg.org/

属性索引

名称初始值应用于继承百分比动画类型 (Animation type)规范顺序计算值
container <'container-name'> [ / <'container-type'> ]?见各个属性见各个属性见各个属性见各个属性见各个属性按语法见各个属性
container-name none | <custom-ident>+none(无)所有元素不可用不可动画按语法关键字 none,或标识符的有序列表
container-type normal || [ size | inline-size ]normal所有元素不可用不可动画按语法关键字 normal 或 size、inline-size 中的一个或多个

@container 描述符

名称初始值类型
aspect-ratio <ratio> 值域 (range)
block-size <length>(长度) 值域 (range)
height <length>(长度) 值域 (range)
inline-size <length>(长度) 值域 (range)
orientation portrait | landscape 离散 (discrete)
width <length>(长度) 值域 (range)

IDL 索引

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

问题索引

本文档是 CSS 包含级别 2 的差异规范。它目前处于探索性工作草案阶段:如果您正在进行实现,请以级别 2 作为参考。一旦达到 CR 阶段,我们将把级别 2 的文本合并到本草案中。
CSS 包含 2 § 2 强包含:contain 属性
CSS 包含 2 § 3 包含类型
通常,元素的内联尺寸与其块级尺寸之间的关系是不可预测且非单调的,块级尺寸可能会随着内联尺寸的改变而任意上下移动。通过确保布局不会回退到先前的(已知有问题的)状态来防止无限循环,即使对约束的简单分析允许这样做;换句话说,布局总是“向前移动”。我们相信当前的 CSS 布局规范包含了此类规则,但如果在某些范围内未包含,请通知 CSSWG,以便纠正这些错误。
为 CSSContainerRule 添加 CSSOM API [Issue #7033]
容器查询应具有 matchContainer 方法。这将参照 matchMedia()MediaQueryList 接口进行建模,但应用于元素而不是 Window。在测量布局大小时,它的行为类似于 resizeObserver,但它提供了额外的容器查询语法和功能。[Issue #6205]
CSS 包含 2 § 4 完全抑制元素内容:content-visibility 属性
CSS 包含 2 § 5 隐私与安全注意事项
CSS 包含 2 §  变更