理解flex弹性盒子布局

初步理解

Flex布局是一种一维的布局模型,一次只能处理一个维度上的元素布局,一行或者一列。它旨在为容器中的项目提供更有效的对齐和分配空间的方式,解决传统布局方法中的许多问题,如垂直居中、等宽元素等。
伸缩布局 = 弹性布局 = 伸缩盒布局 = 弹性盒布局 =flex布局

主要思想是使父元素能够调整子元素的宽度、高度、排列方式,从而更好的适应可用的布局空间。设定为flex布局的元素能够放大子元素使之尽可能填充可用空间,也可以收缩子元素使之不溢出。

主流浏览器都支持Flex布局,已经几乎不存在版本兼容问题

Webkit内核的浏览器,必须加上-webkit前缀。

1
2
3
4
.box{
display: -webkit-flex; /* Safari */
display: flex;
}

弹性盒特点

弹性布局具有以下特点:
行内元素也可以使用Flex布局。
注意,设为Flex布局以后,子元素的float、clear和vertical-align属性将失效。
主轴与交叉轴:弹性容器具有主轴(main axis)和交叉轴(cross axis)。默认情况下,主轴是水平方向,交叉轴是垂直方向。
弹性容器:通过将父元素的display属性设置为flex或inline-flex来创建弹性容器。
子元素的弹性项目:弹性容器中的每个子元素都成为弹性项目。子元素可以指定各自在主轴和交叉轴上的大小、顺序以及对齐方式等。
主轴对齐:弹性项目可以在主轴上按照一定比例分配空间,也可以使用justify-content属性定义主轴的对齐方式。
交叉轴对齐:弹性项目可以在交叉轴上进行对齐,包括顶部对齐、底部对齐、居中对齐等,使用align-items属性定义交叉轴对齐方式。
换行与自动调整:可控制弹性项目是否换行,并且具备自动调整元素大小的能力。

Flex布局

使用原理

Flex布局必须有父盒子,给父元素设置 display :flex 弹性容器为块级元素(或 inline-flex弹性容器为行内元素)
子元素会自动按照一定规则挤压或拉伸

  • 弹性盒子由弹性容器(父亲)和弹性盒子(子元素),主轴和侧轴组成
  • 主轴默认在水平方向,侧轴默认在垂直方向
  • 弹性容器内包含了一个或多个弹性子元素。
  • 弹性子元素通常在弹性盒子内一行显示。默认情况每个容器只有一行
  • 弹性容器外及弹性子元素内是正常渲染的。弹性盒子只定义了弹性子元素如何在弹性容器内布局
  • 默认情况主轴内容撑开,侧轴拉伸填充

    CSS3 弹性盒( Flexible Box 或 flexbox),是一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式。
    引入弹性盒布局模型的目的是提供一种更加有效的方式来对一个容器中的子元素进行排列、对齐和分配空白空间

弹性盒基础

当一个元素开启flex布局之后,成为弹性容器(父元素)flex container。其所有子元素为flex items,每个子元素为 flex item;
容器默认存在两个轴:水平轴(main axis)和垂直轴(cross axis),项目默认沿主轴排列(水平轴):

flex布局属性图

main axis: Flex 父元素的主轴是指子元素布局的主要方向轴,它由属性flex-direction来确定主轴是水平还是垂直的,默认为水平轴。

main-start & main-end: 分别表示主轴的开始和结束,子元素在父元素中会沿着主轴从main-start到main-end排布。

main size: 单个项目占据主轴的长度大小。

cross axis: 交叉轴,与主轴垂直。

cross-start & cross-end: 分别表示交叉轴的开始和结束。子元素在交叉轴的排布从cross-start开始到cross-end。

cross size: 子元素在交叉轴方向上的大小。

容器属性(父元素属性)

justify-content: 设置主轴上的子元素排列方式

1
2
3
.box {
justify-content: flex-start | flex-end | center | space-between | space-around;
}

属性值:

  • flex-start 默认值
    • 左对齐,从起点开始依次排列,如果主轴是x轴,则从左到右放子元素
  • flex-end
    • 从尾部开始排列
  • center
    • 让子盒子在主轴居中对齐,如果主轴是x轴则水平居中
  • space-between
    • 先两边贴边再平分剩余空间
  • space-evenly(下图未显示)
    • 左右两边和中间的空隙都相等(中间和两边间隙都是d)
  • space-around
    • 每个子元素的两侧空隙相等,注意是每个的两侧,所以俩个子盒子中间的空隙是最左和最有空隙的两倍
      flex布局justify-content属性图
      ** 记忆:两侧没缝隙space-between ;左右中间缝隙一样大space-evenly;中间是左右缝隙两倍缝隙space-around**

align-items :设置侧轴上的子元素排列方式(单行)

该属性是控制子项在侧轴(默认是y轴)上的排列方式在子项为单项的时候使用

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

align-content:设置侧轴上的子元素的排列方式(多行)

align-content属性定义了多根轴线的对齐方式,若只有一根轴线的话,该属性将不会起作用

1
2
3
.box {
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
  • flex-start 默认值在侧轴的头部开始排列
  • flex-end:在侧轴的尾部开始排列
  • center:在侧轴中间显示
  • space-between:子项在侧轴先分布在两头,再平分剩余空间
  • space-around:子项在侧轴平分剩余空间
  • stretch:设置子项元素高度平分父元素高度,沿侧轴线拉伸至填满容器(父元素没有设置高度时默认拉伸)
    flex布局jalign-content属性图

flex-direction :设置主轴的方向

1
2
3
.box{
flex-direction: row | row-reverse | column | column-reverse;
}
  • row默认值从左到右
  • row-reverse 从右到左
  • column从上到下,把主轴改成垂直方向,常用
  • column-reverse 从下到上
    flex布局flex-direction属性图

flex-wrap:设置子元素是否换行以及换行的方向

1
2
3
4
.box{
flex-wrap: nowrap | wrap | wrap-reverse;
}

  • nowrap(默认):不换行
  • wrap:换行,第一行在上方。
  • wrap-reverse:换行,第一行在下方。
  • flex布局在浏览器宽度缩小后里面的最后一个盒子不会被挤下去到下面一行,而是他们都会自动缩小
  • flex-wrap 默认子元素不换行,默认都是排在一条轴线上,相当于隐含了这个代码 flex-wrap:nowrap;

flex-flow : 复合属性

相当于同时设置了flex-direction和flex-wrap
例如:

1
2
3
4
5
6
7
8
9
10
#pond {
display: flex;
flex-direction:column;
flex-wrap:wrap
}
等同于
#pond {
display: flex;
flex-flow: column wrap
}

项目属性(子元素属性)

flex属性

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

  • 定义子项目分配剩余空间!,用flex来表示占多少份数!
  • flex:数字;默认是0.,表示占用父级默认尺寸的份数
  • 注意,和z-index不一样
    1
    2
    3
    .item {
    flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
    }

该属性有两个快捷值:auto (1 1 auto)none (0 0 auto)
建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值

flex: 1

用于控制弹性容器中的子元素如何分配空间。

  • flex-grow: 1
    当容器中有剩余空间时,该元素会按比例放大,占据这些空间。如果所有子元素的 flex-grow 都为 1,它们将平均分配剩余空间。
  • flex-shrink: 1
    指定弹性项目的收缩因子。
    当容器空间不足时,该元素会按比例缩小。如果所有子元素的 flex-shrink 都为 1,它们在空间不足时会均匀地缩小。
  • flex-basis: 0%
    指定弹性项目在分配剩余空间前的初始大小。
    设置为 0% 意味着元素的初始大小不计入空间分配,完全由 flex-grow 和 flex-shrink 决定。
  • 总结:
    lex: 1 使元素能够根据容器的可用空间自动调整大小。
    元素会尽可能地扩展以填充剩余空间,并在空间不足时均匀收缩。
    常用于创建等宽列布局或使某个元素占据容器的全部剩余空间。

order属性

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

1
2
3
.item {
order: <integer>;
}

flex布局order属性图

align-self 控制单个子项自己在侧轴上的对齐方式

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

该属性可能取6个值,除了auto,其他都与align-items属性完全一致

1
2
3
  .item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
  • 默认值为auto,表示继承父元素的align-items属性,如果没有父元素就等同于stretch
    flex布局align-self属性图

flex-grow属性

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

1
2
3
4
.item {
flex-grow: <number>; /* default 0 */
}

![flex布局flex-grow属性图](./postImgs/cssImgs/flex7.png)

如果所有项目的flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果一个项目的flex-grow属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍。

flex-shrink属性

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

如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小(负值对该属性无效)

1
2
3
.item {
flex-shrink: <number>; /* 默认为 1 */
}
![flex布局flex-shrink属性图](./postImgs/cssImgs/flex8.png)

flex-basis属性

flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。它可以设为跟width或height属性一样的值(比如350px),则项目将占据固定空间。

1
2
3
.item {
flex-basis: <length> | auto; /* 默认为 auto */
}

高频属性

容器属性:

1
2
3
4
5
6
7
.container {
display: flex;
flex-direction: row | column; /* 主轴方向 */
justify-content: center | space-between; /* 主轴对齐 */
align-items: center | stretch; /* 交叉轴对齐 */
flex-wrap: wrap; /* 换行 */
}

项目属性:

1
2
3
4
5
.item {
flex: 1; /* 等价于 flex-grow: 1 */
align-self: flex-end; /* 单个项目对齐 */
order: 2; /* 调整顺序 */
}

经典布局:

圣杯布局:三栏布局(两侧固定,中间自适应)
瀑布流:flex-wrap: wrap + flex: 1 0 200px

练习

flex青蛙练习
flex布局练习

参考文章

这篇博客我结合了MDN web文档,菜鸟编程-flex篇,AI解答和以下博主的理解:
[1]本文参考了菜鸟编程-flex布局语法教程篇菜鸟编程
[2]本文参考了csdn作者陈y_d的flex布局文章
[3]本文参考了csdn作者奶糖 肥晨的flex布局文章
[4]同类好文章还有csdn作者Hopebearer_的flex布局文章