You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

菜单打开时如何禁用body滚动?尝试代码未奏效

解决菜单打开时禁用body滚动的问题

你之前的代码失效,是因为overlay并不是DOM元素style对象里的合法属性,浏览器完全不会识别这个设置哦~ 下面给你两种常用且有效的解决方案:

方法一:通过修改body样式禁用滚动(兼容桌面+移动端)

这是最通用的方案,核心是设置body的overflow: hidden,针对iOS的特殊情况可以额外处理:

function openNav() {
  const body = document.body;
  // 基础禁用滚动
  body.style.overflow = 'hidden';
  
  // 可选:处理iOS Safari滚动穿透问题
  // 先记录当前滚动位置
  const scrollTop = window.scrollY;
  body.style.position = 'fixed';
  body.style.top = `-${scrollTop}px`;
  body.style.width = '100%';
  
  // 打开侧边栏
  document.getElementById("mySidenav").style.height = "50%";
}

function closeNav() {
  const body = document.body;
  // 恢复滚动
  body.style.overflow = '';
  
  // 可选:恢复之前的滚动位置和定位
  const scrollTop = parseInt(body.style.top || '0') * -1;
  body.style.position = '';
  body.style.top = '';
  body.style.width = '';
  window.scrollTo(0, scrollTop);
  
  // 关闭侧边栏
  document.getElementById("mySidenav").style.height = "0";
}

说明:

  • overflow: hidden会隐藏body超出视口的内容,直接阻止滚动;
  • iOS Safari有时候会出现滚动穿透(即菜单打开后页面仍能滚动),这时候用position: fixed把body固定在视口,同时记录滚动位置,关闭时恢复,就能彻底解决问题。

方法二:通过事件监听阻止移动端滚动

如果不想修改body样式,仅针对移动端可以用这种方式,通过阻止触摸滚动的默认行为来禁用滚动:

// 定义阻止滚动的函数
function preventScroll(e) {
  e.preventDefault();
}

function openNav() {
  document.getElementById("mySidenav").style.height = "50%";
  // 添加触摸滚动阻止事件,注意passive设为false才能生效
  document.body.addEventListener('touchmove', preventScroll, { passive: false });
}

function closeNav() {
  document.getElementById("mySidenav").style.height = "0";
  // 移除事件监听器,恢复滚动
  document.body.removeEventListener('touchmove', preventScroll);
}

说明:

  • 这种方法只对移动端触摸滚动有效,桌面端鼠标滚轮还是能滚动,所以如果要兼顾全平台,推荐用方法一;
  • { passive: false }是必须的,否则部分现代浏览器会忽略e.preventDefault()。

更优雅的写法:用CSS类控制

把样式逻辑抽离到CSS里,通过添加/移除类来控制,代码更清晰易维护:

/* 定义禁用滚动的类 */
.no-scroll {
  overflow: hidden;
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
}
function openNav() {
  document.body.classList.add('no-scroll');
  document.getElementById("mySidenav").style.height = "50%";
}

function closeNav() {
  document.body.classList.remove('no-scroll');
  // 恢复滚动位置(如果用了fixed定位)
  const scrollTop = parseInt(document.body.style.top || '0') * -1;
  document.body.style.top = '';
  window.scrollTo(0, scrollTop);
  document.getElementById("mySidenav").style.height = "0";
}

内容的提问来源于stack exchange,提问作者Niran Millet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:42:39