flex学习
CSS3弹性框(Flexible Box 或 Flexbox),是一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当排布行为的布局方式。
flex术语
弹性容器(Flex container):
包含着弹性项目的父元素。通过设置 display
属性的值为 flex
或 inline-flex
来定义弹性容器。
弹性项目(Flex item):
弹性容器的每个直接子元素都成为弹性项目。弹性容器直接包含的文本将包覆成匿名弹性项目。
轴(Axis)
每个弹性框布局包含两个轴。弹性项目沿其依次排列的那根轴称为主轴(main axis)。垂直于主轴的那根轴称为侧轴(cross axis)。
容器属性
display
.container { display: flex; /* or inline-flex */ }
注意,设为Flex布局以后,子元素的 float
、 clear
和 vertical-align
属性将失效。
flex-direction
决定主轴的方向(即项目的排列方向)。这里需要注意的是主轴(main axis)是可以变动的,不一定就是图中的x轴。
.container { flex-direction: row | row-reverse | column | column-reverse; }
-
row
(默认值):主轴为水平方向,起点在左端。 -
row-reverse
:主轴为水平方向,起点在右端。 -
column
:主轴为垂直方向,起点在上沿。 -
column-reverse
:主轴为垂直方向,起点在下沿。
flex-wrap
flex-wrap
属性定义,如果一条轴线排不下,如何换行。
.container { flex-wrap: nowrap | wrap | wrap-reverse; }
-
nowrap
(默认):不换行。 -
wrap
:换行,第一行在上方。 -
wrap-reverse
:换行,第一行在下方。
flex-flow
flex-flow
属性是flex-direction
属性和flex-wrap
属性的简写形式,默认值为row nowrap
。
.container { flex-flow: <flex-direction> || <flex-wrap>; }
justify-content
justify-content
属性定义了项目在主轴上的对齐方式。
.container { justify-content: flex-start | flex-end | center | space-between | space-around; }
-
flex-start
(默认值):左对齐 -
flex-end
:右对齐 -
center
: 居中 -
space-between
:两端对齐,项目之间的间隔都相等。 -
space-around
:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。
align-items
align-items
属性定义项目在交叉轴上如何对齐(即垂直于主轴的crossAxis)
.container { align-items: flex-start | flex-end | center | baseline | stretch; }
-
flex-start
:交叉轴的起点对齐。 -
flex-end
:交叉轴的终点对齐。 -
center
:交叉轴的中点对齐。 -
baseline
: 项目的第一行文字的基线对齐。 -
stretch
(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。
align-content
align-content
属性定义了多根轴线的对齐方式。如果项目只有一根轴线(我的理解是flex容器里的行数即对应轴线),该属性不起作用。
.container { align-content: flex-start | flex-end | center | space-between | space-around | stretch; }
-
flex-start
:与交叉轴的起点对齐。 -
flex-end
:与交叉轴的终点对齐。 -
center
:与交叉轴的中点对齐。 -
space-between
:与交叉轴两端对齐,轴线之间的间隔平均分布。 -
space-around
:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。 -
stretch
(默认值):轴线占满整个交叉轴
项目(item)属性
order属性
order
属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。
.item { order: <integer>; }
flex-grow属性
flex-grow
属性定义项目的放大比例,默认为0
,即如果存在剩余空间,也不放大。这个属性可以用在左右布局不确定的情况下,给左边DIV固定宽度且flex-grow为0,右边不给宽度,flex-grow值为1,那么随着左边宽度的改变,右边DIV会自动填充剩余部分。
.item { flex-grow: <number>; /* default 0 */ }
flex-shrink属性
flex-shrink
属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。若设置了容器flex-wrap的属性值为nowrap,那么在flex-shrink值为0的时候会超出容器。
.item { flex-shrink: <number>; /* default 1 */ }
flex-basis属性
flex-basis
属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto
,即项目的本来大小。length的值即为长度,当容器还有空白的时候,item将变成length的长度,若长度之和大于容器,则会出现挤压。
P.S:flex-basis和width很相似,如果在父元素宽大于子元素宽之和的时候,和width效果相同。当屏幕缩小的时候,各个元素则会根据flex-basis来分配父元素的占比。
EX:两个div一个flex-basis是200px,另一个是400px。当父容器宽度大于600px时,两个宽度则不变;当小于600px时,两个div则会按照1:2的比例分配父容器。
.item { flex-basis: <length> | auto; /* default auto */ }
flex属性
flex
属性是flex-grow
, flex-shrink
和 flex-basis
的简写,默认值为0 1 auto
。后两个属性可选。
.item { flex: none | [ <"flex-grow"> <"flex-shrink">? || <"flex-basis"> ] }
有两个默认值auto (1 1 auto),none(0 0 auto)
align-self属性
align-self
属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items
属性。默认值为auto
,表示继承父元素的align-items
属性,如果没有父元素,则等同于stretch
。
.item { align-self: auto | flex-start | flex-end | center | baseline | stretch; }
该博客摘抄自青骓前端博客