监听滚动到底部需判断滚动位置是否接近容器滚动极限,页面用window.scrollY+innerHeight≥scrollHeight,局部容器用scrollTop+clientHeight≥scrollHeight,推荐节流或Intersection Observer API实现。

监听滚动条到底部的核心是判断当前滚动位置是否接近或等于容器的滚动高度极限,常用在无限加载、懒加载等场景。
监听 window 滚动到底部
适用于整个页面滚动。关键逻辑是:当 window.scrollY(或 document.documentElement.scrollTop)加上视口高度 window.innerHeight 接近或等于文档总高度 document.documentElement.scrollHeight 时,视为触底。
- 使用
scroll事件监听,但要注意节流,避免频繁触发 - 推荐用
requestAnimationFrame或简单时间戳节流(如 100ms 内最多执行一次) - 判断条件建议留一点余量(如 50px),避免因四舍五入或边框计算误差导致漏判
监听某个容器(如 div)滚动到底部
当目标是局部滚动区域(例如聊天窗口、列表容器),需监听该元素的 scroll 事件,并读取其 scrollTop、scrollHeight 和 clientHeight:
-
element.scrollTop + element.clientHeight >= element.scrollHeight是核心判断式 - 注意:若容器设置了
padding或border,clientHeight已包含内边距,一般无需额外调整 - 首次进入或动态加载内容后,可能需要手动触发一次检查,确保初始状态不遗漏
更可靠的方式:Intersection Observer API
相比 scroll 事件,Intersection Observer 更性能友好,适合监听“底部占位元素”是否进入视口:
立即学习“Java免费学习笔记(深入)”;
- 在容器底部插入一个空的
<div id="bottom-trigger"></div> - 用
IntersectionObserver观察该元素,回调中判断isIntersecting === true - 优势是不依赖滚动事件、无节流烦恼、支持 passive 优化,且天然兼容懒加载场景
- 注意:需确保触发元素真实存在于 DOM 中,且未被
display: none或visibility: hidden隐藏
常见坑点与建议
实际开发中容易忽略的细节:
- 移动端 Safari 对
scroll事件触发时机较特殊,建议统一用document.scrollingElement || document.documentElement获取滚动根节点 - 某些 UI 框架(如 Vue/React)中,DOM 可能尚未渲染完成,监听前先用
nextTick或useEffect确保元素存在 - 多次绑定未清理会导致重复执行,记得在组件卸载或销毁时调用
removeEventListener或observer.disconnect() - 触底后若加载新数据,要加 loading 锁(如
isLoading标志),防止快速滚动反复触发


















