Flex 弹性盒子布局
可以少去理解一些不必要的概念,而多去思考为什么会有这样的东西,它解决了什么问题,或者它的运行机制是什么?
1. 弹性盒子布局概念
Flex 是 Flexible Box 的缩写,意为“弹性布局”,用来为盒状模型提供最大的灵活性。任何一个容器都可以指定为 Flex 布局。比如:
.box{
display:flex;
}
容器、项目的理解?
采用 Flex 布局的元素,称为 Flex 容器(container),称为“容器”。它的所有子元素自动成为容器成员,称为 Flex 项目(item)。
下面借用别人一张图展示:
容器两根轴线:主轴、交叉轴:
水平的主轴(main axis):主轴的开始位置(与边框的交叉点)叫做 main start,结束位置叫做 main end;
垂直的交叉轴(cross axis):交叉轴的开始位置叫做 cross start,结束位置叫做cross end。
项目默认沿主轴排列。单个项目占据的主轴空间叫做 main size,占据的交叉轴空间叫做 cross size。
2. 容器的属性
详细记录各项属性之前,先看下基础样式代码及效果如下所示:
<div class="box">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
.box{
width: 500px;
height:200px;
padding: 10px;
border: 2px solid red;
display: flex;
}
.item {
width: 50px;
height: 50px;
color: white;
font-size: 1.4em;
text-align: center;
line-height: 50px;
margin: 1px 1px;
background: #1f1d99;
}
默认的布局方式,由于子元素是 div 以及自身属于块级元素,所以独立占据一行,下面我们给外层盒子添加 display:flex看看效果:
2.1 flex-direction
设置主轴方向,即项目排列方式,默认 row。它有如下4个值:row、row-reverse column、column-reverse。
- row(默认值):主轴为水平方向,起点在左端。
- row-reverse:主轴为水平方向,起点在右端。
- column:主轴为垂直方向,起点在上沿。
- column-reverse:主轴为垂直方向,起点在下沿。
2.2 flex-wrap
默认情况下,项目都排在一条线(又称”轴线”)上。flex-wrap 属性定义,如果一条轴线排不下,如何换行,它有如下3个值:nowrap(默认)、wrap 、wrap-reverse
- nowrap(默认):不换行。
- wrap:换行,第一行在上方。
- wrap-reverse:换行,第一行在下方。
2.3 flex-flow
flex-flow 是 flex-direction 属性和 flex-wrap 属性的简写形式,默认值为 row 、nowrap。
2.4 justify-content
设置项目在主轴上都对其方式,它有如下5个值:center、flex-start、flex-end、space-between、space-around。具体对齐方式与轴的方向有关,这里以主轴为从左到右为例:
- flex-start(默认值):左对齐。
- flex-end:右对齐。
- center:居中。
- space-between:两端对齐,项目之间的间隔都相等。
- space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。
2.5 align-items
align-items 属性定义项目在交叉轴上如何对齐,它有如下5个值:center、flex-start、flex-end、stretch(默认)、baseline 。具体的对齐方式与交叉轴的方向有关,这里以交叉轴从上到下为例:
- flex-start:交叉轴的起点对齐。
- flex-end:交叉轴的终点对齐。
- center:交叉轴的中点对齐。
- stretch(默认):如果项目未设置高度或设为auto,将占满整个容器的高度。
- baseline: 项目的第一行文字的基线对齐。
2.6 align-content
align-content 属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性与 align-items 属性效果相同。它有如下6个值:center、flex-start、flex-end、space-between、space-around、stretch。
- flex-start:与交叉轴的起点对齐。
- flex-end:与交叉轴的终点对齐。
- center:与交叉轴的中点对齐。
- space-between:与交叉轴两端对齐,轴线之间的间隔平均分布
- space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
- stretch(默认值):轴线占满整个交叉轴。
参考:
https://baijiahao.baidu.com/s?id=1711671351238047881&wfr=spider&for=pc
3. 项目的属性
3.1 order
order 属性定义项目的排列顺序。数值越小,排列越靠前,默认为 0。
3.2 flex-grow
flex-grow 弹性放大,属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。
3.3 flex-shrink
flex-shrink 弹性收缩,属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。如果设置为0,该项目不缩小。
3.4 flex-basis
flex-basis 在 Flex 布局中,一个 Flex 子项的宽度是由元素自身尺寸,flex-basis
设置的基础尺寸,以及外部填充(flex-grow
)或收缩(flex-shrink
)规则3者共同决定的。
参考:https://blog.csdn.net/qq_41635167/article/details/104190865
3.5 flex
flex 属性是 flex-grow、flex-shrink、和 flex-basis 的简写,默认值为 0 1 auto。后两个属性可选。
3.6 align-self
align-self 属性允许单个项目有与其他项目不一样的对齐方式,可覆盖 align-items 属性。默认值为 auto,表示继承父元素的 align-items 属性,如果没有父元素,则等同于 stretch。