html - 使用 CSS 使 div 不均匀居中

标签 html css flexbox centering

我使用 Flexbox 将一个 div 置于另一个 div 的中心。想象一个在需要时在屏幕中央弹出的对话框窗口。

它工作得很好,但是如果对话框上方和下方的空间不完全相等,即 40% 的剩余空间位于对话框上方,60% 位于对话框下方,那么看起来会好得多。这变得很棘手,因为对话框高度随内部文本量的变化而变化。

例如,如果浏览器高度为 1000px,对话框窗口高度为 400px,我希望剩余的垂直空间 (600px) 为对话框上方 240px,下方 360px。

我可以用 JavaScript 来做到这一点,但我很好奇 CSS 是否有一些聪明的方法。我尝试向 #dialogBox div 添加底部边距,但当对话框高度接近浏览器高度时,这不起作用。

#dialogBoxPanel {
  position: absolute;
  display: flex;
  align-items: center;
  justify-content: center;
  left: 0px;
  top: 0px;
  width: 100%;
  height: 100%;
}

#dialogBox {
  width: 350px;
}
<div id="dialogBoxPanel">
  <div id="dialogBox">Text</div>
</div>

最佳答案

使用伪元素和列方向来模拟空白。只需调整伪元素的 flex-grow 即可控制每个元素应占用多少可用空间。相等的 flex-grow 将提供相等的空间:

#dialogBoxPanel {
  position: absolute;
  display: flex;
  flex-direction: column;
  align-items: center;
  left: 0px;
  top: 0px;
  width: 100%;
  height: 100%;
  /* the center */
  background:linear-gradient(red,red) center/100% 1px no-repeat;
}

#dialogBox {
  width: 350px;
  border:1px solid;
}

#dialogBoxPanel:before {
  content:"";
  flex-grow:4;
}
#dialogBoxPanel:after {
  content:"";
  flex-grow:6;
}
<div id="dialogBoxPanel">
  <div id="dialogBox">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc hendrerit diam eu nisl fringilla ornare. Pellentesque aliquam quam et tellus egestas sodales. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin bibendum,</div>
</div>

您还可以使用23。我们只需保持相同的比例即可:

#dialogBoxPanel {
  position: absolute;
  display: flex;
  flex-direction: column;
  align-items: center;
  left: 0px;
  top: 0px;
  width: 100%;
  height: 100%;
  /* the center */
  background:linear-gradient(red,red) center/100% 1px no-repeat;
}

#dialogBox {
  width: 350px;
  border:1px solid;
}

#dialogBoxPanel:before {
  content:"";
  flex-grow:2;
}
#dialogBoxPanel:after {
  content:"";
  flex-grow:3;
}
<div id="dialogBoxPanel">
  <div id="dialogBox">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc hendrerit diam eu nisl fringilla ornare. Pellentesque aliquam quam et tellus egestas sodales. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin bibendum,</div>
</div>

另一个想法是使用等于 40% 的 top 值并通过翻译纠正位置(与居中时 50% 的逻辑相同)

#dialogBoxPanel {
  position: absolute;;
  left: 0px;
  top: 0px;
  width: 100%;
  height: 100%;
  /* the center */
  background:linear-gradient(red,red) center/100% 1px no-repeat;
}

#dialogBox {
  position:relative;
  top:40%;
  width: 350px;
  transform:translateY(-40%);
  margin:auto;
  border:1px solid;
}
<div id="dialogBoxPanel">
  <div id="dialogBox">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc hendrerit diam eu nisl fringilla ornare. Pellentesque aliquam quam et tellus egestas sodales. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin bibendum,</div>
</div>

关于html - 使用 CSS 使 div 不均匀居中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59017011/

相关文章:

css - 无法将 Highcharts 发送到页面背面(z-index)

html - 根据屏幕分辨率更改 Material Design 响应按钮的内容

html - CSS 内联 block 场景 - 全部折叠或全部折叠

html - 两个 div 填满可用空间

html - 当链接显示为 flex 时,链接的子元素不会覆盖文本装饰

javascript - float 在 iframe html 上

html - CSS!水平可调整大小的菜单 ul li,如何在显示器的整个宽度上展开?

css - 将 CSS 应用于封闭的 div,但不应用于封闭的 div

html - 如何在带有或不带有 Bootstrap 的 HTML 中显示字符 ":"前后对齐的单词?

可在 Firefox 中使用的 HTML 电子邮件签名(图片相关)