一、容器属性
1. justify-content
flex-start
(默认值):左对齐flex-end
:右对齐center
: 居中space-between
:两端对齐,项目之间的间隔都相等。space-around
:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。
2. align-items
flex-start
:交叉轴的起点对齐。flex-end
:交叉轴的终点对齐。center
:交叉轴的中点对齐。baseline
: 项目的第一行文字的基线对齐。stretch
(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。
3. flex-flow
flex-direction
属性和flex-wrap
属性的简写形式,默认值为row nowrap
。
4. flex-wrap 换行
nowrap
(默认):不换行。wrap
:换行,第一行在上方。wrap-reverse
:换行,第一行在下方。
5. align-content
多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。
6. flex-direction
row
(默认值):主轴为水平方向,起点在左端。row-reverse
:主轴为水平方向,起点在右端。column
:主轴为垂直方向,起点在上沿。column-reverse
:主轴为垂直方向,起点在下沿。
二、子元素属性
1. order 排列顺序
数字
2. flex-grow 剩余空间的项目放大比例
flex-grow: 0
表示项目剩余空间不分配。
flex-grow: 1
: 表示项目剩余空间按比例分配至自适应父元素宽度。
数字越大拉伸越严重
2. flex-shrink 剩余空间的项目缩小比例
子元素未超出空间,设置无效。
当子元素总宽度超出了容器时,收缩比例。
flex-shrink: 0
表示项目即使超出也不压缩。
flex-shrink: 1
: 表示项目按比例压缩至自适应父元素宽度。
数字越大压缩越严重
3. flex-basis 分配剩余空间前,该子元素的占据尺寸。
优先级高于flex-grow
和flex-shrink
若flex-basis: 0
,则该元素按自身内容自适应,无视被设置的width。
可以为具体数值,比如flex-basis: 150px
4. flex
2/3/4的简写
设置flex:1
(相当于flex: 1 0 0
或flex-grow: 1
),可以让项目自适应到父元素的宽度。
设置flex: 0
,可以让子元素无视被设置的宽度,自适应到内部元素的宽度。
5. align-self
子元素的默认对齐方式
三、其他
假设有这样的div结构:
1 | <div id="content"> |
- 默认情况下,子元素的宽度由他们的内容决定,即使在设置了父元素的总宽度的情况下,也只是根据内容自适应。
1 | #content { |
默认情况下,若子元素总宽度超出父元素,则自适应收缩到父元素宽度。
若有单独的子元素有设置宽度,则按比例收缩
1 | #content { |
若子元素宽度未超出父元素,则
flex-shrink
失效。
1 | #content { |
设置
flex: 0
,可以让子元素无视被设置的宽度width
,自适应到内部元素的宽度。(相当于flex-basis: 0
)
1 | #content { |
flex-basis
的优先级大于width
1 | #content { |
flex-shrink: 0
,表示无视容器宽度,被设置的子元素永不收缩,即使超出父容器。
1 | #content { |
flex-basic
、flex-grow
和flex-shrink
的优先级:要注意一点,
flex-basis
是最先被设置的属性,但这并不代表生效的优先级最高,flex-basis
优先级必定大于flex-grow
和width
,但和flex-shrink
比起来,优先级不一定是最高的。所以说并不是flex-basic
设置后,flex-shrink
就无效了。- 项目首先会按照
flex-basis
的值进行设置,优先级高于flex-grow
与width
- 如果剩余空间不足以容纳所有项目的
flex-basis
尺寸之和,并且某些项目的flex-shrink
值大于1
,那么这些项目会按照其flex-shrink
值收缩,以适应剩余空间。 - 如果剩余空间仍然不足,那么项目的
flex-basis
属性值将影响哪些项目更容易受到收缩。具体来说,flex-basis
的值较大的项目更不容易受到收缩,因为它们需要更多的剩余空间才能保持其初始尺寸。
- 项目首先会按照
若
flex-basis: 0
,则该元素按自身内容自适应,无视被设置的width。(相当于flex: 0
)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#content {
display: flex;
width: 500px;
height: 300px;
background-color: #abcdef
}
#content div {
flex-basis: 0;
height: 20px;
border: 3px solid rgba(0,0,0,.2);
}
#content .box {
width: 100px;
}