ChatGPT解决这个技术问题 Extra ChatGPT

如何将 HTML 页面滚动到给定的锚点

我想让浏览器将页面滚动到给定的锚点,只需使用 JavaScript。

我在 HTML 代码中指定了 nameid 属性:

 <a name="anchorName">..</a>

或者

 <h1 id="anchorName2">..</h1>

我希望通过导航到 http://server.com/path#anchorName 获得与您相同的效果。页面应滚动,使锚点靠近页面可见部分的顶部。


D
Dean Harding
function scrollTo(hash) {
    location.hash = "#" + hash;
}

根本不需要 jQuery!


但这实际上并没有滚动,它只是跳跃。那时您不妨只链接到锚点 <a href="#anchorName">link</a>
请注意,这只会工作一次。设置散列后,页面将不会滚动到相同的散列,除非您将其更改为虚拟散列,然后再次设置。
您不应该使用 scrollTo,因为它已被全局窗口对象使用。此外,参数不应命名为 hash,因为 location.hash 也已定义。您可以使用此代码:function scrollToHash(hashName) { location.hash = "#" + hashName; }
@MarkusZeller,为什么不应该将参数称为哈希?它不会与位置冲突,是吗?
如果您设置“滚动行为:平滑;”,这确实会滚动在 html 元素上
A
Armando Pérez Marqués

更简单的方式:

var element_to_scroll_to = document.getElementById('anchorName2');
// Or:
var element_to_scroll_to = document.querySelectorAll('.my-element-class')[0];
// Or:
var element_to_scroll_to = $('.my-element-class')[0];
// Basically `element_to_scroll_to` just have to be a reference
// to any DOM element present on the page
// Then:
element_to_scroll_to.scrollIntoView();

起初我以为 Mandx 是在拖钓,然后我试了一下,它奏效了。除了我之外,我以前从未遇到过这种方法。 Mozilla Docs for this method。此外,这似乎将在浏览器中得到很好的支持。
我有很多关于 jquery 解决方案不滚动的问题。这让我省去了很多挫败感。
警告!如果上面的 div 包含浮动元素并且无法轻松确定其大小,则此方法可能会出现问题。
这是一个干净的解决方案,但是到目前为止,它不允许进行任何调整,而是进行硬滚动。有一个实验参数 scrollIntoViewOptions 有一个 behavior: "smooth" 选项,但它目前仅与 Firefox 兼容。
如果您认为您想要平滑滚动,您应该使用 document.getElementById("xyz").scrollIntoView({block:"nearest", behavior:"smooth"});,这样如果用户在浏览器设置中禁用了平滑滚动,他们就不会被迫平滑滚动。 Safari 不支持这一点,因此它只会在没有动画的情况下捕捉到正确的位置。您应该使用它而不是滚动到给定的像素偏移,因为这会自动尊重例如 scroll-margin 属性。重新实现对 scroll-margin 的支持会非常复杂。
P
Peter Mortensen

您可以使用 jQuery 的 .animate().offset()scrollTop。喜欢

$(document.body).animate({
    'scrollTop':   $('#anchorName2').offset().top
}, 2000);

示例链接:http://jsbin.com/unasi3/edit

如果您不想制作动画,请使用 .scrollTop(),例如:

$(document.body).scrollTop($('#anchorName2').offset().top);

或者 JavaScript 的原生 location.hash,例如:

location.hash = '#' + anchorid;

至于创建一个选择器来查找 <h1 id="anchorName"><a name="anchorName">,请使用 $('#'+hash+',a[name='+hash+']') 或稍微优化的 $(document.getElementById(hash) || 'a[name='+hash+']'),它将首先按 id 搜索元素,并且仅在没有时才搜索 a成立。
@gnarf - 没有任何需要优化 jQuery 中的 '#' 选择器 - 它们已经为你优化了。很容易看出您是否阅读过 jQuery 源代码。
@CodeJoust - 我是 jQuery 团队的一员,我已经读过很多次了,是的,$("#selector") 已经过优化,但 $("#selector,a[name='selector']") 不会很快通过相同的优化。我想我 2.5 岁的评论听起来有点奇怪。 “优化”是在找到 id 时避免 a[name='selector'] 搜索,而不是优化对 id 的搜索。
我对这种方法很幸运: About