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伪元素, 都按如下方式渲染:
-
它会生成新的堆叠上下文。
-
其父堆叠上下文为根堆叠上下文。
-
它作为一个原子单元渲染,仿佛为文档根的兄弟。
-
如果是元素, 则其和其::backdrop伪元素不会被渲染, 如果其包含阴影的祖先 设置了display: none。
-
除非被其他规范覆盖, 其静态定位的left、right和top均为零。
3.2. ::backdrop 伪元素
每个在顶层渲染的元素都有一个::backdrop伪元素, 其源元素为该元素。
当其计算的content 属性值不是none时, ::backdrop伪元素会生成盒, 仿佛为根元素的兄弟节点。 它们会自动作为顶层中的单独项渲染, 位于其源元素下方。 (详见 “绘制文档”。)
注意:::backdrop伪元素 可用于为顶层元素创建一个背景, 隐藏底层文档内容 (如全屏显示的元素)。
::backdrop伪元素是可完全样式化的伪元素。
用户代理应在UA级样式表中包含如下规则:
::backdrop{ position : fixed; inset : 0 ; }
其他规范可以为默认的::backdrop渲染添加额外属性。
注意:例如,全屏元素 (见 [FULLSCREEN]) 默认将其::backdrop样式设为不透明黑色。
更多::backdrop元素的渲染细节见 § 3.1 顶层样式。
3.3. 顶层操作
注意:规范在操作顶层本身时应使用此概念, 而不是 在顶层渲染。 使用这个概念可以避免行为因是否有 overlay 过渡, 或两个操作是在渲染更新之间还是跨渲染更新发生而不同。
注意:规范在响应“显示在所有内容之上”的渲染行为时应使用此概念, 而不是 在顶层中。 例如,是否存在 ::backdrop 伪元素 取决于元素是否 在顶层渲染; 即使元素 待移除, 只要它仍显示在最上层,就会有 ::backdrop。
Element
el:
Element
el:
Element
el:
-
令 doc 为 el 的 节点文档。
-
移除 UA !important 针对 el 的 overlay: auto 规则(如果存在)。
注意:此算法仅用于特殊场景, 例如需要立即将内容从顶层移除(绕过如 overlay 过渡)时, 比如模态对话框被从文档中移除。 大多数情况下,使用 请求移除顶层更合适。
Document
doc:
-
对于 doc 的 待移除顶层元素 中的每个元素 el: 如果 el 的 overlay 计算值为 none, 或 el 未渲染, 立即将元素从顶层移除 el。
注意:此操作应在 HTML 渲染算法的“更新渲染”步骤期间调用。 不应由其他算法调用。
注意:overlay 的检查可以被作者级动画任意延迟; 详情见 § 3.4 控制顶层:overlay 属性。
3.4. 控制顶层:overlay 属性
名称: | overlay |
---|---|
值: | none | auto |
初始值: | none |
应用于: | 所有元素 |
是否继承: | 否 |
百分比: | 不适用 |
计算值: | 按指定值 |
规范顺序: | 按语法 |
动画类型: | 见正文 |
当一个元素 在顶层中时, 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 定义的颜色填充。画布是无限大的,包含根元素。初始时,视口的左上角定位在画布原点。
-
如果 root 是根元素的 主盒, 则将 root 的背景绘制到整个 canvas 上, 背景定位区的原点为 canvas 上 root 背景正常绘制时的位置。
-
对 root 的所有定位的负(非零)z-index 后代, 按 z-index 顺序(最负在前)、 然后按树顺序排序, 依次对每个后代 绘制堆叠上下文,传入后代和 canvas。
-
对 root 的所有非定位浮动后代, 按树顺序, 绘制堆叠容器, 传入后代和 canvas。
-
对 root 的所有定位的 z-index: auto 或 z-index: 0 后代, 按树顺序:
- 后代为 z-index: auto
-
绘制堆叠容器, 传入后代和 canvas。
- 后代为 z-index: 0
-
绘制堆叠上下文, 传入后代和 canvas。
-
对 root 的所有定位的正(非零)z-index 后代, 按 z-index 顺序(最小在前)、 然后按树顺序排序, 依次对每个后代 绘制堆叠上下文,传入后代和 canvas。
-
如果 UA 使用带外轮廓, 则绘制所有 root 的轮廓 (因本次算法未采用带内轮廓而略过的那些) 到 canvas 上。
-
将 root 的分片在 line box 中的背景绘制到 canvas。
-
将 root 的分片在 line box 中的边框绘制到 canvas。
注意:即使内联盒分片在一行内的视觉顺序可以因双向重排而变化, 分片仍按树顺序绘制。
-
绘制堆叠上下文, 传入 root 和 canvas, 把 root 视为创建了一个新的堆叠上下文, 但忽略所有定位后代 或实际创建了堆叠上下文的后代 (让父堆叠上下文绘制它们)。
UA 可以绘制outline属性的轮廓, 可以是带内轮廓 (沿着每个元素绘制,可能被后续内容遮盖/重叠), 也可以是带外轮廓 (所有轮廓在堆叠上下文最后绘制, 堆叠上下文内的内容不会遮盖它们)。 推荐 UA 使用带外轮廓, 以提升轮廓可见性, 这对可访问性非常重要。
5. 变更记录
自 2025年7月8日首次公开工作草案 以来的重要变更:
-
无(仅修复了标记和链接)。
隐私注意事项
本规范未报告新的隐私注意事项。
安全注意事项
本规范未报告新的安全注意事项。