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

IT技术 javascript jquery html scroll anchor
2021-01-10 01:33:48

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

在我的 HTML 代码中指定了一个nameorid属性:

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

或者

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

我想获得与导航到http://server.com/path#anchorName. 应该滚动页面,以便锚点靠近页面可见部分的顶部。

6个回答
function scrollTo(hash) {
    location.hash = "#" + hash;
}

根本不需要jQuery!

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

方式更简单:

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 文档此外,这似乎将在浏览器中得到很好的支持。
2021-03-11 01:33:48
这是一个干净的解决方案,但是截至目前它不允许任何调整,它会进行硬滚动。有一个实验参数scrollIntoViewOptions有一个behavior: "smooth"选项,但它目前仅与 Firefox 兼容。
2021-03-15 01:33:48
警告!如果上面的 div 包含浮动元素并且无法轻松确定其大小,则此方法可能会出现问题。
2021-03-16 01:33:48
我在 jquery 解决方案不滚动方面遇到了很多问题。这让我免了很多挫折。
2021-03-18 01:33:48
如果你认为你想要平滑滚动,你应该使用,document.getElementById("xyz").scrollIntoView({block:"nearest", behavior:"smooth"});这样如果用户在浏览器设置中禁用了它,就不会被强制平滑滚动。Safari 不支持此功能,因此它只会在没有动画的情况下卡入正确的位置。您应该使用它而不是滚动到给定的像素偏移量,因为这会scroll-margin自动尊重例如属性。重新实现对 的支持scroll-margin将非常复杂。
2021-04-07 01:33:48

您可以使用 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;
我对这种方法很幸运: <a data-hash="about">About</a> <script> $("[data-hash]").click(function() { var data = $(this) .attr("data-hash"); $(document.body).animate({'scrollTop': $("#"+data).offset().top }, 500); }); </脚本>
2021-03-22 01:33:48
有时这不准确......当页面具有延迟加载的动态部分时
2021-03-25 01:33:48
@CodeJoust - 我是 jQuery 团队的一员,我已经阅读了很多次,是的,它已经过$("#selector")优化,但$("#selector,a[name='selector']")不会很快进行相同的优化。我想我 2.5 岁的评论听起来有点奇怪。“优化”是在a[name='selector']找到 id 时避免搜索,而不是优化对 id 的搜索。
2021-03-27 01:33:48
至于创建一个选择器来查找<h1 id="anchorName">或 an <a name="anchorName">,使用$('#'+hash+',a[name='+hash+']')或稍微优化$(document.getElementById(hash) || 'a[name='+hash+']')它将首先按 id 搜索元素,并且仅在未找到时才搜索 a 。
2021-04-02 01:33:48
@gnarf - 无需优化 jQuery 中的“#”选择器 - 它们已经为您进行了优化。如果您已阅读 jQuery 源代码,就很容易看出。
2021-04-05 01:33:48

2018-2020 纯 JavaScript:

有一种非常方便的方法可以滚动到元素:

el.scrollIntoView({
  behavior: 'smooth', // smooth scroll
  block: 'start' // the upper border of the element will be aligned at the top of the visible part of the window of the scrollable area.
})

但据我所知,它没有以下选项的良好支持。

在此处输入图片说明

了解有关该方法的更多信息。


如果元素必须在顶部:

const element = document.querySelector('#element')
const topPos = element.getBoundingClientRect().top + window.pageYOffset

window.scrollTo({
  top: topPos, // scroll so that the element is at the top of the view
  behavior: 'smooth' // smooth scroll
})

CodePen 上的演示示例


如果您希望元素位于中心:

const element = document.querySelector('#element')
const rect = element.getBoundingClientRect() // get rects(width, height, top, etc)
const viewHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);

window.scroll({
  top: rect.top + rect.height / 2 - viewHeight / 2,
  behavior: 'smooth' // smooth scroll
});

CodePen 上的演示示例


支持:

введите сюда описание изображения

他们编写scroll的方法与 相同scrollTo,但在scrollTo.

更多关于方法

请注意,如果您使用 Web 字体,font-display: swap如果您在换入字体之前测量滚动位置,则最终可能会出现略微不正确的滚动偏移。并且当您使用font-display: swap交换时是异步的,并且取决于客户端网络速度、DNS 服务器、Web 字体托管 CDN 和客户端 CPU 能力,因此它实际上是随机的。您能做的最好的事情是尝试检测字体加载事件:stackoverflow.com/a/66739727/334451
2021-03-21 01:33:48
请注意,scrollIntoView遇到同样的问题scrollto(some px location)- 如果元素的位置在滚动时发生变化,您将滚动到错误的位置。例如,如果您在滚动时加载了未知尺寸的图像,这会很容易发生这种情况,这会将滚动目标元素向下推,而您漂亮的花哨滚动将在过度戏剧化的史诗失败中停止。
2021-04-01 01:33:48
该解决方案非常有效!感谢分享!
2021-04-10 01:33:48

由jAndy的解决方案,但平滑滚动似乎有在Firefox工作的问题。

以这种方式编写它也适用于 Firefox。

(function($) {
    $(document).ready(function() {
         $('html, body').animate({
           'scrollTop':   $('#anchorName2').offset().top
         }, 2000);
    });
})(jQuery);
在最新的 Chrome 版本中,这是我发现始终有效的唯一方法。谢谢你的提示!
2021-04-01 01:33:48