垂直居中并左对齐一列弹性项目

时间:2015-10-27 15:17:13

标签: html css css3 flexbox

要求

  1. Flexbox的
  2. 垂直中间
  3. 横向左侧
  4. 垂直堆叠的子元素
  5. 子元素的数量可以是一个或多个
  6. 使用旧语法,以便Android 4.2了解
  7. 听起来很难描述。演示中的粉红色框是我想要的外观。绿色框已经很好了,只是我不知道如何处理多个子元素。

    我认为解决方案可能是以下的组合,但我无法做到。

    align-items: center;
    flex-direction: column;
    

    body {
      margin: 1em .5em;
    }
    article {
      display: flex;
      align-items: center;
      flex-wrap: wrap;
    }
    
    section {
      height: 18em;
      background: #ccc;
      margin: 0 .5em;
      position: relative;
      display: flex;
      align-items: center;
    }
    section:after {
      font-size: smaller;
      color: blue;
      position: absolute;
      bottom: 0;
    }
    section.big {
      width: 20%;
      height: 5em;
    }
    section.small {
      width: 10%;
      flex: 1;
    }
    section div {
      outline: 1px dotted green;
    }
    section.want {
      background-color: pink;
    }
    section.want:after {
      content: "1) want to do like this: vertically middle, horizontally left, while section will contain one or several child elements";
    }
    section.only1 {
      background-color: lightgreen;
    }
    section.only1:after {
      content: "2) all good except one point:the number of child element must be one.";
    }
    section.row:after {
      content: "3) by default flex-diraction is row";
    }
    section.col {
      flex-direction: column;
    }
    section.col:after {
      content: "4) this can vertically stack multiple stacks, but they no longer horizontally left-align";
    }
    section.col.justify {
      justify-content: center;
      align-items: flex-start;
      background-color: lightblue;
    }
    section.col.justify:after {
      content: "6) this is good!  Solved.";
    }
    section.colmar {
      flex-direction: column;
    }
    section.colmar:after {
      content: "5) this can vertically stack multiple stacks, and left-align divs, but divs are not vertically center";
    }
    section.colmar div {
      margin-right: auto;
    }
    <article>
      <section class="small want">
        line1
        <br/>line2
      </section>
      <section class="small only1">
        <div>only 1 div</div>
      </section>
      <section class="small row">
        <div>div1</div>
        <div>div2</div>
      </section>
      <section class="small col">
        <div>div1</div>
        <div>div2</div>
      </section>
      <section class="small colmar">
        <div>div1</div>
        <div>div2</div>
      </section>
      <section class="small col justify">
        <div>div1</div>
        <div>div2</div>
      </section>
    </article>

    codepen demo

3 个答案:

答案 0 :(得分:48)

justify-content沿着主轴对齐弹性项目。

align-items沿着横轴对齐柔性项目,横轴始终垂直于主轴。

根据flex-direction,主轴可以是水平轴或垂直轴。

由于flex-direction:column表示主轴是垂直的,因此您需要使用justify-content而非align-items来固定灵活项目。

以下是一个例子:

&#13;
&#13;
#container {
  display: flex;
  flex-direction: column;
  justify-content: center;
  height: 200px;
  background-color: lightpink;
}
&#13;
<div id="container">
  <div class="box">div 1</div>
  <div class="box">div 2</div>
  <div class="box">div 3</div>
  <div class="box">div 4</div>
  <div class="box">div 5</div>
</div>
&#13;
&#13;
&#13;

在此处了解有关主轴的柔性对齐的更多信息:

在此处了解有关十字轴的柔性对齐的更多信息:

答案 1 :(得分:0)

我认为,如果您将列div垂直放置在包装div的中心(我们称其为行div),则使用以下方法:

align-self: center;

并将div列的内容放在中间:

text-align: center;

它将按照您想要的方式工作。

答案 2 :(得分:0)

设置高度为我解决了问题。