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


188

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

Answers:


207

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


2
你使用的是什么浏览器?获取体在不同的浏览器做不同的(element并且document.body只是举例)。有关详细信息,请参见howtocreate.co.uk/tutorials/javascript/browserwindow
Max Shawabkeh 2010年

8
我得到了它,可以通过Firefox 3.6为我提供正确的值window.pageYOffset,但是在IE7上无法正常工作。尝试过“” window.pageYOffsetdocument.body.scrollTopdocument.documentElement.scrollTopelement.scrollTop
保罗

1
当我添加方括号时,scrollTop仅对我有用... $(“。scrollBody”)。scrollTop()
maia

9
如果要处理“ window”元素,则可以使用window.scrollY而不是window.scrollTop
Janis Jansen

6
我认为document.body大多数现代浏览器都没有设置滚动位置-通常document.documentElement现在就设置滚动位置。有关Chrome的过渡,请参见bugs.chromium.org/p/chromium/issues/detail?id=157855
fzzfzzfzz

134

我这样做是为了<div>在Chrome上进行的。

元素.scrollTop-是由于滚动而隐藏在顶部的像素。不滚动时,其值为0。

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

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

var a = element.scrollTop;

将是职位。

var b = element.scrollHeight - element.clientHeight;

将是最大的价值scrollTop的

var c = a / b;

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


谢谢!大概不是从0到1,因为实际上您实际上不能滚动到元素的底部-对吗?

3
这几乎是正确的。对于var b,您应该减去window.innerHeight而不是element.clientHeight。
Kahless

51
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]


4
举例说明如何使用此功能。
user18490 2014年

1
我猜你可以使用lastscroll = getScroll(); window.scrollTo(lastscroll [0],lastscroll [1]);
Dinesh Rajan 2014年

效果很好,但是我用x和y键更改了对对象的返回,因为这对我来说更有意义。
xd6_

在@ user18490的评论之后进行编辑。
Davide Cannizzo,

ReferenceError:找不到变量:element
Jonny

32

就像这样 :)

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

11

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来实现向后兼容。



3

如果您使用的是jQuery,则有一个完美的功能:.scrollTop()

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

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

另请参阅:http : //api.jquery.com/?s=scroll


25
如果完全可以甚至方便地在原始JS中使用JS库,为什么还要用JS库回答有关JS的问题?您只是在问他增加额外的加载时间,以及用完一些完全不需要的存储空间。另外,从什么时候开始javascript就意味着JQuery?
DaemonOfTheWest

4
如果你单独问我从来不喜欢jQuery,但我还没有回答这个问题,但是在Vanilla JS中已经有其他人给出了答案,那么如果有人在这个线程中添加了美味的香料又是什么问题呢(他已经提到过,如果您正在使用jQuery)
Ravinder Payal's

@ R01010010这是因为现在JQuery毫无用处且适得其反,使用VanilaJS可以轻松实现JQuery的所有功能,您也将依赖于JQuery的内部功能,而VanillsaJS则提供了新功能,您作为程序员,不会更新,仅作为示例,如今VanillaJS中有一个名为fetch的新API取代了旧的XHR,如果您只是在JQuery领域,永远不会看到fetch的好处,而继续使用jQuery.ajax()。我个人的看法是,使用JQuery是因为他们停止学习了。同样VanillaJS的速度更快vanilla-js.com
John Balvin Arias

@JohnBalvinArias谈论获取,ie11甚至Edge上发生了什么?

如果我错了,请指正我,但是fetch在“现代”上无法正常工作,即仍然被广泛使用。如果我使用jQuery,我很难被鼓励继续前进,然后

3

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

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

0

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

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

我从这个答案中得到了这个想法,做了一点改动。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.