如何使用 JavaScript 滚动到元素?

IT技术 javascript html
2021-02-07 21:50:46

我正在尝试将页面移动到一个<div>元素。

我试过下一个代码无济于事:

document.getElementById("divFirst").style.visibility = 'visible';
document.getElementById("divFirst").style.display = 'block';
6个回答

scrollIntoView 效果很好:

document.getElementById("divFirst").scrollIntoView();

MDN 文档中的完整参考:https :
//developer.mozilla.org/en-US/docs/Web/API/Element.scrollIntoView

我确认,截至 4 月 16 日,它也适用于 Opera 和 Chrome。
2021-03-13 21:50:46
曾在 Firefox、Opera 和 Safari 中工作。
2021-03-18 21:50:46
使用此解决方案并且顶部有固定导航栏时,您也需要考虑这一点。不同的解决方案可能更合适,例如 windows.scrollTo(posX, posY) 并正确计算 posY。
2021-03-20 21:50:46
这是浏览器兼容性的另一个来源(caniuse)scrollIntoView
2021-03-22 21:50:46
@CameronMcCluskie 只是奇怪的“scrollIntoViewOptions”(平滑滚动等)具有独有的 Firefox 支持。我在回答中的基本用法几乎适用于任何事情。
2021-03-24 21:50:46

您可以使用锚点来“聚焦” div。IE:

<div id="myDiv"></div>

然后使用以下 javascript:

// the next line is required to work around a bug in WebKit (Chrome / Safari)
location.href = "#";
location.href = "#myDiv";
这对我来说效果不佳,因为它将所有这些导航事件添加到浏览器历史记录中,而且我无法轻松返回上一页
2021-03-29 21:50:46
如果滚动条位于内部 div 中怎么办?
2021-03-30 21:50:46
我确实遇到了这个问题,但是 WebKit 的“修复”在 FF 3.6.13 中给我带来了问题。它在没有“#”行的情况下工作,但如果你添加它,它会转到“#”并且永远不会尝试转到“#myDiv”。我会坚持不带“#”的解决方案,这对我有用......哇!
2021-04-01 21:50:46
Chrome (WebKit) 有一个错误,一旦设置了锚点,页面就不会滚动。使用:location.href="#";location.href="#myDiv"使用id="myDiv"是首选name="myDiv"并且也有效。
2021-04-10 21:50:46
我认为下面的“AnhSirk Dasarp”是将所需元素滚动到可见屏幕顶部的更好方法。
2021-04-11 21:50:46

你的问题和答案看起来不同。我不知道我是否弄错了,但对于那些用谷歌搜索并到达这里的人,我的答案如下:

  1. 我对 stackoverflow 的回答
  2. 一个类似的问题

我的回答解释了:

这是一个简单的javascript

当您需要将屏幕滚动到具有 id="yourSpecificElementId" 的元素时调用此方法

window.scroll(0,findPos(document.getElementById("yourSpecificElementId")));

IE。对于上述问题,如果目的是将屏幕滚动到 id 为 'divFirst' 的 div

代码将是: window.scroll(0,findPos(document.getElementById("divFirst")));

你需要这个功能来工作:

//Finds y value of given object
function findPos(obj) {
    var curtop = 0;
    if (obj.offsetParent) {
        do {
            curtop += obj.offsetTop;
        } while (obj = obj.offsetParent);
    return [curtop];
    }
}

屏幕将滚动到您的特定元素。

谢谢,我觉得这应该是公认的答案,它是 java 脚本,而不是像当前答案那样对我不起作用的 HTML,但确实如此!
2021-03-15 21:50:46
也就是说,如果它是window您想要滚动的,而不是溢出的查看区域
2021-03-29 21:50:46
此解决方案的优点是不会通过添加 MyID 锚点来弄乱浏览器导航栏中的可见 URL。
2021-03-31 21:50:46
如果您不希望它将此元素推送到页面的最顶端,而是希望它滚动以使该元素位于屏幕中央,请(window.screen.height/2)从 findPos 中减去
2021-04-04 21:50:46
最后更改[curtop]后工作curtop
2021-04-06 21:50:46

适用于 Chrome 和 Firefox

我一直在研究这个,我想出了这个,不知何故感觉像是最自然的方法。当然,这是我现在个人最喜欢的卷轴。:)

const y = element.getBoundingClientRect().top + window.scrollY;
window.scroll({
  top: y,
  behavior: 'smooth'
});

对于 IE、Edge 和 Safari 支持者

请注意,window.scroll({ ...options })IE、Edge 和 Safari 不支持。在这种情况下,最有可能使用 element.scrollIntoView(). (支持 IE 6)。很可能(阅读:未经测试)传递选项而没有任何副作用。

这些当然可以包装在一个函数中,该函数根据所使用的浏览器来表现。

感谢您的评论,我更新了答案以包含浏览器兼容性。
2021-03-13 21:50:46
我想采用您的解决方案,因为可以微调位置(在我的情况下为 y-80)。看来,作为 var element = document.getElementById("Div"); 在您的示例中缺少吗?此外,它不适用于 IE11。IE11 不知道 window.scrollY - 我们必须使用 window.pageYOffset 来接收值。在我改变它之后,我有各种(不理解)jquery 错误(当然 - 大部分 - 仅在 IE11 中。因此,我已经实现了 document.getElementById("divFirst").scrollIntoView(); 然后 $(window ).scrollTop($(window).scrollTop() - 80); 适用于所有浏览器。
2021-03-14 21:50:46
这是使用 Chrome 对我有用的唯一解决方案。
2021-03-15 21:50:46
像魅力一样工作:)
2021-04-06 21:50:46
Safari 不支持(将选项传递给 window.scroll
2021-04-06 21:50:46

最好,最短的答案,即使使用动画效果也能正常工作:

var scrollDiv = document.getElementById("myDiv").offsetTop;
window.scrollTo({ top: scrollDiv, behavior: 'smooth'});

如果你有一个固定的导航栏,只需从顶部值减去它的高度,所以如果你的固定栏高度是 70px,第 2 行看起来像:

window.scrollTo({ top: scrollDiv-70, behavior: 'smooth'});

说明: 第1行获取元素位置第2行滚动到元素位置;behavior属性添加了平滑的动画效果

真的很酷,但还不能在 Safari 和其他一些浏览器上运行。虽然可以使用这个polyfill github.com/iamdustan/smoothscroll;)
2021-04-10 21:50:46