本文介绍在启用 `scroll-behavior: smooth` 时,如何避免锚点链接跳转触发的滚动干扰原生滚动监听逻辑,核心方案是用 `wheel` 事件替代 `scroll` 事件,并说明其原理与适用边界。
在现代 Web 开发中,为提升用户体验,常通过 CSS 设置 html { scroll-behavior: smooth; } 实现锚点链接的平滑滚动。但该行为会触发 scroll 事件,导致原本仅用于监听用户主动滚动(如鼠标滚轮、触摸拖拽、键盘方向键)的监听器被误触发,难以区分“真实滚动”与“导航跳转引发的滚动”。
直接监听 scroll 事件无法区分触发源——无论是用户滚动、window.scrollTo() 调用,还是 点击,只要页面滚动位置变化,scroll 事件就会触发。因此,不建议依赖 scroll 事件来判断“用户是否正在主动滚动”。
✅ 推荐解法:改用 wheel 事件
wheel 事件仅在用户物理滚动输入设备(如鼠标滚轮、触控板惯性滚动、带滚轮的触控笔)时触发,完全不会由 锚点跳转、scrollIntoView() 或 scrollTo() 等 JS API 触发。这使其成为检测“真实用户滚动意图”的理想选择。
以下是优化后的完整实现: