一、什么是flex布局

Flexible Box 模型,通常被称为 flexbox,是一种一维的布局模型。它给 flexbox 的子元素之间提供了强大的空间分布和对齐能力。 flexbox 是一种一维的布局,是因为一个 flexbox 一次只能处理一个维度上的元素布局,一行或者一列。简单来说,flex布局就是一种新的盒装布局方式。

二、基本概念

采用了flex布局的容器就是flex中的”容器“,而它的子代元素默认就是flex中的项目。在flex布局中有两个重要的概念:主轴和交叉轴。

android flex布局 flex布局1_默认值

android flex布局 flex布局1_默认值_02

主轴的默认是横向的,与主轴垂直的就是交叉轴。

三、容器属性

在容器中属性中使用display:flex即可启用flex布局。flex布局中有6个属性。

  • flex-direction
  • flex-wrap
  • flex-flow
  • justify-content
  • align-items
  • align-content

3.1 flex-direction

flex-direction决定的是flex布局中主轴和交叉轴的位置。默认(row)的情况下,主轴是水平的,交叉轴竖直方向的,如上图。当参数值为column时,主轴是垂直的,交叉轴是水平的。

.box {
  display: flex;
  flex-direction: row | column;
}

3.2 flex-wrap

当容器中的元素在一行中放不下的时候,就会用到这个属性了。默认(nowrap)情况下元素不不换行的。当参数值为wrap时,就会换行,第一行元素在上方。当参数值为wrap-revere时,也会产生换行效果,但是第一行元素会在下方。

android flex布局 flex布局1_默认值_03

.container {

  display: flex;
  flex-wrap: nowrap;
}

当容器的宽度不够时,不换行会导致盒子里的内容的宽和高发生改变。

android flex布局 flex布局1_两端对齐_04

.container {
  display: flex;
  flex-wrap: wrap;
}

android flex布局 flex布局1_属性值_05

.container {
  display: flex;
  flex-wrap: wrap-reverse;
}

3.3 flex-flow

flex-flow是flex-direction和flex-wrap两个属性的联合简单写法。但一个值是flex-direction,第二个值是flew-wrap。

.container {
  display: flex;
  flex-flow: row wrap;
}

3.4 justify-content

justify-content这个属性主要是用来控制元素在主轴上的对齐方式。

android flex布局 flex布局1_默认值_06

.container{
    justify-content:flex-start | flex-end | center |space-between |space-around;
}
  • flex-start 元素在主轴方向上左边对齐
  • flex-end 元素在主轴方向上右边对齐
  • center 元素在主轴方向上居中对齐
  • space-betweetn 元素在主轴方向上两端对齐,空白部分均分。
  • space-around 元素在主轴上的左右空间相等

3.5 align-items

align-items属性主要控制的元素在交叉轴上的对齐方式。它的初始值为stretch,会默认将元素的高度拉伸到最高元素的高度。

android flex布局 flex布局1_两端对齐_07


android flex布局 flex布局1_属性值_08

.container{
    justify-content:flex-start | flex-end | center |stretch | baseline;
}
  • flex-start 元素从交叉轴的起点开始对齐
  • flex-end 元素从交叉轴的终点开始对齐
  • center 元素在交叉轴方向居中对齐
  • stretch 如果元素有高度,此时的效果等同于flex-start。没有高度,则会将元素拉伸到元素中的最高。
  • baseline 以元素中的第一项的baseline为基准对齐。

3.6 align-content

align-content属性设置的是多轴的对齐方式。如果容器中没有多行项目,该属性不会生效。

flew-wrap: nowrap // flex-wrap属性值是nowrap时,
                  // align-content属性不会生效。

android flex布局 flex布局1_默认值_09

.container {
    display: flex;
    flex-flow: row wrap;
    align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
  • flex-start 元素从交叉轴方向起点开始填充。
  • flex-end 元素从交叉轴方向末尾开始填充。
  • center 所有行朝向容器的中心填充
  • space-betweetn 元素在交叉轴方向上两端对齐,空白部分均分。
  • space-around 元素在交叉轴上的左右空间相等
  • stretch 沿着交叉轴占满整个空间

四、项目属性

flex项目中常用的六个属性是:

  • order: 定义项目的排序顺序,默认为0
  • flex-grow: 定义项目的放大比例,默认为0
  • flex-shrink: 定义项目的缩小比例,默认为1
  • flex-basis: 定义了在分配多余空间之前,项目占据的主轴空间(main size)。
  • flex: 是flex-grow, flex-shrink 和flex-basis的简写,默认值为0 1 auto。后两个属性可选。
  • align-self: 覆盖align-items属性。默认值为auto

4.1 order

order属性控制者项目元素在容器中布局时的排列顺序,按照order值进行升序排序,属性值不能为负数。

android flex布局 flex布局1_默认值_10

4.2 flex-grow

flex-grow属性控制着项目元素在容器中的拉伸,属性值不能为负。当父元素的宽度大于子元素宽度之和时,并且父元素有剩余空间,这时,设置了flex-grow属性的元素会分享父元素的空间。

android flex布局 flex布局1_两端对齐_11

<div class="wrapper">
  <div class="box" style="flex-grow: 1;">1</div>
  <div class="box" style="flex-grow: 3;">2</div>
  <div class="box" style="flex-grow: 1;">3</div>
</div>

4.3 flex-shrink

flex-shrink属性控制着项目元素在容器中的缩小,属性值不能为负。当父元素的宽度小于子元素的宽度之和时,并且超过父元素的宽度,这时设置了flex-shrink的元素就会按照一定比列进行收缩。

<div class="wrapper">
    <div class="box" style="flex-shrink: 1;">1</div>
    <div class="box" style="flex-shrink: 3;">2</div>
    <div class="box" style="flex-shrink: 1;">3</div>
 </div>

4.4 flex-basis

flex-basis属性决定着元素在主轴方向上的初始大小。当一个元素同时被设置了 flex-basis (除值为 auto 外) 和 width (或者在 flex-direction: column 情况下设置了height) , flex-basis 具有更高的优先级。

4.5 flex

flex属性规定了弹性元素如何伸长或缩短以适应flex容器中的可用空间。这是一个简写属性,用来设置 flex-grow, flex-shrink 与 flex-basis。

4.6 align-self

align-self属性定义元素单独在交叉轴方向上的对齐方式。默认值为auto,表明元素继承了它的父容器的 align-items属性。如果没有父容器,则为 "stretch"。其他值和align-items的属性值相同。

android flex布局 flex布局1_android flex布局_12