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

如何在弹出Modal时禁止页面body垂直滚动?

解决Modal弹出时背景页面可滚动的问题

核心方案

你已经写了.modal-open {overflow-y: hidden;}这个CSS类,关键就是在Modal打开时把这个类加到body上,关闭时移除就行,具体实现如下:

1. 补全CSS样式(可选优化)

除了隐藏滚动,还可以加个滚动条宽度补偿,避免页面因为滚动条消失突然晃动:

.modal-open {
  overflow-y: hidden;
  /* 用CSS变量存滚动条宽度,防止页面跳动 */
  padding-right: var(--scrollbar-width, 0px);
}

2. 修改JavaScript逻辑

找到你现有代码里打开Modal和关闭Modal的逻辑,分别添加类的操作:

打开Modal时的处理

假设你是通过点击卡片触发Modal打开,比如这样修改:

// 示例:点击卡片打开对应Modal
document.querySelectorAll('.card').forEach(card => {
  card.addEventListener('click', function() {
    const modalId = this.dataset.modalId; // 假设卡片上用data-modal-id存对应Modal的ID
    const modal = document.getElementById(modalId);
    modal.style.display = 'block';

    // 给body加禁止滚动的类
    document.body.classList.add('modal-open');
    // 计算滚动条宽度并设置CSS变量
    const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;
    document.body.style.setProperty('--scrollbar-width', `${scrollbarWidth}px`);
  });
});

关闭Modal时的处理

不管是点击关闭按钮还是遮罩层关闭,都要移除类:

// 示例:点击关闭按钮关闭Modal
document.querySelectorAll('.modal-close').forEach(btn => {
  btn.addEventListener('click', function() {
    const modal = this.closest('.modal');
    modal.style.display = 'none';

    // 移除body上的类,恢复滚动
    document.body.classList.remove('modal-open');
    document.body.style.removeProperty('--scrollbar-width');
  });
});

// 如果有遮罩层点击关闭的逻辑,也要加同样的移除操作
document.querySelectorAll('.modal-overlay').forEach(overlay => {
  overlay.addEventListener('click', function() {
    const modal = this.closest('.modal');
    modal.style.display = 'none';
    document.body.classList.remove('modal-open');
    document.body.style.removeProperty('--scrollbar-width');
  });
});

移动端额外处理(可选)

如果在移动端发现背景还是能滚动,就加个触摸事件拦截:

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

// 打开Modal时绑定事件
document.body.classList.add('modal-open');
document.body.addEventListener('touchmove', blockBackgroundScroll, { passive: false });

// 关闭Modal时解绑事件
document.body.classList.remove('modal-open');
document.body.removeEventListener('touchmove', blockBackgroundScroll);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 10:47:50