我想让浏览器将页面滚动到给定的锚点,只需使用 JavaScript。
我在 HTML 代码中指定了 name
或 id
属性:
<a name="anchorName">..</a>
或者
<h1 id="anchorName2">..</h1>
我希望通过导航到 http://server.com/path#anchorName
获得与您相同的效果。页面应滚动,使锚点靠近页面可见部分的顶部。
function scrollTo(hash) {
location.hash = "#" + hash;
}
根本不需要 jQuery!
更简单的方式:
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();
scrollIntoViewOptions
有一个 behavior: "smooth"
选项,但它目前仅与 Firefox 兼容。
document.getElementById("xyz").scrollIntoView({block:"nearest", behavior:"smooth"});
,这样如果用户在浏览器设置中禁用了平滑滚动,他们就不会被迫平滑滚动。 Safari 不支持这一点,因此它只会在没有动画的情况下捕捉到正确的位置。您应该使用它而不是滚动到给定的像素偏移,因为这会自动尊重例如 scroll-margin
属性。重新实现对 scroll-margin
的支持会非常复杂。
您可以使用 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成立。
$("#selector")
已经过优化,但 $("#selector,a[name='selector']")
不会很快通过相同的优化。我想我 2.5 岁的评论听起来有点奇怪。 “优化”是在找到 id 时避免 a[name='selector']
搜索,而不是优化对 id 的搜索。
<a href="#anchorName">link</a>
function scrollToHash(hashName) { location.hash = "#" + hashName; }