如何使用Javascript获取滚动条位置?

IT技术 javascript browser scroll dom-events
2021-02-06 13:04:57

我试图用 JavaScript 检测浏览器滚动条的位置,以确定当前视图在页面中的位置。我的猜测是我必须检测轨道上拇指的位置,然后拇指的高度占轨道总高度的百分比。我是否过于复杂了,还是 JavaScript 提供了比这更简单的解决方案?任何想法代码明智?

6个回答

您可以使用element.scrollTopelement.scrollLeft分别获取已滚动的垂直和水平偏移量。elementdocument.body如果你关心整个页面。如果您需要百分比您可以将它与element.offsetHeightelement.offsetWidth(同样,element可能是身体)进行比较

你使用的是什么浏览器?在不同的浏览器中获取主体的方式不同(element并且document.body只是示例)。有关详细信息,请参阅howtocreate.co.uk/tutorials/javascript/browserwindow
2021-03-12 13:04:57
我认为document.body在大多数现代浏览器中都没有设置滚动位置——它通常是document.documentElement现在设置的有关Chrome 的过渡,请参阅bugs.chromium.org/p/chromium/issues/detail?id=157855
2021-03-14 13:04:57
scrollTop 仅在我添加括号时对我有用... $(".scrollBody").scrollTop()
2021-03-20 13:04:57
如果您正在处理 'window' 元素,您可以使用 window.scrollY 而不是 window.scrollTop
2021-03-28 13:04:57
我得到了它在 Firefox 3.6 上给我正确的值window.pageYOffset,但在 IE7 上不能得到任何工作。试过了window.pageYOffset, document.body.scrollTop, document.documentElement.scrollTop,element.scrollTop
2021-04-10 13:04:57

<div>在 Chrome 上做了这个

element .scrollTop - 由于滚动而隐藏在顶部的像素。没有滚动时,其值为 0。

element .scrollHeight - 是整个 div 的像素。

element .clientHeight - 是您在浏览器中看到的像素。

var a = element.scrollTop;

将是位置。

var b = element.scrollHeight - element.clientHeight;

将是最大的valuescrollTop的

var c = a / b;

将是滚动的百分比[from 0 to 1]

这几乎是正确的。对于 var b,您应该减去 window.innerHeight 而不是 element.clientHeight。
2021-03-11 13:04:57
谢谢老运动!
2021-03-30 13:04:57
为什么这不是答案。?好同事
2021-04-07 13:04:57
document.getScroll = function() {
    if (window.pageYOffset != undefined) {
        return [pageXOffset, pageYOffset];
    } else {
        var sx, sy, d = document,
            r = d.documentElement,
            b = d.body;
        sx = r.scrollLeft || b.scrollLeft || 0;
        sy = r.scrollTop || b.scrollTop || 0;
        return [sx, sy];
    }
}

返回一个包含两个整数的数组 - [scrollLeft, scrollTop]

用一个例子展示如何使用这个函数会很棒。
2021-03-12 13:04:57
我想你可以使用这个 lastscroll = getScroll(); window.scrollTo(lastscroll[0], lastscroll[1]);
2021-03-19 13:04:57
效果很好,但我将返回更改为带有 x 和 y 键的对象,因为这对我来说更有意义。
2021-03-22 13:04:57
根据@user18490 的评论进行编辑。
2021-03-22 13:04:57
参考错误:找不到变量:元素
2021-04-06 13:04:57

就像这样 :)

window.addEventListener("scroll", (event) => {
    let scroll = this.scrollY;
    console.log(scroll)
});
为了清楚起见this,这里提到了windowscrollY是一个属性window
2021-03-14 13:04:57

2018 年的答案

执行此类操作的最佳方法是使用Intersection Observer API

Intersection Observer API 提供了一种异步观察目标元素与祖先元素或顶级文档视口的交集变化的方法。

从历史上看,检测一个元素的可见性,或两个元素相互之间的相对可见性,一直是一项艰巨的任务,解决方案不可靠并且容易导致浏览器和用户访问的站点变得缓慢。不幸的是,随着网络的成熟,对此类信息的需求也在增长。需要交点信息的原因有很多,例如:

  • 在页面滚动时延迟加载图像或其他内容。
  • 实施“无限滚动”网站,在您滚动时加载和呈现越来越多的内容,这样用户就不必翻阅页面。
  • 报告广告的可见性以计算广告收入。
  • 根据用户是否会看到结果来决定是否执行任务或动画处理。

过去实现交叉检测涉及事件处理程序和循环调用方法,如 Element.getBoundingClientRect() 为每个受影响的元素构建所需的信息。由于所有这些代码都在主线程上运行,即使其中之一也会导致性能问题。当一个站点加载了这些测试时,事情会变得非常丑陋。

请参阅以下代码示例:

var options = {
  root: document.querySelector('#scrollArea'),
  rootMargin: '0px',
  threshold: 1.0
}

var observer = new IntersectionObserver(callback, options);

var target = document.querySelector('#listItem');
observer.observe(target);

大多数现代浏览器都支持 IntersectionObserver,但为了向后兼容,您应该使用polyfill

这是 SO 中的一个不幸的弱点,即被接受为正确的答案可能会成为(由于回答者的过错)错误,但会被永远接受。对于 document.body 案例,现在接受的答案已经完全错误,因为正如@fzzfzzfzz 在对接受的答案的评论中所说,“在大多数现代浏览器中,滚动位置未设置在 document.body 上——它通常设置在文档上.documentElement 现在。有关 Chrome 的转换,请参阅 bugs.chromium.org/p/chromium/issues/detail?id=157855。” 理想情况下,这个 2018 Intersection Observer API 答案将被设置为新的接受答案。
2021-03-13 13:04:57