技术频道导航
HTML/CSS
.NET技术
IIS技术
PHP技术
Js/JQuery
Photoshop
Fireworks
服务器技术
操作系统
网站运营
Python技术
AI技术

赞助商

分类目录

赞助商

最新文章

搜索

防止页面在模态(dialog)窗口对话框打开时滚动

作者:admin    时间:2026-4-28 14:26:53    浏览:

网页开发者长期遇到一个尴尬的问题,那就是当模态窗口打开时页面还能滚动,这会给窗口交互或者内容阅读造成一定的干扰,就好比下图这样。

页面在模态(dialog)窗口对话框打开时滚动

Chrome 144 对 overscroll-behavior 有一个小改动 :现在也支持不可滚动的滚动容器。虽然这一变化看似微不足道,但它解决了开发者长期以来遇到的问题:防止页面在(模态) <dialog> 打开时滚动。

不过模态窗口对话框本身并不是滚动容器,如果是,我们可以直接用 overscroll-behavior: contain 就可以了。

解决方案

现在我想到了一个解决方案,就是采用类似 JavaScript 的方法,当模态窗口对话框处于打开状态时,将<body>设置为固定位置,就得到了下图的样子。

防止页面在模态(dialog)窗口对话框打开时滚动

demodownload

我们看到,当模态窗口对话框打开时,滚动条就立即消失,拖动鼠标时页面不可滚动。这就解决了当模态窗口打开时页面还能滚动的尴尬问题。下面附上源码。

html

<body>
<div>
  <button class="show-dialog-button">Show Dialog</button>
</div>
<main>
  <h1>Top of the page</h1>
  <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Labore, tempore libero. Eum expedita quos quod dolore ut molestias harum est, minima debitis facilis similique placeat non, iste in. Consequatur, aliquam.</p>
  <p>Molestias sed iure iste voluptas laborum voluptate ipsam at totam eaque, vel ab unde temporibus, non ducimus earum quo itaque fugiat cumque neque obcaecati. Temporibus doloribus distinctio quidem dignissimos placeat.</p>
  <p>Aut in modi voluptatem porro, natus quas laborum corporis, unde dignissimos harum deserunt velit impedit quisquam minima id nesciunt ab, assumenda dolorum voluptatibus numquam veniam ea quia! Nihil, mollitia excepturi?</p>
</main>
<dialog id="dialog">
  <div class="dialog-title">
    Hi, I'm a dialog.
  </div>
  <button aria-label="Close Dialog" class="close-dialog-button">
    <svg viewBox="0 0 512 512" width="15">
      <path d="M464 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-83.6 290.5c4.8 4.8 4.8 12.6 0 17.4l-40.5 40.5c-4.8 4.8-12.6 4.8-17.4 0L256 313.3l-66.5 67.1c-4.8 4.8-12.6 4.8-17.4 0l-40.5-40.5c-4.8-4.8-4.8-12.6 0-17.4l67.1-66.5-67.1-66.5c-4.8-4.8-4.8-12.6 0-17.4l40.5-40.5c4.8-4.8 12.6-4.8 17.4 0l66.5 67.1 66.5-67.1c4.8-4.8 12.6-4.8 17.4 0l40.5 40.5c4.8 4.8 4.8 12.6 0 17.4L313.3 256l67.1 66.5z" />
    </svg>
  </button>
</dialog>
</body>

解释<dialog>为模态窗口的标签。

css

html {
  scrollbar-gutter: stable;
}
body {
  &:has(dialog[open]) {
    overflow: hidden;
  }
}
main{
   width:500px;
   height:auto;
}
dialog {
  padding: 2rem;
  text-align: center;
  .close-dialog-button {
    position: absolute;
    top: 0.5rem;
    right: 0.5rem;
    background: none;
    border: 0;
    opacity: 0.5;
    &:hover {
      opacity: 1;
    }
  }
}

解释:关键代码如下,该CSS定义了当模态窗口对话框的开始,隐藏超出容器边界的内容,滚动条因此而消失。

body {
  &:has(dialog[open]) {
    overflow: hidden;
  }
}

Javascript

const showDialogButton = document.querySelector(".show-dialog-button");
const closeDialogButton = document.querySelector(".close-dialog-button");
const dialog = document.querySelector("dialog");

showDialogButton.addEventListener("click", () => {
  dialog.showModal();
});

closeDialogButton.addEventListener("click", () => {
  dialog.close();
});

解释:该Javascript程序主要起到点击按钮打开和关闭模态窗口的作用,它与页面是否滚动无关。

总结

本文介绍了防止页面在模态(dialog)窗口对话框打开时滚动的CSS写法,简单但实用。

使用overflow:hidden注意问题

overflow:hidden‌是 CSS 属性,用于‌隐藏超出容器边界的内容‌,同时可‌触发 BFC 清除浮动‌并‌解决外边距塌陷问题‌。‌

核心功能与应用场景

  • 隐藏溢出内容‌:当元素内容超出设定的宽度和高度时,超出部分会被裁剪隐藏,不占用页面空间。‌‌
  • 清除浮动‌:父元素设置该属性后可包含内部浮动子元素,避免父容器高度塌陷。‌‌
  • 文本溢出省略号‌:配合 white-space:nowraptext-overflow:ellipsis 实现单行文本溢出显示省略号效果。‌‌
  • ‌解决外边距塌陷‌:可防止父子元素间的外边距合并问题。

潜在副作用‌

  • 会裁剪 position:absoluteposition:fixed 超出父边界的子元素,影响下拉菜单、弹出层等组件。‌‌
  • 在移动端可能干扰 touchmove 滚动行为,导致局部区域无法滑动。
  • 可能掩盖真实布局问题,如遮住 tooltip、截断动画位移、吞掉 box-shadow 等。‌‌

‌现代替代方案‌

  • ‌display‌:无裁剪副作用,Chrome 58+/Firefox 57+ 支持。
  • 伪元素清除法‌:使用::after 伪元素配合 clear:both,兼容性好但需额外样式维护。
  • Flex/Grid 布局‌:改用现代布局技术,天然不依赖浮动,清浮动问题直接消失。

‌使用建议‌

  • 适合简单布局、不需要滚动、且父容器本身不依赖溢出内容可见性的场景。
  • 新项目除非要兼容 IE10 以下,否则不建议将 overflow:hidden 作为清除浮动的首选方案。
  • 当父容器本身有明确宽高限制、且确认内部绝不会有溢出需求时才安全使用。‌‌

相关文章

本站声明:本站为非经营性网站,文章内容来源或整理于网络,本站不提供软件下载服务,侵删联系:webkaka#foxmail.com
x