Flexbox垂直对齐包装中的特定内容?

时间:2016-11-08 03:18:21

标签: html css css3 flexbox vertical-alignment

我的CMS设置相当严格,包含2个包含标题和内容的列,如下所示:

.wrapper {
    overflow: auto;
    border: 1px solid #ccc;
    text-align: center;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
    -ms-flex-align: center;
    -webkit-align-items: center;
    -webkit-box-align: center;
    align-items: center;
}
.left,
.right {
    float: left;
    width: 45%;
    padding: 5px;
}
<div class="wrapper">
    <div class="left">
        <h3>Title (should be aligned to top)</h3>
        <div class="content">
            left<br>
            left<br>
            left<br>
            left<br>
        </div>
    </div>
    <div class="right">
        <h3>Title (should be aligned to top)</h3>
        <div class="content">
            right
        </div>
    </div>
</div>

jsFiddle

我想让每列的.content垂直对齐中间,但让标题h3垂直对齐到顶部。

通常我会使用flexbox实现垂直对齐:

.wrapper {
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
    -ms-flex-align: center;
    -webkit-align-items: center;
    -webkit-box-align: center;
    align-items: center;
}

但当然这会影响.wrapper中的所有元素。

有人知道我可以'定位'.content类的方法并获得相同的效果(请记住我无法真正改变HTML)吗?

2 个答案:

答案 0 :(得分:2)

这是一种黑客攻击,但它有效:

  1. align-items: centerwrapper移除flex:1到弹性儿童leftright

  2. 将内部leftright容器设为column flexbox,并使用h3 content和justify-content:center置于中心位置>

  3. 使用margin-bottom:autoh3推到顶部,让content保持在中间位置。

  4. 见下面的演示:

    &#13;
    &#13;
    .wrapper {
      overflow: auto;
      border: 1px solid #ccc;
      text-align: center;
      display: -ms-flexbox;
      display: -webkit-flex;
      display: flex;
    }
    .left,
    .right {
        padding: 5px;
        display: flex;
        flex-direction: column;
        justify-content: center;
        flex: 1;
    }
    .left h3, .right h3 {
        margin-bottom: auto;
    }
    .content {
        margin-bottom: auto;
    }
    &#13;
    <div class="wrapper">
    
      <div class="left">
        <h3>
        Title (should be aligned to top)
        </h3>
        <div class="content">
          left
          <br>left
          <br>left
          <br>left
          <br>
        </div>
      </div>
    
      <div class="right">
        <h3>
      Title (should be aligned to top)
      </h3>
        <div class="content">
          right
        </div>
      </div>
    
    </div>
    &#13;
    &#13;
    &#13;

答案 1 :(得分:0)

检查此fiddle

.wrapper {
    overflow: auto;
    border: 1px solid #ccc;
    text-align: center;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
    -ms-flex-align: flex-start;
    -webkit-align-items: flex-start;
    -webkit-box-align: flex-start;
    align-items: flex-start; // changed
}