CSS定位布局模块 第4级

W3C工作草案,

更多关于本文件的信息
此版本:
https://www.w3.org/TR/2025/WD-css-position-4-20251007/
最新发布版本:
https://www.w3.org/TR/css-position-4/
编辑草稿:
https://drafts.csswg.org/css-position-4/
历史记录:
https://www.w3.org/standards/history/css-position-4/
反馈:
CSSWG问题仓库
规范内反馈
编辑者:
Elika J. Etemad / fantasai (Apple)
Tab Atkins Jr. (Google)
建议编辑本规范:
GitHub编辑器

摘要

本模块定义了基于坐标的 CSS 定位和偏移方案:相对定位粘性定位绝对定位固定定位

同时也定义了CSS的绘制/渲染模型。

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

本文档状态

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

本文档由 CSS工作组 按照 推荐规范流程 作为 工作草案 发布。作为工作草案发布不代表 W3C 及其成员的认可。

本文档为草稿文件,可能会随时更新、替换或被其它文档废止。不应将本文档引用为除工作进展以外的其它内容。

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

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

本文档由遵循 W3C专利政策的工作组编制。W3C维护了与工作组成果相关的专利公开的公开列表;该页面还包括专利披露说明。若个人实际知晓某项专利并认为其包含必要声明,须按照W3C专利政策第6节披露相关信息。

1. 介绍

这是一个针对 [css-position-3] 的早期增量规范。

2. 可滚动包含块

滚动容器绝对定位包含块建立 用于绝对定位盒时, 会用到三种可能的包含块之一:
固定包含块

一个滚动容器固定包含块 对应于滚动端口, 即 滚动容器的内部padding box边缘, 但随外部上下文滚动,而不是 滚动容器的内容滚动。

由文档建立的固定包含块固定定位包含块

局部包含块

一个滚动容器局部包含块 对应于滚动容器padding box边缘, 但它依附在可滚动溢出区域上, 并随 滚动容器内容滚动。

由文档建立的局部包含块初始包含块

可滚动包含块

滚动容器可滚动包含块 对应于 滚动容器padding edge可滚动溢出区域, 即在确定它的可滚动溢出区域范围时, 包裹内容的padding外边缘。 详见 CSS Overflow 3 § 2.2 Scrollable Overflow。 在所有情况下,可滚动包含块至少包含 局部包含块

注意:这包括浮动元素, 但不包括绝对定位的后代, 溢出后代盒的内容, 以及相对定位和变换的影响, 否则它们会扩展滚动区域以显示这些内容。

由文档建立的 可滚动包含块初始包含块margin box 的并集,后者属于 根元素 生成的

注意:虽然这些在某种意义上都对应于padding box, 但对于具有可滚动溢出的盒来说,它们并不重合。

需要确定顶层所需的具体概念。 他们很可能希望做一些稍有不同的事情, 针对他们自己的层。

除非另有说明, 绝对定位盒使用局部包含块。 某些CSS特性可以指定不同的包含块。 例如,固定定位盒通常使用文档的固定包含块, 而position-area属性值不是none 的时候, 可以让绝对定位盒选择进入可滚动包含块

注意:目前没有办法引用固定包含块, 除了固定定位包含块, 但未来可能会添加。

3. 顶层

Document 拥有一个顶层, 一个包含来自文档的有序集合元素顶层中的元素 不会根据它们在文档中的位置正常布局; 而是生成, 仿佛它们是根元素的兄弟节点。 顶层中的元素按其在顶层中的顺序渲染; 顶层中的最后一个元素会渲染在所有内容之上。

注意:这种特殊的渲染行为确保 顶层中的元素 不会被文档中的任何内容裁剪, 也不会被除 顶层中后面的元素外的内容遮盖。 这样可以确保像弹窗 这样的内容能够可靠显示, 无论它们的祖先元素做了什么。

顶层根是某个元素 最近的祖先元素, 且该祖先在顶层中, 如果没有,则为 none (这种情况下它就像普通内容一样作为文档的一部分绘制)。

如果两个元素有相同的顶层根 (包括两者都是 none), 则它们处于同一顶层。 如果元素A有一个顶层根, 且元素B的顶层根顶层中 排在A之前,或B根本没有顶层根, 则A处于更高顶层

注意:顶层完全由用户代理管理; 作者不能直接操作它。 这样可以保证“嵌套”调用顶层API, 比如弹窗里嵌弹窗, 能够正确显示。

注意:顶层会与overlay属性以一种特殊方式交互。 详情见 overlay

Document 还拥有一个待移除顶层元素 有序集合, 包含待移除的元素。 (具体使用方法见下方的算法。)

顶层 (以及待移除顶层元素) 不应被规范算法直接操作。 (使用 顶层 的具体特性 可能对顶层中的某些内容拥有所有权, 比如弹窗嵌套弹窗, 需要作为一组进行移动或排序。) 规范应使用下方算法。

3.1. 顶层样式

每个在顶层渲染的元素, 以及其对应的::backdrop伪元素, 都按如下方式渲染:

3.2. ::backdrop 伪元素

每个在顶层渲染的元素都有一个::backdrop伪元素, 其源元素为该元素。

当其计算的content 属性值不是none时, ::backdrop伪元素会生成盒, 仿佛为根元素的兄弟节点。 它们会自动作为顶层中的单独项渲染, 位于其源元素下方。 (详见 “绘制文档”。)

注意:::backdrop伪元素 可用于为顶层元素创建一个背景, 隐藏底层文档内容 (如全屏显示的元素)。

::backdrop伪元素是可完全样式化的伪元素

用户代理应在UA级样式表中包含如下规则:

::backdrop {
  position: fixed;
  inset: 0;
}

其他规范可以为默认的::backdrop渲染添加额外属性。

注意:例如,全屏元素 (见 [FULLSCREEN]) 默认将其::backdrop样式设为不透明黑色。

更多::backdrop元素的渲染细节见 § 3.1 顶层样式

3.3. 顶层操作

元素 el 被认为在顶层中, 如果 el 被其 包含在其 节点文档顶层被包含在其 节点文档待移除顶层元素中。

注意:规范在操作顶层本身时应使用此概念, 而不是 在顶层渲染。 使用这个概念可以避免行为因是否有 overlay 过渡, 或两个操作是在渲染更新之间还是跨渲染更新发生而不同。

元素 el 被认为在顶层渲染, 如果 el 被其 节点文档顶层包含, 并且 el 具有 overlay: auto

注意:规范在响应“显示在所有内容之上”的渲染行为时应使用此概念, 而不是 在顶层中。 例如,是否存在 ::backdrop 伪元素 取决于元素是否 在顶层渲染; 即使元素 待移除, 只要它仍显示在最上层,就会有 ::backdrop

将元素添加到顶层, 给定一个 Element el
  1. docel节点文档

  2. 如果 el 已经被 包含doc顶层中:

  3. el 添加到 doc顶层

  4. 在 UA !important 级联源, 添加一条针对 el 的规则, 包含 overlay: auto 声明。

请求将元素从顶层移除, 给定一个 Element el
  1. docel节点文档

  2. 如果 el 未被 包含doc顶层中, 或 el 已被包含在 待移除顶层元素中, 则返回。

  3. 移除 UA !important 针对 eloverlay: auto 规则。

  4. el 添加到 doc待移除顶层元素

立即将元素从顶层移除, 给定一个 Element el
  1. docel节点文档

  2. doc顶层待移除顶层元素中移除 el

  3. 移除 UA !important 针对 eloverlay: auto 规则(如果存在)。

注意:此算法仅用于特殊场景, 例如需要立即将内容从顶层移除(绕过如 overlay 过渡)时, 比如模态对话框被从文档中移除。 大多数情况下,使用 请求移除顶层更合适。

处理顶层移除, 给定一个 Document doc
  1. 对于 doc待移除顶层元素 中的每个元素 el: 如果 eloverlay 计算值为 none, 或 el 未渲染立即将元素从顶层移除 el

注意:此操作应在 HTML 渲染算法的“更新渲染”步骤期间调用。 不应由其他算法调用。

注意:overlay 的检查可以被作者级动画任意延迟; 详情见 § 3.4 控制顶层:overlay 属性

3.4. 控制顶层:overlay 属性

名称: overlay
值: none | auto
初始值: none
应用于: 所有元素
是否继承:
百分比: 不适用
计算值: 按指定值
规范顺序: 按语法
动画类型: 见正文

当一个元素 在顶层中时, overlay 属性决定 它是否真的 在顶层渲染

none

该元素不会 在顶层渲染

auto

如果元素 在顶层中, 则 会在顶层渲染

它不是以正常文档位置生成盒, 而是作为根元素的兄弟生成盒, 并在其“上方”渲染。

注意:overlay 是一个较特殊的属性, 因为它由用户代理设置, 作者无法设置。

不过,作者确实可以影响 何时 overlay 的值发生变化, 方法是对该属性设置 transition。 这样作者就可以将动画与过渡对齐, 只有在动画的合适时机让元素进出顶层。 例如, 可以让元素先从页面正常位置淡出, 再在顶层新位置淡入, 或反之。

对于动画, auto 是以离散步骤插值的, 其中 0 < p < 1 的 p 映射为 auto, 其他值映射为更接近的端点; 如果两边都不是 auto 则用离散动画。

注意:这类似于 visibility 的动画方式。 对于大多数 缓动函数, 元素会在整个过渡期间 在顶层渲染, 无论是进入还是离开顶层。 可以使用 step-start/step-end/linear() 来更精确地控制值切换的时机。

用户代理必须在其 UA 样式表中包含如下规则:

* { overlay: none !important; }

注意:这意味着 overlay 属性 不能被作者或用户设置——它完全由用户代理控制 (当元素处于 overlay: auto 状态时, 通过另一条 UA-!important 规则设置), 元素在 顶层时生效。

用户代理可以自行决定, 移除 overlay 属性上的运行中 transition。 其条件特意未定义。 (这是为了防止滥用场景, 例如 transition: overlay 1e9s; 或类似方式 试图让元素永久处于 顶层。)

4. 绘制顺序与堆叠上下文

本章节描述了 CSS 盒树的绘制顺序。

遍历 盒树时, 通常会用到树顺序。 对于分片来说, 指的是分片的逻辑顺序, 而不是视觉顺序。 (例如在渲染双向文本时,这一点很重要。)

绘制顺序采用“画家模型”定义, 元素被描述为在一个堆栈中绘制, 堆栈底部的内容先绘制, 位于堆栈顶部的内容在上方。 用户被假定为在堆栈顶部之上, 俯视整个堆栈:

             |     |         |
             |          |    |   ⇦ 🧑‍🎨
             |          |        用户
z-index:  canvas  -1    0    1

堆叠上下文的背景和大部分负定位堆叠上下文在堆栈底部,而正定位堆叠上下文在堆栈顶部。

如果画布被包含在其他画布中则为透明,否则由 UA 定义的颜色填充。画布是无限大的,包含根元素。初始时,视口的左上角定位在画布原点。

绘制文档, 给定文档 doc 和一个无限画布 canvas
  1. 绘制堆叠上下文,传入 doc 的根元素 和 canvas

  2. doc顶层中的每个元素 el

    1. 绘制堆叠上下文, 传入 el::backdrop 伪元素 和 canvas

    2. 绘制堆叠上下文,传入 elcanvas, 并将 el当作一个堆叠上下文, 其初始包含块 作为其包含块

绘制堆叠上下文, 给定一个元素伪元素 root, 和一个无限画布 canvas
  1. 如果 root元素绘制堆叠上下文,传入 root主盒canvas, 然后返回。

  2. 断言:root 是一个, 并生成了一个堆叠上下文

  3. 如果 root根元素主盒, 则将 root 的背景绘制到整个 canvas 上, 背景定位区的原点为 canvasroot 背景正常绘制时的位置。

  4. 如果 root块级盒绘制块装饰, 传入 rootcanvas

  5. root 的所有定位的负(非零)z-index 后代, 按 z-index 顺序(最负在前)、 然后按树顺序排序, 依次对每个后代 绘制堆叠上下文,传入后代和 canvas

  6. root 的所有流内、非定位、块级后代, 按树顺序绘制块装饰, 传入后代和 canvas

  7. root 的所有非定位浮动后代, 按树顺序, 绘制堆叠容器, 传入后代和 canvas

  8. 如果 root内联级

    root 所在的每个行盒, 绘制行盒中的盒, 传入 root、行盒和 canvas

    否则

    首先对 root, 然后对其所有流内、非定位、块级后代盒, 按树顺序

    1. 如果该盒是替换元素, 原子性地将替换内容绘制到 canvas

    2. 否则,对该盒的每个行盒, 绘制行盒中的盒, 传入该盒、行盒和 canvas

    3. 如果 UA 使用带内轮廓, 则将该盒的轮廓绘制到 canvas

  9. root 的所有定位的 z-index: autoz-index: 0 后代, 按树顺序

    后代为 z-index: auto

    绘制堆叠容器, 传入后代和 canvas

    后代为 z-index: 0

    绘制堆叠上下文, 传入后代和 canvas

  10. root 的所有定位的正(非零)z-index 后代, 按 z-index 顺序(最小在前)、 然后按树顺序排序, 依次对每个后代 绘制堆叠上下文,传入后代和 canvas

  11. 如果 UA 使用带外轮廓, 则绘制所有 root 的轮廓 (因本次算法未采用带内轮廓而略过的那些) 到 canvas 上。

绘制块装饰, 给定一个块盒 root 和一个画布 canvas
  1. 如果 root 不是表包装盒

    1. 如果 root 不是根元素主盒, 则将其背景绘制到 canvas

    2. root 的边框绘制到 canvas

  2. 如果 root表包装盒

    1. 如果 root 不是根元素主盒, 则将其背景绘制到 canvas

    2. root 的每个列组,按树顺序, 将列组背景绘制到 canvas

    3. root 的每一列,按树顺序, 将列背景绘制到 canvas

    4. root 的每个行组,按树顺序, 将行组背景绘制到 canvas

    5. root 的每一行,按树顺序, 将行背景绘制到 canvas

    6. root 的每个单元格,按树顺序, 将单元格背景绘制到 canvas

    7. 绘制 root 所有表元素的边框。 如果边框分离, 按树顺序绘制; 如果边框连接, 按 [css-tables-3] 规范绘制。

绘制行盒中的盒, 给定盒 root, 行盒 line box, 和画布 canvas
  1. root分片line box 中的背景绘制到 canvas

  2. root分片line box 中的边框绘制到 canvas

  3. 如果 root内联盒

    对所有 root 的流内、非定位、内联级子元素, 生成 分片line box 中, 以及所有子文本序列 生成 分片line box 中, 按树顺序

    如果该子元素是文本序列,则:
    1. 按应用下划线的元素树顺序 (最深的元素的下划线画在最上面,根元素的下划线画在最下面), 将所有影响文本的下划线绘制到 canvas

    2. 按应用上划线的元素树顺序 (最深的元素的上划线画在最上面,根元素的上划线画在最下面), 将所有影响文本的上划线绘制到 canvas

    3. 将文本绘制到 canvas

    4. 按应用删除线的元素树顺序 (最深的元素的删除线画在最上面,根元素的删除线画在最下面), 将所有影响文本的删除线绘制到 canvas

    如果该子元素是

    绘制行盒中的盒, 传入该子元素、line boxcanvas

    如果 root内联级 表包装盒

    绘制堆叠容器, 传入 rootcanvas

    如果 root内联级替换元素

    原子性地将替换内容绘制到 canvas

  4. 如果 UA 使用带内轮廓, 则将 root分片line box 中的轮廓绘制到 canvas

注意:即使内联盒分片在一行内的视觉顺序可以因双向重排而变化, 分片仍按树顺序绘制。

绘制堆叠容器, 给定一个 root 和一个画布 canvas
  1. 绘制堆叠上下文, 传入 rootcanvas, 把 root 视为创建了一个新的堆叠上下文, 但忽略所有定位后代 或实际创建了堆叠上下文的后代 (让父堆叠上下文绘制它们)。

UA 可以绘制outline属性的轮廓, 可以是带内轮廓 (沿着每个元素绘制,可能被后续内容遮盖/重叠), 也可以是带外轮廓 (所有轮廓在堆叠上下文最后绘制, 堆叠上下文内的内容不会遮盖它们)。 推荐 UA 使用带外轮廓, 以提升轮廓可见性, 这对可访问性非常重要。

5. 变更记录

2025年7月8日首次公开工作草案 以来的重要变更:

隐私注意事项

本规范未报告新的隐私注意事项。

安全注意事项

本规范未报告新的安全注意事项。

一致性

文档约定

一致性要求通过描述性断言和 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 不要求在黑白显示器上显示颜色。)

编辑工具生成的样式表需符合通用 CSS 语法及本模块每项特性语法,并满足本模块描述的所有其他样式表一致性要求,即视为符合本规范。

部分实现

为了让作者能利用向前兼容的解析规则指定回退值,CSS 渲染器必须将所有不支持的 at-规则、属性、属性值、关键字及其它语法结构视为无效(并适当忽略)。特别是,UA 不得在单条多值属性声明中选择性地忽略不支持的值而只保留支持的值:如有任何值被视为无效(即不支持),CSS 要求整个声明被忽略。

不稳定和专有特性的实现

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

非实验性实现

当规范达到候选推荐阶段(CR),即可进行非实验性实现,且实现者应发布无前缀的实现,只要该 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年5月9日. 工作草案. URL: https://www.w3.org/TR/css-anchor-position-1/
[CSS-BOX-4]
Elika Etemad. CSS Box Model Module Level 4. 2024年8月4日. 工作草案. URL: https://www.w3.org/TR/css-box-4/
[CSS-BREAK-4]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 4. 2018年12月18日. 首次公开工作草案. URL: https://www.w3.org/TR/css-break-4/
[CSS-CASCADE-6]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 6. 2024年9月6日. 工作草案. URL: https://www.w3.org/TR/css-cascade-6/
[CSS-CONTENT-3]
Elika Etemad; Dave Cramer. CSS Generated Content Module Level 3. 2019年8月2日. 工作草案. URL: https://www.w3.org/TR/css-content-3/
[CSS-DISPLAY-4]
Elika Etemad; Tab Atkins Jr.. CSS Display Module Level 4. 2024年12月19日. 首次公开工作草案. URL: https://www.w3.org/TR/css-display-4/
[CSS-OVERFLOW-3]
Elika Etemad; Florian Rivoal. CSS Overflow Module Level 3. 2023年3月29日. 工作草案. URL: https://www.w3.org/TR/css-overflow-3/
[CSS-POSITION-3]
Elika Etemad; Tab Atkins Jr.. CSS Positioned Layout Module Level 3. 2025年3月11日. 工作草案. URL: https://www.w3.org/TR/css-position-3/
[CSS-PSEUDO-4]
Elika Etemad; Alan Stearns. CSS Pseudo-Elements Module Level 4. 2025年6月27日. 工作草案. URL: https://www.w3.org/TR/css-pseudo-4/
[CSS-TABLES-3]
François Remy; Greg Whitworth; David Baron. CSS Table Module Level 3. 2019年7月27日. 工作草案. URL: https://www.w3.org/TR/css-tables-3/
[CSS-TRANSITIONS-1]
David Baron; 等. CSS Transitions. 2018年10月11日. 工作草案. URL: https://www.w3.org/TR/css-transitions-1/
[CSS-UI-4]
Florian Rivoal. CSS Basic User Interface Module Level 4. 2021年3月16日. 工作草案. URL: https://www.w3.org/TR/css-ui-4/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2024年3月12日. 工作草案. URL: https://www.w3.org/TR/css-values-4/
[CSS2]
Bert Bos; 等. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. 推荐规范. URL: https://www.w3.org/TR/CSS2/
[DOM]
Anne van Kesteren. DOM 标准. 现行标准. URL: https://dom.spec.whatwg.org/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 标准. 现行标准. URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. 当前最佳实践. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. 2022年11月11日. 工作草案. URL: https://www.w3.org/TR/selectors-4/

参考性引用

[CSS-COLOR-4]
Chris Lilley; Tab Atkins Jr.; Lea Verou. CSS Color Module Level 4. 2025年4月24日. 候选推荐. URL: https://www.w3.org/TR/css-color-4/
[CSS-EASING-2]
CSS 缓动函数 2级. 2024年8月29日. 首次公开工作草案. URL: https://www.w3.org/TR/css-easing-2/
[CSS-MASKING-1]
Dirk Schulze; Brian Birtles; Tab Atkins Jr.. CSS Masking Module Level 1. 2021年8月5日. 候选推荐. URL: https://www.w3.org/TR/css-masking-1/
[CSS-WRITING-MODES-3]
Elika Etemad; Koji Ishii. CSS 书写模式 第3级. 2019年12月10日. 推荐规范. URL: https://www.w3.org/TR/css-writing-modes-3/
[FULLSCREEN]
Philip Jägenstedt. Fullscreen API 标准. 现行标准. URL: https://fullscreen.spec.whatwg.org/
[HTML]
Anne van Kesteren; 等. HTML 标准. 现行标准. URL: https://html.spec.whatwg.org/multipage/

属性索引

名称 初始值 应用于 继承 百分比 动画类型 规范顺序 计算值
overlay none | auto none 所有元素 不适用 见正文 按语法 按指定值

问题索引

需要确定顶层所需的具体概念。 他们很可能希望做一些稍有不同的事情, 针对他们自己的层。