摘要
当可见区域上方的 DOM 元素发生变化时,滚动框
可能会导致页面在用户正在浏览内容时发生移动。
本规范提出了一种机制,通过跟踪锚点节点的位置并相应调整滚动偏移,来缓解这种令人不适的用户体验。
本规范还为 Web 开发者提出了一种 API,用于选择不使用此行为。
CSS 是一种用于描述结构化文档(如 HTML 和 XML)在屏幕、纸张等上的渲染语言。
本文档的状态
目录
1 引言
1.1 值的定义
2 描述
2.1
锚点节点选择
2.2
滚动调整
2.2.1
抑制窗口
2.2.2
抑制触发器
3 排除 API
4 隐私和安全考虑
变更
自 2020 年 2 月 11
日工作草案以来的变更
一致性
文档约定
一致性类别
部分实现
不稳定和专有功能的实现
非实验性实现
索引
本规范定义的术语
引用定义的术语
参考文献
规范性参考文献
属性索引
1.
引言
如今,网络用户常常因视口外发生的变化而分心,导致内容在页面中移动。
例如脚本插入包含广告的 iframe,或在慢速网络上加载未指定大小的图片。
历史上,浏览器的默认行为是在发生此类变化时保留绝对滚动位置。
这意味着,为了避免内容移动,网页可以尝试在页面上为稍后加载的内容预留空间。
实际上,极少有网站能一致地做到这一点。
滚动锚定旨在尽量减少意外的内容移动。
它通过调整滚动位置来补偿视口外的变化。
解释文档 非正式地概述了滚动锚定。
1.1.
值的定义
本规范遵循 CSS 属性定义约定 ,使用 值定义语法 ,这些来自 [CSS-VALUES-3] 。
未在本规范中定义的值类型将在 CSS 值与单位 [CSS-VALUES-3] 中定义。
与其他 CSS 模块的结合可能会扩展这些值类型的定义。
除了其定义中列出的属性特定值外,
本规范中定义的所有属性也接受 CSS-wide 关键词 作为其属性值。
为了可读性,这些关键词未被显式重复列出。
2.
描述
滚动锚定尝试在布局变化时保持用户对文档视图的稳定。
它通过选择一个 DOM 节点(称为 锚点节点 )
来决定调整滚动位置。
但是,如果滚动容器当前 对齐 到某个元素,
(参见 [CSS-SCROLL-SNAP-1] )
滚动锚定仅限于允许通过重新对齐 的调整。
2.1. 锚点节点选择
每个滚动框 都旨在选择一个锚点节点 ,该节点在 DOM 中很深,
并且应优先作为重要的 DOM 节点,或靠近其最佳视图区域 的块起始边缘。
注意: 如果用户代理不支持scroll-padding 属性,
则滚动框的最佳视图区域等同于其内容区域 。
锚点节点可以是任何盒子 ,但不能是非原子内联 的盒子。
锚点节点始终是滚动框的后代 。
在某些情况下,滚动框可能不会选择任何锚点节点。
元素C 是滚动框S 的滚动锚点的可行候选 ,如果它满足以下所有条件:
某些元素被认为是锚点选择的优先候选 :
文档的DOM 锚点 。
包含当前活动的页面查找用户代理算法匹配结果的元素。如果匹配结果跨多个元素,则只考虑第一个元素。
请注意,如果优先候选 是非原子内联 元素,
则应考虑其最近的非原子内联元素祖先作为优先候选。
锚点节点选择算法 对于滚动框
S 如下:
如果S 关联的元素的overflow-anchor 属性的计算值为none ,
则不为S 选择锚点节点。
否则,按指定顺序检查每个优先候选 PC ,
如果PC 在S 中是可行候选 ,则选择它作为锚点节点并终止。
否则,对与S 关联的元素或文档的每个 DOM 子节点N ,
执行候选检查算法 ,
如果选择了锚点节点,则终止。
候选检查算法
适用于滚动框
S 中的候选 DOM 节点
N ,具体如下:
如果N 是排除的子树 ,
或者N 在S 中是完全剪裁 的,
则不执行任何操作(跳过N 及其后代)。
如果N 在S 中是完全可见 的,
选择N 作为锚点节点。
如果N 是部分可见 的:
对于N 的每个 DOM 子节点C ,
执行候选检查算法 以检查S 中的C ,
如果选择了锚点节点,则终止。
对于N 的包含块 是N ,
但 DOM 父节点不是N 的每个绝对定位元素A ,
执行候选检查算法 以检查S 中的A ,
如果选择了锚点节点,则终止。
选择N 作为锚点节点。
(如果达到此步骤,则N 的后代中没有找到合适的锚点节点。)
注意: 更深的节点优先,以尽量减少锚点节点内但视口外的内容变化,
这些变化会导致可见内容移动而不触发任何滚动锚定调整。
从概念上讲,每当任何滚动框的滚动位置发生变化时,都会为每个滚动框重新计算一个锚点节点。
(作为性能优化,可能会在需要锚点节点时才进行计算。)
DOM 节点
N 是一个
排除的子树 ,如果它是一个元素并且满足以下任一条件:
DOM 节点
N 在滚动框
S 中是
部分可见 的,如果
N 既不在
S 中
完全可见 ,也不在
S 中
完全剪裁 。
如果选择了锚点节点,
当锚点节点移动时,
浏览器会计算锚点节点的滚动锚定边界矩形 的块起始边缘相对于滚动内容块起始边缘的之前偏移量y0
和当前偏移量y1
,
方向为滚动器的块流方向 。
然后,它会在块流方向上排队一个y1 - y0
的滚动位置调整,
在抑制窗口 结束时执行。
滚动调整是一种由[CSSOM-VIEW] 定义的[[cssom-view-1#scrolling-events#scrolling]]类型,
并按照那里描述的方式生成滚动事件 。
2.2.1. 抑制窗口
每次锚点节点移动都会发生在一个称为抑制窗口 的时间窗口内,
定义如下:
注意: 一旦滚动锚定 API 稳定,抑制窗口的边界应并入 HTML 标准。
在同一个抑制窗口内可能会发生多次锚点节点移动。
在抑制窗口结束时,
用户代理会执行所有在窗口期间排队的且未被任何抑制触发器 抑制的滚动调整。
2.2.2. 抑制触发器
抑制触发器 是指在锚点节点移动的抑制窗口内发生的操作,
如果发生这些操作,则会抑制滚动锚定调整。
这些触发器包括:
注意: 抑制触发器是为了与现有的 web 内容兼容,这些内容由于在滚动事件处理程序中导致的内容移动而与滚动锚定发生负面交互。
3. 排除 API
滚动锚定的目标是在启动时成为默认行为,
以便用户即使在旧内容上也能从中受益。overflow-anchor 可以禁用
整个网页或部分网页中的滚动锚定(选择退出),
或将部分 DOM 排除在锚点节点选择算法之外。
值定义如下:
auto
声明该元素有资格参与由该元素或其祖先创建的任何滚动框的锚点节点选择算法 。
none
声明该元素及其后代
(不包含嵌套在另一个滚动元素内的后代)
不 有资格参与由该元素或其祖先创建的任何滚动框的锚点节点选择算法 。
注意: 无法为overflow-anchor:
none 元素的后代重新开启滚动锚定。
但是,后代滚动容器 会自动为它们自己的滚动框重新开启该功能,
除非它们明确设置了overflow-anchor:
none 。
注意: overflow-anchor
属性还曾被提议用于CSS 粘性滚动条 ,
但现在该规范已被取代 。
4.
隐私和安全考虑
本规范仅调整我们如何计算滚动位置,
不引入新的隐私或安全问题。
变更
自 2020 年 2 月 11 日工作草案以来的变更
文档约定
一致性要求通过描述性断言和 RFC 2119 术语的组合来表达。关键字“MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD
NOT”、“RECOMMENDED”、“MAY”和“OPTIONAL”在本文档的规范部分应按照 RFC 2119 的说明进行解释。
但是,为了可读性,这些词在本规范中未全部使用大写字母表示。
除明确标记为非规范性部分、示例和注释的部分外,本规范的所有文本均为规范性文本。[RFC2119]
本规范中的示例以“例如”引入,或通过class="example"
与规范文本区分开来,如下所示:
说明性注释以“Note”开头,并通过class="note"
与规范文本区分开来,如下所示:
注意,这是一个说明性注释。
建议是规范性部分,样式设计用于引起特别关注,并通过<strong class="advisement">
与其他规范文本区分开来,如下所示:
用户代理必须提供可访问的替代方案。
本规范的一致性
定义了三种一致性类别:
样式表
一个CSS 样式表 。
渲染器
一个用户代理 ,它解释样式表的语义并渲染
使用它们的文档。
创作工具
一个用户代理 ,用于编写样式表。
如果样式表中使用的所有语法符合本模块中定义的通用 CSS 语法和每个功能的个体语法,则该样式表符合本规范。
渲染器符合本规范的要求,
如果在解释样式表时,它不仅按照适当的规范进行解释,还正确支持本规范定义的所有功能,
并相应地渲染文档。然而,用户代理由于设备限制无法正确渲染文档并不意味着用户代理不合规。(例如,用户代理不要求在单色显示器上渲染颜色。)
创作工具符合本规范的要求,
如果它编写的样式表在语法上符合通用 CSS 语法和本模块中每个功能的个体语法,并符合本模块中描述的样式表的所有其他一致性要求。
部分实现
为了让作者能够利用向前兼容的解析规则分配回退值,CSS 渲染器必须 将没有可用支持级别的 at 规则、属性、属性值、关键字和其他语法结构视为无效(并根据情况忽略 )。特别是,用户代理不得 选择性忽略不支持的组件值并接受单个多值属性声明中的支持值:如果任何值被视为无效(不支持的值必须如此),CSS
要求整个声明被忽略。
为了避免与未来稳定的 CSS 功能冲突,
CSSWG 建议遵循最佳实践 ,以实现不稳定 的功能和 CSS 的专有扩展 。
非实验性实现
一旦规范达到候选推荐阶段,
就可以进行非实验性实现,实施者应发布任何 CR 级别功能的未加前缀的实现,前提是他们能够证明其已按照规范正确实现。
为了建立和维护 CSS 在不同实现中的互操作性,CSS 工作组要求非实验性的 CSS 渲染器在发布任何 CSS 功能的未加前缀实现之前,向 W3C 提交实施报告(如果需要,还包括用于该实施报告的测试用例)。提交给 W3C
的测试用例将由 CSS 工作组审查和修订。
有关提交测试用例和实施报告的更多信息,请访问 CSS 工作组的网站:https://www.w3.org/Style/CSS/Test/ 。
相关问题应发送至public-css-testsuite@w3.org
邮件列表。
索引
本规范定义的术语
引用定义的术语
参考文献
规范性参考文献
[CSS-BOX-4]
Elika Etemad. CSS Box Model Module Level 4 . 2020年4月21日.
WD. URL: https://www.w3.org/TR/css-box-4/
[CSS-DISPLAY-3]
Tab Atkins Jr.; Elika Etemad. CSS Display Module Level 3 .
2020年5月19日. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-OVERFLOW-3]
David Baron; Elika Etemad; Florian Rivoal. CSS Overflow
Module Level 3 . 2020年6月3日. WD. URL: https://www.w3.org/TR/css-overflow-3/
[CSS-POSITION-3]
Elika Etemad; et al. CSS Positioned Layout Module Level
3 . 2020年5月19日. WD. URL: https://www.w3.org/TR/css-position-3/
[CSS-SCROLL-SNAP-1]
Matt Rakow; et al. CSS Scroll Snap Module Level 1 .
2019年3月19日. CR. URL: https://www.w3.org/TR/css-scroll-snap-1/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS Box Sizing Module Level
3 . 2020年10月23日. WD. URL: https://www.w3.org/TR/css-sizing-3/
[CSS-TRANSFORMS-1]
Simon Fraser; et al. CSS Transforms Module Level 1 .
2019年2月14日. CR. URL: https://www.w3.org/TR/css-transforms-1/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module
Level 3 . 2019年6月6日. CR. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module
Level 4 . 2019年1月31日. 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/
[CSS2]
Bert Bos; et al. 层叠样式表 2 级修订版 (CSS 2.1)
规范 . 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS21/
[CSSOM-VIEW]
Simon Pieters. CSSOM View Module . 2016年3月17日. WD. URL:
https://www.w3.org/TR/cssom-view-1/
[DOM]
Anne van Kesteren. DOM Standard . Living Standard. URL: https://dom.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML Standard . 现行标准.
URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
S. Bradner. 用于在RFC中指示需求级别的关键字 . 1997年3月. 最佳当前实践. URL: https://tools.ietf.org/html/rfc2119
属性索引
名称
值
初始值
适用于
继承
百分比
动画类型
规范顺序
计算值
overflow-anchor
auto | none
auto
所有元素
否
不适用
离散
按语法
指定的关键词