CSS锚点定位模块 第2级

W3C 首次公开工作草案,

关于本文档的更多详情
本版本:
https://www.w3.org/TR/2025/WD-css-anchor-position-2-20251021/
最新发布版本:
https://www.w3.org/TR/css-anchor-position-2/
编辑草稿:
https://drafts.csswg.org/css-anchor-position-2/
历史记录:
https://www.w3.org/standards/history/css-anchor-position-2/
反馈:
CSSWG 问题库
编辑者:
Tab Atkins-Bittner (Google)
Elika J. Etemad / fantasai (Apple)
Ian Kilpatrick (Google)
为本规范建议修改:
GitHub 编辑器
增量规范:

摘要

本规范定义了锚点定位, 允许一个定位元素根据页面上一个或多个锚点元素来确定自己的尺寸和位置。

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

本文档状态

本节描述了本文档在发布时的状态。 当前 W3C 发布列表和本技术报告的最新修订版可在W3C 标准与草案索引中找到。

本文档由CSS 工作组首次公开工作草案身份发布,采用推荐轨道。 作为首次公开工作草案发布,并不代表 W3C 及其成员的认可。

本文档为草稿文件,可能随时被更新、替换或废弃。 除作为正在开发中的工作外,不适宜引用本文件。

请通过在 GitHub 提交 issue(推荐)反馈意见,标题请包含规范代码“css-anchor-position”,如: “[css-anchor-position] …评论摘要…”。 所有问题和评论均已归档。 或者,也可以发送反馈到(已归档)公共邮件列表 www-style@w3.org

本文件遵循2025年8月18日 W3C 流程文件管理。

本文件由遵循W3C 专利政策的组织产生。 W3C 维护了有关专利披露的公开列表,与该组的交付物相关; 该页面还包括专利披露的说明。 任何个人如果知晓并认为某专利包含必要权利要求, 必须按照W3C 专利政策第 6 条披露相关信息。

1. 增量规范

这是一个增量规范,意味着目前仅包含与 CSS 锚点定位第1级 [CSS-ANCHOR-POSITION-1] 的不同之处。

2. 锚点定位的容器查询

本节扩展了 容器查询(来自 [css-conditional-5]), 允许通过 锚点定位 查询元素的某些特性。

2.1. 通过 container-type 扩展 anchored

本规范为 container-type 属性(定义见 CSS Conditional 5 § 5.1 创建查询容器:container-type 属性) 增加了一个新的 anchored 关键字。anchored 可以与现有的容器类型一起使用,比如 scroll-statesize

normal | [ [ size | inline-size ] || scroll-state || anchored ]
anchored
建立一个 查询容器 用于 容器查询, 允许锚点定位元素的后代根据锚点的某些特性进行样式化。 (目前仅限于哪些 position-try-fallbacks 被应用。)

anchored 类型的容器会对 样式包含生效于 查询容器

注意:样式包含对于以下使用 计数器 的情况很重要,以避免布局循环:
  • 我们有一个 anchored 容器

  • 锚定容器的后代根据 fallback 查询对 计数器进行递增。

  • 在树结构中紧跟锚定容器的 流内元素生成内容并使用计数器,影响 流内元素的尺寸。

  • 流内元素影响 锚点元素的位置/尺寸。事实上, 流内元素本身可能就是 锚点元素

  • 锚点元素的位置/尺寸变化可能改变选用的 fallback,从而影响锚定查询的结果, 因此会影响计数器递增。

一个容器可以仅为 anchored,也可以与其他容器类型组合:
#anchored { container-type: anchored; }
#anchored-size { container-type: anchored inline-size; }

2.2. 扩展 @container 语法以支持 anchored 查询

为了查询 anchored 容器,anchored() 函数被添加到 @container 语法中。它通过在 '<query-in-parens>' 语法中添加如下产生式扩展了容器查询语法:

<query-in-parens> = ...
                  | anchored( <anchored-query> )

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

2.3. 锚定容器特性

2.3.1. 应用的 position-try-fallbacksfallback 特性

名称: fallback
适用对象: @container
取值: none | [ [<dashed-ident> || <try-tactic>] | <position-area-query> ]
类型: 离散型

fallback 容器特性用于查询锚点定位元素是否应用了任何计算得到的 position-try-fallbacks 选项。

none
anchored 容器未应用任何 position-try-fallbacks
<dashed-ident> || <try-tactic>
anchored 容器匹配已应用的 <dashed-ident><try-tactic> 的组合。 如果查询值省略了 <dashed-ident><try-tactic>,则应用值也必须省略,反之亦然,才能匹配。

<dashed-ident> 规则名称在 fallback 匹配时不视为 树范围名称

<try-tactic> 的顺序是有意义的。例如 flip-start flip-block 不等同于 flip-block flip-start。 因此查询时顺序必须一致,才能匹配 fallback

<position-area-query>
anchored 容器应用了来自 position-try-fallbacks<position-area>。如果 fallback 的应用值和查询值表示同一物理区域,则匹配。即 block-start 会在 topwriting-modehorizontal-tb 时匹配。

查询值为 any 时,会在该轴上始终匹配。

添加一个箭头,其方向依赖于元素是否定位在锚点的左侧或右侧:
#container {
  container-type: anchored;
  position: absolute;
  position-anchor: --a;
  position-area: left;
  position-try-fallbacks: right;
  &::before { content: ">"; }

  @container anchored(fallback: right) {
    &::before { content: "<"; };
  }
}
使用 '<try-tactic>' 匹配命名 fallback 选项:
.anchored {
  container-type: anchored;
  position-try-fallbacks: --foo, --bar flip-inline;

  @container anchored(fallback: --bar flip-inline) {
    /* 如果 '--bar' fallback 被应用则生效 */
    .inner { background-color: green; }
  }
  @container anchored(fallback: --bar) {
    /* 不生效,因为 try-tactic 也必须匹配 */
    .inner { background-color: red; }
  }
}
在垂直 writing-mode 下,匹配 '<position-area>' fallback 选项:
.anchored {
  container-type: anchored;
  position-anchor: --a;
  position-try-fallbacks: right;
  writing-mode: vertical-rl;

  @container anchored(fallback: self-block-start) {
    /* 如果 'right' fallback 被应用则生效,因为在 'vertical-rl' 中 block-start 就是 'right'。 */
    .inner { background-color: green; }
  }
}
使用 any 匹配 '<position-area>' fallback 选项:
.anchored {
  container-type: anchored;
  position-anchor: --a;
  position-try-fallbacks: bottom right;
  writing-mode: vertical-rl;

  @container anchored(fallback: bottom any) {
    /* 生效,因为 'any' 匹配 'right'。 */
    .inner { color: lime; }
  }
  @container anchored(fallback: right) {
    /* 生效,因为垂直轴上的隐含 'any' 匹配 'bottom'。 */
    .inner { background-color: green; }
  }
}

2.3.2. <position-area-query>值的语法

用于查询 position-area fallback 的值,语法与 <position-area> 相同, 但每个产生式都额外添加了 any 关键字:

<position-area-query> = [
  [ left | center | right | span-left | span-right
  | x-start | x-end | span-x-start | span-x-end
  | self-x-start | self-x-end | span-self-x-start | span-self-x-end
  | span-all | any ]
  ||
  [ top | center | bottom | span-top | span-bottom
  | y-start | y-end | span-y-start | span-y-end
  | self-y-start | self-y-end | span-self-y-start | span-self-y-end
  | span-all | any ]
|
  [ block-start | center | block-end | span-block-start | span-block-end | span-all | any ]
  ||
  [ inline-start | center | inline-end | span-inline-start | span-inline-end
  | span-all | any ]
|
  [ self-block-start | center | self-block-end | span-self-block-start
  | span-self-block-end | span-all | any ]
  ||
  [ self-inline-start | center | self-inline-end | span-self-inline-start
  | span-self-inline-end | span-all | any ]
|
  [ start | center | end | span-start | span-end | span-all | any ]{1,2}
|
  [ self-start | center | self-end | span-self-start | span-self-end | span-all | any ]{1,2}
]
any

any 可以用于一个或两个轴。它指代的轴是不明确的,处理方式与 '<position-area>' 里的其他不明确关键字(如 startcenter)一致,适用于分配轴和复制单关键字值的场景。

start, end, self-start, self-end
top, bottom, left, right
y-start, y-end, self-y-start, self-y-end
x-start, x-end, self-x-start, self-x-end
block-start, block-end, self-block-start, self-block-end
inline-start, inline-end, self-inline-start, self-inline-end
center
span-start, span-end, span-self-start, span-self-end
span-top, span-bottom, span-left, span-right
span-y-start, span-y-end, span-self-y-start, span-self-y-end
span-x-start, span-x-end, span-self-x-start, span-self-x-end
span-block-start, span-block-end, span-self-block-start, span-self-block-end
span-inline-start, span-inline-end, span-self-inline-start, span-self-inline-end
span-all

具体定义见 '<position-area>'。

如果只给出一个关键字,且该关键字没有轴歧义,则 '<position-area-query>' 的行为,就如同第二个关键字为 any。这与 '<position-area>' 处理单关键字不同,后者的第二个关键字为 span-all。 其他情况下,'<position-area-query>' 在分配轴时行为与 '<position-area>' 一致。

3. 安全性注意事项

目前未发现任何安全性问题。

4. 隐私注意事项

目前未发现任何隐私问题。

一致性

文档约定

一致性要求通过描述性断言和 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"> 与其它规范性文本区分,如下: UA 必须提供可访问的替代方案。

一致性类别

本规范一致性定义了三种一致性类别:

样式表
CSS 样式表
渲染器
解释样式表语义并渲染使用它们的文档的 UA
编辑工具
编写样式表的 UA

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

渲染器符合本规范,需根据相关规范解释样式表,并正确解析和渲染本规范定义的所有特性。但由于设备限制导致 UA 无法正确渲染文档,并不视为不一致。(如 UA 不要求在黑白显示器上渲染颜色。)

编辑工具符合本规范,需编写语法正确的样式表,并满足本模块描述的所有其它样式表一致性要求。

部分实现

为便于作者利用向前兼容的解析规则分配回退值,CSS 渲染器必须将不支持的 at-rule、属性、属性值、关键字及其他语法结构视为无效(并适当忽略)。尤其是,用户代理不得选择性忽略不支持的组件值并保留多值属性声明中的支持值:其中任何值被视为无效(因为不支持),则整个声明都必须被忽略。

不稳定和专有特性的实现

为避免与未来的稳定 CSS 特性冲突,CSSWG 建议遵循最佳实践,实现 不稳定特性和 专有扩展

非实验性实现

当规范进入候选推荐阶段后,可以进行非实验性实现,且实现者应发布根据规范正确实现的 CR 级特性的无前缀实现。

为确保 CSS 在各实现之间的互操作性,CSS 工作组要求非实验性 CSS 渲染器在发布无前缀实现前,向 W3C 提交实现报告(如有需要,还应提交用于该报告的测试用例)。提交给 W3C 的测试用例将由 CSS 工作组审核和修正。

关于提交测试用例和实现报告的更多信息,可在 CSS 工作组网站 https://www.w3.org/Style/CSS/Test/ 查询。 如有疑问请联系public-css-testsuite@w3.org 邮件列表。

索引

本规范定义的术语

引用定义的术语

参考文献

规范性引用

[CSS-ANCHOR-POSITION-1]
Tab Atkins Jr.; Elika Etemad; Ian Kilpatrick. CSS Anchor Positioning. 2025年10月7日. WD. URL: https://www.w3.org/TR/css-anchor-position-1/
[CSS-CONDITIONAL-5]
Chris Lilley; 等. CSS Conditional Rules Module Level 5. 2024年11月5日. WD. URL: https://www.w3.org/TR/css-conditional-5/
[CSS-CONTAIN-2]
Tab Atkins Jr.; Florian Rivoal; Vladimir Levin. CSS Containment Module Level 2. 2022年9月17日. WD. URL: https://www.w3.org/TR/css-contain-2/
[CSS-SCOPING-1]
Tab Atkins Jr.; Elika Etemad. CSS Scoping Module Level 1. 2014年4月3日. FPWD. URL: https://www.w3.org/TR/css-scoping-1/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2024年3月12日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 2019年7月30日. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[MEDIAQUERIES-5]
Dean Jackson; 等. Media Queries Level 5. 2021年12月18日. WD. URL: https://www.w3.org/TR/mediaqueries-5/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. 最佳当前实践. URL: https://datatracker.ietf.org/doc/html/rfc2119

参考性引用

[CSS-DISPLAY-4]
Elika Etemad; Tab Atkins Jr.. CSS Display Module Level 4. 2024年12月19日. FPWD. URL: https://www.w3.org/TR/css-display-4/
[CSS-LISTS-3]
Elika Etemad; Tab Atkins Jr.. CSS Lists and Counters Module Level 3. 2020年11月17日. WD. URL: https://www.w3.org/TR/css-lists-3/
[CSS2]
Bert Bos; 等. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS2/

属性索引

未定义属性。

@container 描述符

名称 初始值 类型
fallback none | [ [<dashed-ident> || <try-tactic>] | <position-area-query> ] 离散型