当使用"打开"按钮打开我的对话框时,您可以看到内容并没有缩小.

然而,当用"Open modal"按钮打开它时,内容正在收缩.我如何才能防止这种情况发生?我不想要一个解决方案,我需要添加white-space: nowrap;或其他属性到对话框内的每一个单独的东西,我正在寻找一个通用的解决方案,将使模式对话框的行为像非模式的一个.

PS:我正在做我做的事情,因为我正在为对话元素做一个后备.因此,我不能只使用对话框元素,理想情况下,我不想添加额外的标记.

const dialog = document.getElementById("dialog");

document.getElementById("open").addEventListener("click", () => {
    dialog.classList.add("open");
});

document.getElementById("openModal").addEventListener("click", () => {
    dialog.classList.add("open", "modal");
});

document.getElementById("close").addEventListener("click", () => {
    dialog.classList.remove("open", "modal");
});
.dialog {
    display: none;
    position: fixed;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    background: salmon;
    padding: 1rem;
}
.dialog.modal {
    border-width: max(100vh, 100vw);
    border-style: solid;
    border-color: rgba(0, 0, 0, 0.3);
    background-clip: padding-box;
    backdrop-filter: blur(2px);
}
.dialog.open {
    display: block;
}
<div class="dialog" id="dialog">
  <p>This is my dialog box</p>
  <button id="close">Close</button>
</div>

<button id="open">Open</button>

<button id="openModal">Open Modal</button>

推荐答案

那么,以这种方式使用边框从一开始就不是"正常"的.简单地使用伪元素来创建掩码要常见得多,问题也少得多.

由于文本可以自由换行,并且您已经为边框设置了可变大小,因此边框填充了未分配的空间(允许文本中最长单词的最大空间).

我建议您采取更传统的方法,改用掩码元素.请注意,我已经将z-index应用于对话框以使其保持在遮罩之上.

const dialog = document.getElementById("dialog");

document.getElementById("open").addEventListener("click", () => {
  dialog.classList.add("open");
});

document.getElementById("openModal").addEventListener("click", () => {
  dialog.classList.add("open", "modal");
  document.body.classList.add('modal-open');
});

document.getElementById("close").addEventListener("click", () => {
  dialog.classList.remove("open", "modal");
  document.body.classList.remove('modal-open');
});
.dialog {
  display: none;
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  background: salmon;
  padding: 1rem;
  z-index: 1;
}

body.modal-open::after {
  content: '';
  position: fixed;
  top: 0;
  left: 0;
  width: 100vw;
  height: 100vh;
  background-color: rgba(0, 0, 0, 0.3);
  backdrop-filter: blur(2px);
}

.dialog.open {
  display: block;
}
<div class="dialog" id="dialog">
  <p>This is my dialog box</p>
  <button id="close">Close</button>
</div>

<button id="open">Open</button>

<button id="openModal">Open Modal</button>

Css相关问答推荐

为什么盒影没有显示在我的Angular组件中?

在Angular mat-drawer组件中防止在mat-drawer-innercontainer中添加滚动条

Safari CSS扫描动画效果不起作用

如何使用 Cypress 从 React 下拉列表中进行 Select

使用文本溢出约束内部 div:没有最大宽度的省略号(或类似的)

我想在视频上使用混合混合模式的 svg

如果中间元素的内容不适合 CSS,如何将其分隔到新行?

如何为以下布局安排网格?

CSS 媒体查询不为桌面版的圣杯响应式布局包装 Flexbox 容器元素

CSS:如何在嵌套计数器中有多个计数器

Angular 导航栏问题

JavaFX TreeTableView Css for unfocused selected line

创建一条淡出/在各个方向变得透明的线

紫色表示访问过的超链接

在 中制作等宽的列

填充剩余的垂直空间 - 仅 CSS

跨域 iframe 调整大小

为什么浏览器会为 CSS 属性创建供应商前缀?

我如何*真正*证明 HTML+CSS 中的水平菜单?

CSS3单向过渡?