JS滚动到底部监听 window.innerHeight 和 document.body.clientHeight 坑

源代码在:https://github.com/BadWaka/waka-ui/blob/master/h5/scrollToBottom.html

关于实现JS监听页面滚动到底部的需求,网上的绝大部分文章都是给出这样一个公式

clientHeight + scrollTop = scrollHeight

其实,这个公式是没问题的,但是它的适用范围是元素自带滚动条的时候,就是需要配合 css 属性 overflow 才顶用

而大部分需要监听滚动到底部的页面,是一个整体,就是文档的内容自动把浏览器撑开,浏览器自动地加上滚动条;这个时候 document.body.clientHeight 这个属性就不顶用了,就需要用到 window.innerHeight 来获取浏览器可视区域的高度。

下面我会用实际的例子来说明:

页面效果如下:


HTML代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>监听滚动到底部</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    <style>
        body, ul {
            margin: 0;
            padding: 0;
        }
    </style>
</head>
<body>
<ul id="scrollUl" class="scrollUl">
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
    <li class="tabItem">123</li>
</ul>
<script>
    window.onload = function () {
        window.addEventListener('scroll', function () {
            // document.body.clientHeight
            console.log('document.body.clientHeight', document.body.clientHeight, document.body.scrollTop, document.body.scrollHeight);
            // window.innerHeight
            console.log('window.innerHeight', window.innerHeight, document.body.scrollTop, document.body.scrollHeight);
        });
    }
</script>
</body>
</html>

打开控制台,滚动到底部,可以看到 document.body.clientHeight 和 document.body.scrollHeight 是相等的,而当滚动到底部的时候
window.innerHeight + document.body.scrollTop 刚好等于 document.body.scrollHeight
667 + 499 === 1166

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Window和document对象的区别 window对象window对象表示浏览器中打开的窗口window对象是...
    FConfidence阅读 6,714评论 0 5
  • // 获取窗口宽度 if (window.innerWidth)winWidth = window.innerWi...
    Undefined_C阅读 13,418评论 0 0
  • 一、JS前言 (1)认识JS 也许你已经了解HTML标记(也称为结构),知道了CSS样式(也称为表示),会使用HT...
    凛0_0阅读 7,741评论 0 8
  • 没有一句遗言,家公就走了,由于脑中风,源于他寄托了二三十年的酒精。留下瘦瘦善良的婆婆孤独的悲伤。还心甘情愿...
    杂草贤阅读 2,241评论 0 3