不够。单纯设 overflow: hidden 只隐藏滚动条并裁剪内容,但无法阻止鼠标滚轮或触摸板触发的底层滚动;真正禁用需监听目标元素的 wheel 和 touchmove 事件并调用 preventDefault(),且必须显式设置 { passive: false }。

给特定 <div> 设置 <code>overflow: hidden 就够了吗
不够。单纯设 overflow: hidden 只会隐藏滚动条、裁剪溢出内容,但用户仍可通过鼠标滚轮或触摸板触发底层滚动(尤其当内部有可滚动子元素时)。真正要「禁止滚动」,必须阻断 wheel 和 touchmove 事件的默认行为。
如何精准拦截局部区域的滚动事件
关键不是改 CSS,而是监听目标区域的原生事件并调用 preventDefault()。注意:必须显式设置 { passive: false },否则现代浏览器会忽略 preventDefault() 调用。
- 对 PC 端:监听
wheel事件,e.preventDefault()后滚动即失效 - 对移动端:监听
touchmove事件,同样需e.preventDefault() - 若目标区域本身含可滚动子容器(如
<div style="overflow-y: auto">),需额外判断是否已滚动到底/顶,再决定是否拦截——否则会卡住内部滚动 <li>避免绑定到 <code>document全局,直接绑定到具体 DOM 元素更安全,例如:document.getElementById('my-section').addEventListener('wheel', e => e.preventDefault(), { passive: false })
pointer-events: none 能不能拿来禁滚动
不能。这个 CSS 属性会让所有鼠标/触摸事件完全穿透该元素,包括 wheel 和 touchmove —— 它不「禁止」滚动,而是让滚动事件落到它下面的元素上,结果往往是底层页面反而开始滚动,和预期相反。
真正需要的是「拦截」,不是「透传」。所以别用 pointer-events: none 来解决滚动禁用问题。
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
立即学习“前端免费学习笔记(深入)”;
为什么加了 preventDefault() 还是能滚
大概率是没关掉 passive 默认行为。Chrome/Firefox/Edge 自 2017 年起对滚动类事件默认启用 passive: true,此时 preventDefault() 会被静默忽略。
必须显式传入 { passive: false } 选项:
element.addEventListener('wheel', e => {
e.preventDefault();
}, { passive: false });
另外检查是否重复绑定、是否被其他脚本覆盖、是否在 Shadow DOM 内未正确获取宿主元素——这些都可能导致拦截失效。
局部禁滚动最易被忽略的点:移动端的touchmove 必须单独处理,且不能只靠 CSS;PC 端的 wheel 事件若漏掉 { passive: false },代码就形同虚设。


















