详解Flex弹性布局
- 1. 什么是Flex布局
- 2. Flex布局核心概念
- 1)容器和属性定义
- 2)主轴和交叉轴定义
- 3)容器属性
- 4)项目属性
- 3. 优缺点
1. 什么是Flex布局
Flex
全称为 “Flexible Box Layout
”,即 “弹性盒布局”,旨在提供一种更有效的方式来布局、对齐和分配容器中项目之间的空间,即使它们的大小未知或动态变化。
2. Flex布局核心概念
1)容器和属性定义
容器:使用
display:flex 或 display:inline-flex
声明的元素为Flex
弹性容器
项目:容器内的子元素自动成为Flex
项目。注意: 项目只能是容器的顶层子元素(直属子元素),不包含项目的子元素
2)主轴和交叉轴定义
主轴是
Flex
项目的排列方向,交叉轴则是垂直于主轴的方向。
- 主轴(main axis):沿其布置子容器的从
main-start
开始到main-end
,请注意,它不一定是水平的;这取决于flex-direction
属性,main size
是它可放置的宽度,是容器的宽或高,取决于flex-direction
。- 交叉轴(cross axis):垂直于主轴的轴称为交叉轴,它的方向取决于主轴方向,是主轴写满一行后另起一行的方向,从
cross-start到 cross-end
,cross size
是它可放置的宽度,是容器的宽或高,取决于flex-direction
。
3)容器属性
-
flex- direction
属性
定义主轴的方向,也就是子项目元素排列的方向。.demo { display: flex; flex-direction: row | row-reverse | column | column-reverse; }
- row(默认值):主轴为水平方向,起点在左端(项目从左往右排列)。
- row-reverse:主轴为水平方向,起点在右端(项目从右往左排列)。
- column:主轴为垂直方向,起点在上沿(项目从上往下排列)。
- column-reverse:主轴为垂直方向,起点在下沿(项目从下往上排列)。
-
flex-wrap
属性
设置子容器的换行方式,默认子项目元素都将排列一行nowrap
。.demo { display: flex; flex-wrap: nowrap | wrap | wrap-reverse; }
- nowrap(默认):不换行(列)。
- wrap:主轴为横向时:从上到下换行。主轴为纵向时:从左到右换列。
- wrap-reverse:主轴为横向时:从下到上换行。主轴为纵向时:从右到左换列。
-
flex-flow
属性
是flex-direction 和 flex-wrap
属性的简写,默认值为row nowrap
。.demo { display: flex; flex-flow: <flex-direction> <flex-wrap>; }
-
项目群主轴对齐
justify-content
定义了项目在主轴上的对齐方式。.demo { display: flex; justify-content: flex-start | flex-end | center | space-between | space-around; }
- flex-start(默认):与主轴的起点对齐。
- flex-end:与主轴的终点对齐
- center:与主轴的中点对齐。
- space-between:两端对齐主轴的起点与终点,项目之间的间隔都相等。
- space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍
-
项目群交叉轴对齐
align-items
属性
定义项目在交叉轴上如何对齐。纵向交叉轴始终自上而下,横向交叉轴始终自左而右。.demo { display: flex; align-items: flex-start | flex-end | center | baseline | stretch; }
- flex-start:交叉轴的起点对齐。
- flex-end:交叉轴的终点对齐。
- center:交叉轴的中点对齐。
- baseline: 项目的第一行文字的基线对齐。
- stretch(默认值):如果项目未设置高度或设为auto,项目将占满整个容器的高度。
-
align-content
属性
定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用.demo { display: flex; align-content: flex-start | flex-end | center | space-between | space-around | stretch; }
- flex-start:与交叉轴的起点对齐。
- flex-end:与交叉轴的终点对齐。
- center:与交叉轴的中点对齐。
- space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。
- space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
- stretch(默认值):主轴线占满整个交叉轴。
4)项目属性
order
属性
定义项目的排列顺序。数值越小,排列越靠前,默认为0。.child { order: <integer>; }
flex-grow
属性
定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。.child { flex-grow: <number>; /* default 0 */ }
flex-shrink
属性
定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。负值对该属性无效。如果flex-shrink
值为0,表示该项目不收缩。.child { flex-shrink: <number>; /* default 1 */ }
flex-basis
属性
定义了在分配多余空间之前,项目占据的主轴空间。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。当设置了flex-basis的值并且flex-shrink: 0;
width
的设置就不起作用了.child { flex-basis: <length> | auto; /* default auto */ }
flex
属性
是flex-grow,flex-shrink和flex-basis
的简写,默认值为0 1 auto
后两个属性可选。该属性有两个快捷值:auto( 1 1 auto)和none( 0 0 auto)
.child { flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ] }
align-self
属性
允许单个项目有与其他项目不一样的对齐方式。可覆盖align-items
属性,默认值为auto
,表示继承父元素的align-items
属性,如果没有父元素,则等于strech
。align-self
属性有6个值,除了auto
,其他都与align-items
属性完全一致。.child { align-self: auto | flex-start | flex-end | center | baseline | stretch; }
3. 优缺点
- 优点
Flex
布局是一种新型的CSS
布局模式,它主要用于弹性盒子布局。相比于传统的布局方式,它更加灵活,易于调整,也更加适应不同的设备和屏幕尺寸。允许我们在一个容器内对子元素进行灵活的排列、对齐和空间分配。 - 缺点
Flex布局的主要缺点是兼容性问题。
Flex
布局是CSS3
的一部分,因此在一些老旧的浏览器中可能不被支持或支持不完全。此外,Flex
布局相对较新,因此可能需要一些时间来理解和掌握。