Flex布局

简介

不管是在学习vue,还是在学习微信小程序的时候,我都接触到了flex布局。所以今天打算认真学一下。

Flex

flex是css3的样式,意为“弹性布局”。通过display:block使用。行内元素通过display:inline-block使用。
使用了flex布局,子元素的float、clear和vertical-align属性将失效。

概念


为了方便学习,我们称采用了flex布局的父元素为容器。它的子元素称为项目。容器默认有两根轴,水平方向的称为主轴,垂直方向的称为交叉轴

属性

容器属性

属于容器的属性有6个

1
2
3
4
5
6
flex-direction //决定项目排列方向
flex-wrap //换行
flex-flow //上两个的结合
justify-content //主轴排列
align-items //交叉轴排列
align-content

flex-direction

flex-direction有4个值:

1
2
3
.xxx{
flex-direction:row | row-reverse | column | column-reverse;
}
1
2
3
4
row //从左向右
row-reverse //从右向左
column //从上向下
column-reverse //从下向上

flex-wrap

flex-wrap有3个值

1
2
3
.xxx{
flex-wrap: nowrap | wrap | wrap-reverse;
}
1
2
3
nowrap //不换行
wrap //从左上角开始自动向下换行
wrap-reverse //从左下角开始自动向上换行

举个例子:
我的初始布局

当我还未添加flex-wrap属性时,再添加一个项目

可以看到项目不会自动换行,这也对应了第一个值nowrap,就是说我们需要flex-wrap: nowrap完全可以不用写。
wrap:

wrap-reverse:

flex-flow

flex-flow属性是flex-direction属性和flex-wrap属性的简写形式。
默认值row nowrap。感觉有了这个上面两个有点多余。
例子:

1
flex-flow: row wrap;

justify-content

justify-content属性定义了项目在主轴上的对齐方式,它有5个值。

1
2
3
.xxx{
justify-content: flex-start | flex-end | center | space-between | space-around;
}
1
2
3
4
5
flex-start(默认值) //左对齐
flex-end //右对齐
center //居中
space-between //两端对齐,项目之间的间隔都相等。
space-around //每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。

flex-start:

flex-end:

center:

space-between:

space-around:

align-items

align-items属性定义项目在交叉轴上如何对齐,也有5个值。

1
2
3
.xxx{
align-items: flex-start | flex-end | center | baseline | stretch;
}
1
2
3
4
5
flex-start //交叉轴的起点对齐。
flex-end //交叉轴的终点对齐。
center //交叉轴的中点对齐。
baseline //项目的第一行文字的基线对齐。
stretch(默认值)//如果项目未设置高度或设为auto,将占满整个容器的高度。

flex-start:

flex-end:

center:

baseline:不试了,懒得写text

stretch:

align-content

align-content属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。
说实话,不是很理解。我觉得应该是主轴和交叉轴的综合,就像flex-flow,综合了flex-direction和flex-wrap。

1
2
3
.xxx{
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
1
2
3
4
5
6
flex-start //与交叉轴的起点对齐。
flex-end //与交叉轴的终点对齐。
center //与交叉轴的中点对齐。
space-between //与交叉轴两端对齐,轴线之间的间隔平均分布。
space-around //每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
stretch(默认值)//轴线占满整个交叉轴。

项目属性

属于项目的属性有6个

1
2
3
4
5
6
order //排列顺序
flex-grow
flex-shrink
flex-basis
flex
align-self

order

order属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。

1
2
3
.xxxx{
order: integer;
}

flex-grow

flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。

1
2
3
.xxxx{
flex-grow: <number>;
}

flex-shrink

flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。

1
2
3
.xxxx{
flex-shrink: <number>;
}

flex-basis

flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。

1
2
3
.xxxx{
flex-basis: <length> | auto;
}

flex

flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。

1
2
3
.xxx{
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}

align-self

align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch

1
2
3
.xxxx{
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}

总结

项目的属性理解起来比容器难。

参考文章