如何检测浏览器窗口是否滚动到底部?

IT技术 javascript
2021-02-06 16:59:31

我需要检测用户是否滚动到页面底部。如果它们在页面底部,当我向底部添加新内容时,我会自动将它们滚动到新底部。如果它们不在底部,则它们正在阅读页面上更高的先前内容,因此我不想自动滚动它们,因为它们想留在原处。

如何检测用户是否已滚动到页面底部,或者他们是否已在页面上滚动到更高位置?

6个回答
window.onscroll = function(ev) {
    if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) {
        // you're at the bottom of the page
    }
};

看演示

当 html/body 元素设置为 100% 时不起作用(以便主体填充整个视口高度)
2021-03-23 16:59:31
@KarlMorrison 你能用你的浏览器尝试获得赏金的答案(@Dekel)吗?
2021-03-27 16:59:31
我使用 document.body.scrollHeight 而不是 offsetHeight(在我的例子中,offsetHeight 总是小于 window.innerHeight)
2021-04-05 16:59:31
使用document.documentElement.scrollTop,而不是window.scrollYIE浏览器。不确定 IE 的哪些版本(如果有)支持window.scrollY.
2021-04-07 16:59:31
不适用于 Chromium 版本 47.0.2526.73 在 Ubuntu 14.04 上构建,在基本操作系统 0.3.2(64 位)上运行
2021-04-09 16:59:31

所有主要浏览器支持的更新代码(包括 IE10 和 IE11)

window.onscroll = function(ev) {
    if ((window.innerHeight + window.pageYOffset) >= document.body.offsetHeight) {
        alert("you're at the bottom of the page");
    }
};

当前接受的答案的问题是window.scrollY在 IE 中不可用。

这是来自mdn 的关于 scrollY的引用

为了跨浏览器兼容性,请使用 window.pageYOffset 而不是 window.scrollY。

和一个工作片段:

mac注意事项

根据@Raphaël 的评论,由于小偏移,mac 中存在问题。
以下更新条件有效:

(window.innerHeight + window.pageYOffset) >= document.body.offsetHeight - 2

我没有机会进一步测试它,如果有人可以对这个特定问题发表评论,那就太好了。

听起来很奇怪,只有在我的浏览器中,我才缺少 1 像素,因此不会触发条件。不知道为什么,必须添加额外的几个像素才能使其工作。
2021-03-11 16:59:31
在 Mac 计算机上,由于偏移量很小(~1px),因此不满足以下条件,我们像这样更新了条件 (window.innerHeight + window.pageYOffset) >= document.body.offsetHeight - 2
2021-03-19 16:59:31
不适用于 body 的样式将高度设置为 100% 的情况
2021-03-21 16:59:31
谢谢@Dekel!实际上,我们发现 window.pageYOffset 在 mac 上是一个浮点数。我们的最终解决方案是(window.innerHeight + Math.ceil(window.pageYOffset + 1)) >= document.body.offsetHeight.
2021-03-31 16:59:31
@Raphaël 的评论拯救了我的睡眠!在 mac 中存在 1 px 问题,他的评论真的帮助我解决了它!!谢谢你的人!!上帝祝福你!
2021-04-04 16:59:31

接受的答案对我不起作用。这做到了:

window.onscroll = function(ev) {
    if ((window.innerHeight + window.scrollY) >= document.body.scrollHeight) {
      // you're at the bottom of the page
      console.log("Bottom of page");
    }
};

如果您希望支持旧浏览器 (IE9),请使用window.pageYOffset支持稍好一点的别名

即使您将 body 设置为 100% 的最小高度,这也有效。
2021-03-16 16:59:31
在 IE10/11 中不起作用。检查 Dekel 的答案 ( stackoverflow.com/questions/9439725/... ) 以获取 IE 支持。为我工作
2021-03-23 16:59:31
每次滚动时,其他答案都会触发 console.log() ,而不仅仅是在我处于页面底部时。这个答案在 Chrome 上对我有用。
2021-03-23 16:59:31
如果您摆脱了在 ie 或 edge 中不起作用的 window.scrollY,这是一个不错的答案。替换为:(window.innerHeight + window.pageYOffset) >= document.body.scrollHeight
2021-03-31 16:59:31

我正在寻找答案,但还没有找到确切的答案。这是一个纯 javascript 解决方案,在此回答时适用于最新的 Firefox、IE 和 Chrome:

// document.body.scrollTop alone should do the job but that actually works only in case of Chrome.
// With IE and Firefox it also works sometimes (seemingly with very simple pages where you have
// only a <pre> or something like that) but I don't know when. This hack seems to work always.
var scrollTop = (document.documentElement && document.documentElement.scrollTop) || document.body.scrollTop;

// Grodriguez's fix for scrollHeight:
// accounting for cases where html/body are set to height:100%
var scrollHeight = (document.documentElement && document.documentElement.scrollHeight) || document.body.scrollHeight;

// >= is needed because if the horizontal scrollbar is visible then window.innerHeight includes
// it and in that case the left side of the equation is somewhat greater.
var scrolledToBottom = (scrollTop + window.innerHeight) >= scrollHeight;

// As a bonus: how to scroll to the bottom programmatically by keeping the horizontal scrollpos:
// Since window.innerHeight includes the height of the horizontal scrollbar when it is visible
// the correct vertical scrollTop would be
// scrollHeight-window.innerHeight+sizeof(horizontal_scrollbar)
// Since we don't know the visibility/size of the horizontal scrollbar
// we scroll to scrollHeight that exceeds the value of the
// desired scrollTop but it seems to scroll to the bottom with all browsers
// without problems even when the horizontal scrollbar is visible.
var scrollLeft = (document.documentElement && document.documentElement.scrollLeft) || document.body.scrollLeft;
window.scrollTo(scrollLeft, scrollHeight);
这几乎对我有用,但我不得不使用((document.documentElement && document.documentElement.scrollHeight) || document.body.scrollHeight)而不是仅仅document.body.scrollHeight考虑将 html/body 设置为 height:100% 的情况
2021-03-11 16:59:31
您的第一条评论使我免于在 Firefox 控制台上使用document.body.scrollTop. 谢谢。
2021-03-26 16:59:31
@Grodriguez 感谢您提供信息!将来可能对我们有用!:-)
2021-04-08 16:59:31

这有效

window.onscroll = function() {

    // @var int totalPageHeight
    var totalPageHeight = document.body.scrollHeight; 

    // @var int scrollPoint
    var scrollPoint = window.scrollY + window.innerHeight;

    // check if we hit the bottom of the page
    if(scrollPoint >= totalPageHeight)
    {
        console.log("at the bottom");
    }
}

如果您希望支持旧浏览器 (IE9),请将window.scrollY替换window.pageYOffset

这项工作与 2019 年的 react 一起使用。使用 body 100% 的高度,值得使用 html 100% 的高度。使用 chrome、safari、firefox、edge。
2021-03-28 16:59:31
请注意:应该更改命名 - 应该切换变量。因为scrollHeight显示的是页面总高度,totalHeight显示的是当前滚动点,所以有点混乱。
2021-04-08 16:59:31