解决移动端touchmove与scroll冲突:passive选项详解
在移动端实现元素拖动时,touchmove常触发body滚动导致位置偏移。本文介绍通过addEventListener的passive选项解决此冲突,指出浏览器默认passive为true导致preventDefault失效,并给出显式设置passive: false的关键代码。
正文
在移动端开发中,若需实现元素的拖动定位功能,常会遇到诸多兼容性问题。例如,在元素上下移动时,可能会意外触发 body 的 scroll 事件,造成整体布局偏移。为解决这一问题,必须有效处理移动端 touchmove 与 scroll 事件的冲突。

DOM Touchmove Scroll
一、解决思路
- 面对 touchmove 与 scroll 事件的冲突,常规思路是在 touchmove 事件监听器中调用
e.preventDefault()以阻止默认行为。 - 然而,若直接采用上述方法,控制台通常会抛出如下警告:
[Intervention] Unable to preventDefault inside passive event listener due to target being treated as passive. - 查阅 MDN 文档可知,
addEventListener方法的第三个参数options支持多种配置选项。 - 是一个可选对象,用于指定有关
listener的属性。其可用选项包括:
| 参数 | 定义 |
|---|---|
| capture | 一个布尔值,表示 listener 会在该类型的事件捕获阶段传播到该 EventTarget 时触发。 |
| once | 一个布尔值,表示 listener 在添加之后最多只调用一次。如果为 true,listener 会在其被调用之后自动移除。 |
| passive | 一个布尔值,设置为 true 时,表示 listener 永远不会调用 preventDefault()。如果 listener 仍然调用了这个函数,客户端将会忽略它并抛出一个控制台警告。查看 使用 passive 改善滚屏性能以了解更多。 |
| signal | AbortSignal,该 AbortSignal 的 abort() 方法被调用时,监听器会被移除。 |
二、问题所在
将 passive 设置为 true 可启用性能优化,显著提升应用滚动性能。因此,除 Safari 和 Internet Explorer 外,大多数现代浏览器已将 Window、Document 及 Document.body 上 wheel、mousewheel、touchstart 和 touchmove 事件的 passive 默认值设为 true。在此默认设置下,事件监听器无法取消事件,也不会阻止页面滚动。
因此,当你想要覆盖这一行为并确认 passive 在所有浏览器中都被设为 false,你必须显式地将其设为 false,而不是依赖浏览器的默认设置。
- 关键代码:
document.addEventListener('touchmove', touchmove, {
passive: false,
})
function touchmove(e) {
e = e || window.event
// do something
e.preventDefault()
}参考文档:
- https://developer.mozilla.org/zh-CN/docs/Web/API/EventTarget/addEventListener
以上即为解决移动端 touchmove 与 scroll 事件冲突的具体方法,更多相关技术细节可关注本站其他文章。
JS转整数出现NaN怎么办?常见异常处理方案
2026-11-05 16:27:31
推荐几款免安装的在线JS压缩工具
2026-11-05 14:54:53
JS怎么使用JSON.stringify实现JSON格式化与缩进
2026-11-04 10:47:30
CodePen、JSFiddle 与 StackBlitz:主流 JS 在线编辑器对比
2026-11-03 21:07:49
JS字符串转数字后怎么正确判断是否为有效数值
2026-11-03 20:04:15
