滚动锚定概述

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

作为一名网页用户,您可能熟悉滚动锚定所解决的问题。您在一个慢速连接上浏览一个很长的页面,并开始滚动阅读内容;当您忙于阅读时,您正在查看的页面部分突然跳动。这是因为大图片或其他一些元素刚加载到内容中更靠上的位置。

滚动锚定是一种浏览器功能,旨在解决内容跳动的问题,当用户已经滚动到文档的新部分之后内容才加载时,就会发生这种问题。

它是如何工作的?

滚动锚定会调整滚动位置,以补偿视口之外的更改。这意味着用户正在查看的文档中的点会保留在视口中,这可能意味着他们的滚动位置实际上会根据他们在文档中移动的“距离”而改变。

如何开启滚动锚定?

您不需要!此功能在支持的浏览器中默认启用。在大多数情况下,锚定滚动正是您想要的——内容跳动对任何人来说都是糟糕的体验。

如果我需要调试它怎么办?

如果您的页面在启用滚动锚定后行为不佳,可能是因为某些 scroll 事件监听器没有处理额外的滚动以补偿锚定节点的移动。

您可以通过在 Firefox 的 about:config 中将 layout.css.scroll-anchoring.enabled 更改为 false 来检查禁用滚动锚定是否解决了问题。您还可以使用 layout.css.scroll-anchoring.highlight 开关检查 Firefox 使用哪个节点作为锚点。这将在锚点节点顶部显示一个紫色覆盖层。

如果某个节点似乎不是一个合适的锚点,您可以使用 overflow-anchor 将其排除,如下所述。

如果我需要禁用它怎么办?

CSS 滚动锚定模块提供了 overflow-anchor 属性,可用于禁用文档全部或部分的滚动锚定。它本质上是一种选择退出此行为的方式。

唯一可能的值是 autonone

  • auto 是初始值;只要用户的浏览器支持滚动锚定,此行为就会发生,并且他们应该会看到更少的内容跳动。
  • none 意味着您已明确选择禁用文档或文档部分的滚动锚定。

要禁用整个文档的滚动锚定,您可以在 <body> 元素上设置它

css
body {
  overflow-anchor: none;
}

要禁用文档某一部分的滚动锚定,请在该部分的容器元素上设置 overflow-anchor: none

css
.container {
  overflow-anchor: none;
}

如果禁用文档或文档某一部分的滚动锚定,则禁用区域的后代不能重新启用。例如,如果您禁用整个文档,则不能在后代节点上设置 overflow-anchor: auto 以重新开启该子部分的滚动锚定。

抑制触发器

存在一些“抑制触发器”,它们会在可能出现问题的地方禁用滚动锚定。如果锚点节点或其祖先节点上发生任何触发器,则锚定将被抑制。

这些抑制触发器是以下任何属性的计算值的更改:

此外,position滚动容器 内的任何位置发生更改也会禁用滚动锚定。

规范

规范
CSS 滚动锚定模块级别 1
# 排除 API

浏览器兼容性

要根据是否可以禁用滚动锚定有条件地应用样式,请使用 @supports 功能查询来测试对 overflow-anchor 属性的支持。

另见