禁止用户滚动需监听 touchmove 事件并调用 preventDefault(),且监听器必须设置 { passive: false };推荐结合 overflow: hidden、overscroll-behavior 和滚动位置保存以兼顾兼容性与体验。

在移动端页面中,禁止用户滚动通常是为了实现全屏弹窗、引导页、加载遮罩等场景。关键在于阻止默认的 touchmove 行为,同时兼顾兼容性和体验细节。
核心:阻止 touchmove 默认行为
移动端滚动本质由 touchmove 事件触发,默认行为是滚动视口。只需监听该事件并调用 preventDefault() 即可拦截:
- 必须在事件监听器中显式调用
e.preventDefault() - 监听目标建议设为
document或body,确保覆盖所有区域 - 注意:仅对
passive: false的监听器才允许调用preventDefault()
推荐写法:带 passive 控制的监听
现代浏览器默认将 touch 事件设为 passive(无法阻止),因此需显式声明 { passive: false }:
function disableScroll() {
const preventMove = (e) => e.preventDefault();
document.addEventListener('touchmove', preventMove, { passive: false });
return () => {
document.removeEventListener('touchmove', preventMove);
};
}
// 启用
const cleanup = disableScroll();
// 恢复滚动(记得调用)
cleanup();
补充:避免影响其他交互
直接禁用全局 touchmove 可能误伤内部可滚动区域(如弹窗里的长列表)。更稳妥的做法是:
- 给禁止滚动的容器添加
style="overflow: hidden",同时设置height: 100vh - 只对特定元素(如遮罩层)绑定
touchmove阻止,而非整个 document - 若需保留内部滚动,用 CSS
overscroll-behavior: contain防止滚动穿透
兼容性与边界处理
部分 Android WebView 或旧版 iOS 可能响应不一致,建议补充:
- 同时禁用
scroll事件(虽非必须,但增强保险性) - 设置
body { position: fixed; top: 0; width: 100%; }防止因滚动条消失导致内容偏移 - 禁用前记录
window.scrollY,恢复时用window.scrollTo(0, savedY)回到原位置
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











