当高度未知时,使用flexbox垂直居中时出现问题

时间:2014-07-02 18:07:50

标签: css css3 flexbox height overflow

我的布局有一个容器flex-container和一个孩子。

HTML:

<div class="flex-container">
  <div>text</div>
</div>

容器和孩子的身高未知。目标是:

  • 如果孩子的高度低于容器,则它显示为水平和垂直居中。
  • 如果孩子的高度高于容器,它会调整到顶部和底部,我们可以滚动。

方案: enter image description here

使用flexbox对元素进行居中的最快方法如下:

&#13;
&#13;
.flex-container
{
  display: flex;
  align-items: center; /* vertical */
  justify-content: center; /* horizontal */

  width: 100%;
  height: 300px; /* for example purposes */
  overflow-y: scroll;
  background: #2a4;
}

.flex-container > div
{
  background: #E77E23;
  width: 400px;
}
&#13;
<div class="flex-container">
  <div>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iure fugit voluptas eius nemo similique aperiam quis ut! Ipsa aspernatur rem nesciunt est sed hic culpa nisi delectus error explicabo reprehenderit. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iure fugit voluptas eius nemo similique aperiam quis ut! Ipsa aspernatur rem nesciunt est sed hic culpa nisi delectus error explicabo reprehenderit. </div>
</div>
&#13;
&#13;
&#13;

Codepen:http://www.codepen.io/ces/pen/slicw

但是,如果容器的孩子身高较高,则孩子的身高不正确。孩子看起来很受割伤(只有顶部)。

&#13;
&#13;
html,body
{
  height: 100%;
  width: 100%;
  padding: 0;
  margin: 0;
}

.flex-container
{
  display: flex;
  align-items: center; // vertical
  justify-content: center; // horizontal
  
  width: 100%;
  height: 100px;
  overflow-y: scroll;
  background: #2a4;
}

.flex-container > div
{
  background: #E77E23;
  width: 400px;
}
&#13;
<div class="flex-container">
  <div>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iure fugit voluptas eius nemo similique aperiam quis ut! Ipsa aspernatur rem nesciunt est sed hic culpa nisi delectus error explicabo reprehenderit. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iure fugit voluptas eius nemo similique aperiam quis ut! Ipsa aspernatur rem nesciunt est sed hic culpa nisi delectus error explicabo reprehenderit. </div>
</div>
&#13;
&#13;
&#13;

Codepen:http://www.codepen.io/ces/pen/sGtfK

方案:

enter image description here

有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:136)

我找到了解决方案:

.flex-container
{
  display: flex; /* only */
  overflow-y: scroll;
}

.flex-container > div
{
  margin: auto; /* horizontal and vertical align */
}

html,body
{
  height: 100%;
  width: 100%;
  padding: 0;
  margin: 0;
}

.flex-container
{
  display: flex;
  width: 100%;
  height: 100px; /* change height to 300px */
  overflow-y: scroll;
  background: #2a4;
}

.flex-container > div
{
  padding: 1em 1.5em;
  margin: auto;
  background: #E77E23;
  width: 400px;
}
<div class="flex-container">
  <div>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iure fugit voluptas eius nemo similique aperiam quis ut! Ipsa aspernatur rem nesciunt est sed hic culpa nisi delectus error explicabo reprehenderit. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iure fugit voluptas eius nemo similique aperiam quis ut! Ipsa aspernatur rem nesciunt est sed hic culpa nisi delectus error explicabo reprehenderit. </div>
</div>

Codepen:http://codepen.io/ces/pen/Idklh

答案 1 :(得分:-1)

align-self:flex-start;添加到.flex-container > div也可以解决此问题。

请参阅:http://www.w3.org/TR/css-flexbox-1/#auto-margins