使用CSS不平等地居中DIV

Bjö*_*rén 18 html css centering flexbox

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

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

因此,例如,如果浏览器高度为1000 px,对话框窗口高度为400 px,我希望剩余的垂直空间(600 px)在对话框上方240 px,在对话框下方360 px。我可以用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;
}
Run Code Online (Sandbox Code Playgroud)
<div id="dialogBoxPanel">
  <div id="dialogBox">Text</div>
</div>
Run Code Online (Sandbox Code Playgroud)

Tem*_*fif 9

使用伪元素和列方向模拟空白。只需调整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;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

您也可以使用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;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

另一个想法是使用等于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;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)


raf*_*uto 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;
}
Run Code Online (Sandbox Code Playgroud)
<div id="dialogBoxPanel">
   <div id="dialogBox" contenteditable>Text</div>
</div>
Run Code Online (Sandbox Code Playgroud)


Ita*_*Gal 5

您可以添加间隔 div 并将 flex-grow 设置为 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;
Run Code Online (Sandbox Code Playgroud)
<div id="dialogBoxPanel">
  <div class="spacer-top"></div>
  <div id="dialogBox">Text</div>
  <div class="spacer-bottom"></div>
</div>
Run Code Online (Sandbox Code Playgroud)