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

Posted

技术标签:

【中文标题】垂直居中并左对齐一列弹性项目【英文标题】:Vertically center and left-align a column of flex items 【发布时间】:2016-01-27 02:06:49 【问题描述】:

要求

    弹性盒 垂直居中 水平向左 垂直堆叠的子元素 子元素的数量可以是一个或多个 使用旧语法以便 android 4.2 理解

听起来很难描述。演示中的粉红色框是我想要的外观。绿框已经不错了,只是不知道怎么处理多个子元素。

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

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

【问题讨论】:

【参考方案1】:

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

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

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

由于flex-direction:column 表示主轴是垂直的,因此您需要使用justify-content 而不是align-items 来使弹性项目居中。

这是一个例子:

#container 
  display: flex;
  flex-direction: column;
  justify-content: center;
  height: 200px;
  background-color: lightpink;
<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>

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

In CSS Flexbox, why are there no "justify-items" and "justify-self" properties?

在此处了解有关沿交叉轴的 flex 对齐的更多信息:

How does flex-wrap work with align-self, align-items and align-content?

【讨论】:

诀窍是设置高度,让浏览器知道定位项目的确切点。【参考方案2】:

我认为如果您将列 div 垂直放在包装器 div 的中心(我们称它为您的行 div):

align-self: center;

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

text-align: center;

它会按照你想要的方式工作。

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于垂直居中并左对齐一列弹性项目的主要内容,如果未能解决你的问题,请参考以下文章

如何垂直居中弹性框项目的内容

如何在弹性项目中垂直居中文本?

块级元素的垂直居中

使用弹性布局来解决令人烦恼的垂直居中问题~~

弹性flex 垂直剧中 和 水平居中 小记

vue 弹性布局 实现长图垂直居上,短图垂直居中