【问题标题】:How can I get the scrollbar position with JavaScript?如何使用 Javascript 获取滚动条位置?
【发布时间】:2011-01-29 16:41:33
【问题描述】:

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

【问题讨论】:

    标签: javascript browser scroll dom-events


    【解决方案1】:

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

    【讨论】:

    • 你用的是什么浏览器?在不同的浏览器中获取正文的方式不同(elementdocument.body 只是示例)。详情请见howtocreate.co.uk/tutorials/javascript/browserwindow
    • 我在 Firefox 3.6 上使用 window.pageYOffset 为我提供了正确的值,但无法在 IE7 上运行任何东西。试过window.pageYOffsetdocument.body.scrollTopdocument.documentElement.scrollTopelement.scrollTop
    • scrollTop 仅在我添加括号时对我有用... $(".scrollBody").scrollTop()
    • 如果你正在处理'window'元素,你可以使用window.scrollY而不是window.scrollTop
    • 我认为在大多数现代浏览器中滚动位置没有设置在document.body - 现在通常设置在document.documentElement。有关 Chrome 的转换,请参阅 bugs.chromium.org/p/chromium/issues/detail?id=157855
    【解决方案2】:

    我在 Chrome 上为 <div> 这样做了。

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

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

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

    var a = element.scrollTop;
    

    将是位置。

    var b = element.scrollHeight - element.clientHeight;
    

    将是 scrollTop最大值

    var c = a / b;
    

    将是滚动百分比[从 0 到 1]

    【讨论】:

    • 这几乎是对的。对于 var b 你应该减去 window.innerHeight 而不是 element.clientHeight。
    • 谢谢老运动!
    • 为什么这不是答案。?好同事
    【解决方案3】:
    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]

    【讨论】:

    • 用一个例子来展示如何使用这个函数会很棒。
    • 我猜你可以使用这个 lastscroll = getScroll(); window.scrollTo(lastscroll[0], lastscroll[1]);
    • 效果很好,但我用 x 和 y 键将返回值更改为对象,因为这对我来说更有意义。
    • 根据@user18490 的评论编辑。
    • ReferenceError: 找不到变量:元素
    【解决方案4】:

    是这样的:)

    window.addEventListener("scroll", (event) => {
        let scroll = this.scrollY;
        console.log(scroll)
    });
    

    【讨论】:

    • 为了清楚起见,this 在这种情况下指的是windowscrollYwindow 的属性
    【解决方案5】:

    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);
    

    大多数现代浏览器support the IntersectionObserver,但您应该使用polyfill 来实现向后兼容。

    【讨论】:

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

    如果您关心整个页面。你可以用这个:

    document.body.getBoundingClientRect().top

    【讨论】:

    • 改用 document.body
    【解决方案7】:

    如果你使用 jQuery,有一个完美的函数适合你:.scrollTop()

    文档在这里 -> http://api.jquery.com/scrollTop/

    注意:您可以使用此功能检索或设置位置。

    另见:http://api.jquery.com/?s=scroll

    【讨论】:

    • 为什么用 JS 库来回答一个关于 JS 的问题,而在原始 JS 中这样做是完全可能的,甚至是方便的呢?你只是要求他增加额外的加载时间,并用一些存储空间来做一些完全不必要的事情。另外,javascript 是从什么时候开始表示 JQuery 的?
    • 如果你单独问,我从不喜欢 jQuery,我还没有回答这个问题,但是在 Vanilla JS 中已经有其他人给出的答案,那么如果有人在其中添加了美味的香料,那有什么问题线程。(他已经提到如果你使用 jQuery)
    • @R01010010 这是因为现在 JQuery 无用且适得其反,JQuery 的所有功能都可以通过 VanilaJS 轻松实现,而且您也变得依赖于 JQuery 内部的内容,VanillsaJS 中提供了新功能,您作为程序员,不会更新,例如,现在 VanillaJS 中有一个名为 fetch 的新 API 取代了旧的 XHR,如果您只是在 JQuery 的世界中,将永远不会看到 fetch 的好处并继续使用 jQuery.ajax()。我个人的看法是,继续使用 JQuery 的人是因为他们停止了学习。 VanillaJS 也更快 vanilla-js.com
    • @JohnBalvinArias 谈论 fetch,ie11 甚至 Edge 发生了什么?
    • 如果我错了,请纠正我,但是 fetch 在“现代” ie 上不能正常工作,并且 ie 仍然被广泛使用。如果我使用的是 jquery,那么我几乎不会被鼓励继续前进
    【解决方案8】:

    这是获取滚动位置的另一种方法

    const getScrollPosition = (el = window) => ({
      x: el.pageXOffset !== undefined ? el.pageXOffset : el.scrollLeft,
      y: el.pageYOffset !== undefined ? el.pageYOffset : el.scrollTop
    });
    

    【讨论】:

      【解决方案9】:

      片段

      Window 接口的只读 scrollY 属性返回 文档当前垂直滚动的像素数

      window.addEventListener("scroll", function(){  console.log(this.scrollY)  })
      html{height:5000px}

      使用 JavaScript ES6 并避免使用 this

      的较短版本

      window.addEventListener("scroll", () => { console.log(scrollY) })
      html{height:5000px}

      【讨论】:

      • 成功了!非常感谢!!!
      【解决方案10】:

      我认为以下函数可以帮助获得滚动坐标值:

      const getScrollCoordinate = (el = window) => ({
        x: el.pageXOffset || el.scrollLeft,
        y: el.pageYOffset || el.scrollTop,
      });
      

      我从this answer 得到这个想法,做了一点改动。

      【讨论】:

        猜你喜欢
        • 2014-02-23
        • 2021-09-06
        • 2023-01-10
        • 2012-12-04
        • 2015-10-21
        • 2013-03-22
        • 2023-01-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多