ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在尝试使用 JavaScript 检测浏览器滚动条的位置,以确定当前视图在页面中的位置。

我的猜测是,我必须检测轨道上拇指的位置,然后检测拇指的高度占轨道总高度的百分比。我是否过于复杂了,还是 JavaScript 提供了比这更简单的解决方案?一些代码会是什么样子?


L
Laniakea

您可以使用 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.scrollY 而不是 window.scrollTop
我认为大多数现代浏览器中的滚动位置都没有设置在 document.body 上 - 现在通常设置在 document.documentElement 上。有关 Chrome 的转换,请参见 bugs.chromium.org/p/chromium/issues/detail?id=157855
C
Community

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

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

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

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

var a = element.scrollTop;

将是位置。

var b = element.scrollHeight - element.clientHeight;

将是 scrollTop 的最大值。

var c = a / b;

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


这几乎是正确的。对于 var b,您应该减去 window.innerHeight 而不是 element.clientHeight。
谢谢老体育!
为什么这不是答案。?好工作伙伴
d
dYale
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:找不到变量:元素
P
Peter Mortensen

就像这样 :)

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

为了清楚起见,本文中的 this 指的是 windowscrollYwindow 的属性
s
str

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');观察者.观察(目标);

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


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

如果你关心整个页面,你可以使用这个:

document.body.getBoundingClientRect().top

改用 document.body
片段真的有效吗?
它不再是一个片段。但是您可以在控制台中对其进行测试并查看结果
S
Simon the Salmon

如果您使用的是 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,那么我几乎不会被鼓励继续前进
P
Peter Mortensen

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

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

G
Gass

片段

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}


那行得通!多谢!!!
A
AmerllicA

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

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

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