滚动节流核心是防主线程阻塞并保关键判断,须配 passive: true;推荐 leading+trailing 组合;优先用 raf 节流;禁止直接节流 event 对象,应先提取字段再节流。

节流在滚动监听中不是为了“让滚动更流畅”,而是防止计算逻辑拖垮主线程,同时确保关键位置判断不被漏掉——真正的流畅度来自浏览器原生滚动和 passive 事件配置,节流只负责把你的 JS 计算“匀速喂给渲染线程”。
滚动节流必须配 passive: true
这是比节流函数本身更优先的性能开关。现代浏览器对未声明 passive: true 的 scroll 监听器会强制同步执行回调,哪怕你只写了一行 console.log,也会打断滚动帧,造成卡顿。
- 正确写法:
window.addEventListener('scroll', handler, { passive: true }); - 如果回调里需要调用
event.preventDefault()(比如自定义滚动拦截),才设passive: false,但这时节流已无法挽救同步阻塞问题 - 不加
passive选项,等于默认passive: false,高危操作
选对节流策略:leading + trailing 是滚动场景的黄金组合
滚动是连续位移过程,既要响应“刚进入临界区”的瞬间(如吸顶开始),也要捕捉“停在底部”的终态(如触发懒加载)。只开 leading 会漏掉停止时的判断;只开 trailing 会延迟首次响应。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 推荐配置:
{ leading: true, trailing: true } - 避免
leading: false:第一次滚动就等满间隔才执行,用户下拉 10px 就卡住不动 - 避免
trailing: false:滚动到底部松手后不触发,懒加载永远不启动
用 requestAnimationFrame 替代 setTimeout 更稳
基于时间戳或定时器的节流,在高负载或帧率波动时可能出现偏差,比如本该 16ms 执行一次,结果堆积或跳帧。rAF 天然对齐屏幕刷新节奏,无丢帧风险,且无需手动清理。
- 简易 rAF 节流写法:
function throttleRAF(fn) { let isQueued = false; return function(...args) { if (!isQueued) { isQueued = true; requestAnimationFrame(() => { fn(...args); isQueued = false; }); } }; }- 适合轻量逻辑:吸顶状态切换、视口内元素标记、简单懒加载判断
别传 event 对象进节流闭包
滚动事件对象是复用的。节流后某次回调执行时,event 可能已被后续滚动覆盖,拿到的是过期坐标或 null 值。
- 安全做法:在事件监听器里立刻读取所需字段,再传给节流函数
- 错误示例:
el.addEventListener('scroll', throttle(handleScroll, 100))——handleScroll内访问e.target.scrollTop不可靠 - 正确示例:
el.addEventListener('scroll', () => handleScroll(el.scrollTop)),再对handleScroll做节流
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










