向后/向前导航时,浏览器滚动到上一个位置而不是锚点

Browser scrolling to previous position instead of anchors when navigating back / forward

我正在用纯 HTML / CSS(无 JS)构建一个滑块。效果很好,参见 the code

您需要下载并在本地执行才能理解我的问题,因为它与浏览器的后退和前进按钮有关。

单击链接进行导航时,URL 会更改为#a1、#a7、#a5,无论您在做什么。滑块正确滚动到适当的幻灯片。如果您手动更改 URL,例如将 #a3 替换为 #a7,滑块也将正确滚动。

但是,当您返回(或前进)时,URL 从#a3 变为#a7,但内容不会滚动

知道为什么吗?知道我可以做些什么来让滚动在后面吗?

我问了一位 Firefox 开发人员,他向我解释了为什么这是预期的行为,而不是错误。

我误解了背部动作是怎么回事。快速回答:它不会转到之前选择的锚点,它会转到主体滚动所在的位置

问题中仍然使用codepen中的代码:

  • 从 CSS
  • 中删除 overflow-x: scroll
  • 点击#a3,然后点击#a7。内容滚动到#a7
  • 单击浏览器的后退按钮

我以为浏览器正在滚动回#a3。但实际上,它正在滚动到您单击 link 之前的位置。要查看实际效果:

  • 点击#a5。 URL 更改为 #a5
  • 移动滚动条使#a3出现在屏幕上
  • 点击#a7。 URL 更改为 #a7
  • 单击浏览器的后退按钮

URL 更改为 #a5 但屏幕上显示 #a3,因为那是您在单击 link 之前所在的位置.

所以,这是预期的行为 according to the whatwg spec

然而,这不是想要的行为。那么,让我们来一个肮脏的黑客:

window.onhashchange = function() {
  window.location.href = window.location.href;
};

现在,当点击返回时,它会强制页面在本地重新加载(没有服务器请求)并且它会滚动到该元素。

哇,好难啊。