滚动分两种:被动听(你滚,我用 scrollTop 知道你滚了多远)和主动控(我用 scrollTo/scrollBy 让它自己滚到指定位置)。注意 scroll 一秒能触发几十上百次,别在里面干重活,否则会卡。
| 属性 | 意思 |
|---|---|
| window.scrollY | 整个页面已经往下滚了多少像素 |
| 元素.scrollTop | 这个盒子内部已经滚了多少 |
| 元素.scrollHeight | 内容总高度(包括看不见的) |
box.addEventListener('scroll', function () { // 这个盒子一被滚动就跑
console.log('已滚:' + box.scrollTop); // scrollTop 读出已往下滚了多少
});
box.scrollTo(0, 0); // 瞬间回顶部
box.scrollTo({ top: 500, behavior: 'smooth' }); // 平滑滚到 500
box.scrollBy(0, 80); // 在当前位置再往下 80
lineLast.scrollIntoView({ behavior: 'smooth', block: 'center' }); // 让某行进视野
如果你在 scroll 回调里发请求、改一大堆 DOM,页面就会卡。因为 scroll 一秒能触发几十上百次;解决办法是"防抖/节流"——让频繁触发合并成一次再跑,这个在性能章节细讲,先有这个意识。
① 用在哪:回到顶部按钮、吸顶导航、消息列表滚到最新。
② 常见坑:scroll 回调里干重活导致卡顿;滚错了对象。
③ 怎么解决:用 scrollTo/scrollIntoView 主动滚;高频事件配合防抖,先确认读的是哪个元素。