使用CSS不平等地居中DIV


23

我正在使用flexbox将DIV居中放置在另一个DIV中。想一想需要时会在屏幕中央弹出的对话窗口。

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

因此,例如,如果浏览器高度为1000像素,对话框窗口高度为400像素,我希望剩余的垂直空间(600像素)为对话框上方240像素和对话框下方360像素。我可以用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>


您是否需要外部面板覆盖整个视口?如果没有,我将使用css-tricks.com/centering-css-complete-guide中的解决方案,“水平和垂直方向上的元素/宽度和高度未知吗?”部分,并修改转换百分比值。(即使您确实需要父级完整的视口大小[背景?],您也应该能够将两者结合在一起-取消flex的东西,休息吧。)
04FS

是的,我在外部面板上具有调光效果,因此它需要覆盖整个视口。但是我可以在其中添加另一个DIV,您的解决方案将可以正常工作。谢谢04FS!
比约恩·莫伦(BjörnMorén)

为了准确起见,您在谈论的是垂直对齐,而不是居中。
Michael Benjamin

Answers:


11

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

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

另一个想法是使用等于40%和校正翻译的最高值(与对中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>


非常感谢Temani!除了对话框比浏览器高的特殊情况外,这两种解决方案都能完美地工作,并且看起来完全相同。第一种解决方案使对话框的顶部与浏览器的顶部对齐,并在底部进行裁剪。第二种作物既底部又顶部。只是一个偏好问题。
比约恩·莫伦(BjörnMorén)

5

此解决方案使用display: grid,它是一项新功能,因此请务必检查浏览器支持单击此处以了解更多信息。

这是控制顶部和底部空间的行:

grid-template-rows: 40fr [content-start] auto [content-end] 60fr;

您可以编辑代码段文本内容,以检查即使高度发生变化,该框也保持居中。

#dialogBoxPanel {
    display: grid;
    place-content: center;
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    grid-template-rows: 40fr [content-start] auto [content-end] 60fr;
}
#dialogBox {
    border: 1px solid;
    width: 350px;
    grid-area: content;
}
<div id="dialogBoxPanel">
   <div id="dialogBox" contenteditable>Text</div>
</div>


1
我会考虑使用4fr auto 6fr。您所拥有的有效,但是由于40%+ 60%+ 1fr会产生一些溢出,因此始终会大于100%,并且您居中,因此超低部分将从顶部和底部平均分配:jsfiddle.net/cobutn0e/2。您还会注意到,这并非100%
符合

我只是将1fr更改为auto,我宁愿将其保留为%以匹配问题值。非常感谢您指出错误!
rafaelcastrocouto

auto和1fr在您的情况下会得到相同的结果,问题是使用百分比;1fr=minmax(auto,1fr)并且在您的情况下,auto由于40%+ 60%= 100%,这将导致没有可用空间(这就是为什么您总是会溢出)的原因
Temani Afif

1
这里是另一个小提琴说明我的观点:jsfiddle.net/cobutn0e/3 通知如何实现3首是相同的,第三个是下降到0,最后一个是什么,我建议
毯螅阿菲夫

现在,我明白了。将要使用40fr和60fr,因为一天结束时相同。再次感谢您抽出宝贵时间教我!
rafaelcastrocouto

4

您可以添加spacer div并以4:6的比例设置柔韧性。

#dialogBoxPanel {
  position: absolute;
  display: flex;
  flex-direction: column;
  align-items: center;

  left: 0px;
  top: 0px;
  width: 100%;
  height: 100%;
}

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

.spacer-top{
  flex-grow: 4;
}
.spacer-bottom{
  flex-grow: 6;
<div id="dialogBoxPanel">
  <div class="spacer-top"></div>
  <div id="dialogBox">Text</div>
  <div class="spacer-bottom"></div>
</div>


直到现在才看到@Temani Afif的答案,但它对“之后”和“之前”的作用相同
Itay Gal

0

使用位置和边距的简单方法,我假设您的对话框高度始终是浏览器高度的40%。

.modal{
            max-height:50%;
            width:400px;
            margin: 10% auto 5% auto;
            position:absolute;
            top:0;
            bottom:0;
            right:0;
            left:0;
            overflow-y: auto
        }
        .modal-body{
            background-color: beige;
            padding: 20px;
            line-height: 21px
        }

的HTML

<div class="modal">
 <div class="modal-body">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea </div>
</div>

嗨,欢迎您,下次请仔细阅读问题,该问题指出:“对话框的高度随内部文本的数量而变化。”
rafaelcastrocouto19年

1
@rafaelcastrocouto-现在通过最大高度(以百分比为单位)控制它,因为不带高度将无法解决顶部和底部空间美学的问题。
Anshul Chaurasia
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.