05Flex 弹性布局
Flex 是现代 CSS 布局的绝对主力:一行 display: flex,
子元素立刻从「竖着堆」变成「横着排」,对齐、分配、换行全部听指挥。
本章是 CSS 布局的重中之重,请务必边改边看右边的实时预览。
一、主轴与交叉轴:先建坐标系
学 Flex 之前必须先立好坐标系,否则后面所有属性都会记混。Flex 容器里有两条轴:
主轴(main axis)是项目排队走的方向,
交叉轴(cross axis)永远垂直于主轴。
默认情况下(flex-direction: row)主轴水平向右、交叉轴垂直向下——
但只要把方向改成 column,两根轴就会整体互换。
justify-content—— 管主轴上的对齐与空间分配;align-items—— 管交叉轴上的对齐。
.row 的 display: flex 下面补一行 flex-direction: column,两根轴立刻互换、项目改竖着排二、display: flex:起手式
在父元素上写一行 display: flex,它就变成弹性容器(flex container),
所有直接子元素自动升级为弹性项目(flex item):
块级子元素不再竖着堆,而是沿主轴排成一行;宽度也不再撑满整行,而是收缩为内容宽度。
注意子元素用的还是同一套 HTML,一个字都没改——变的只是父级的一个属性。
.flexed 的 display: flex 删掉,下面立刻退回竖排display: inline-flex。三、flex-direction:主轴朝哪边
flex-direction 决定主轴的方向,也决定了项目「从哪头往哪头排」。四个取值一张表看全:
| 取值 | 方向 | 排列起点 | 备注 |
|---|---|---|---|
| row | 水平 | 左 → 右 | 默认值,项目沿 x 轴排 |
| row-reverse | 水平 | 右 → 左 | 只是换起点,不是镜像镜子 |
| column | 垂直 | 上 → 下 | 主轴变成 y 轴,两轴互换 |
| column-reverse | 垂直 | 下 → 上 | 同样只改起点 |
.rev 的 flex-direction: row-reverse 换成 row,第二个舞台立刻改成从左排flex-direction: column,
主体区写 flex: 1 吃掉剩余高度——这是移动端页面最常用的骨架(本章第九节会实战)。四、justify-content:主轴上怎么分空间
项目排完队,主轴上剩下的空隙怎么处理?justify-content 说了算。
它是「导航两端对齐」「按钮组居中」「卡片等距分布」背后的功臣,六个取值:
| 取值 | 效果 | 典型场景 |
|---|---|---|
| flex-start | 全部挤在主轴起点 | 普通列表(默认) |
| flex-end | 全部挤在主轴终点 | 靠右的操作按钮 |
| center | 整体居中,项目挨在一起 | 居中的标签组 |
| space-between | 两端贴边,中间间距相等 | 顶栏(logo 左、菜单右) |
| space-around | 每个项目两侧间距相等(中间 = 边缘 × 2) | 均匀分布的图标 |
| space-evenly | 所有间隔完全相等 | 等距分布 |
.between 的 space-between 改成 space-evenly,两端立刻不再贴边五、align-items:交叉轴上怎么对齐
主轴排好了,交叉轴方向项目们靠哪边、怎么对齐?align-items 管「一行项目的集体站位」。
注意默认值 stretch 很特殊:项目不写高度时会被拉到和最高的一样高——
这就是 Flex「天生等高」的秘密。
| 取值 | 效果 | 备注 |
|---|---|---|
| stretch | 拉伸填满交叉轴 | 默认,只项目没写高度时有效 |
| flex-start | 交叉轴起点对齐 | row 方向 = 顶对齐 |
| flex-end | 交叉轴终点对齐 | row 方向 = 底对齐 |
| center | 交叉轴居中 | 最常见的垂直居中 |
| baseline | 按文字基线对齐 | 字号不同时看得最清楚 |
.mid 的 center 改成 stretch,中间那个高项目立刻被拉回顶到底填满六、换行三件套:flex-wrap / align-content / gap
默认 flex-wrap: nowrap:项目再多也死挤一行,
挤不下就互相压缩(配合后文的 flex-shrink)。改成 wrap 才会换行;
换行之后,行与行在交叉轴上怎么摆,交给 align-content;
而项目之间的间距,现代写法用 gap。
| 属性 | 作用 | 关键点 |
|---|---|---|
| flex-wrap | nowrap 死挤一行 / wrap 自动换行 | 默认 nowrap |
| align-content | 行与行之间在交叉轴的分布 | 只在多行(wrap)时生效 |
| gap | 项目之间的间距 | 可 row-gap / column-gap 分开设 |
.wrap 的 flex-wrap: wrap 删掉,第二框立刻挤成一排变瘦七、子项三属性:flex-grow / flex-shrink / flex-basis
前面六节都写在容器上,接下来三个属性写在项目上, 合称「flex 三兄弟」,共同决定每个项目占多大地方:
flex-basis—— 主轴上的初始尺寸,优先级高于 width(默认 auto:看内容/宽度);flex-grow—— 有剩余空间时,按比例瓜分(默认 0:不瓜分);flex-shrink—— 空间不足时,按比例压缩(默认 1:人人可压)。
| 写法 | 等价展开 | 含义 |
|---|---|---|
| flex: 1 | flex: 1 1 0 | 先清零再平分,等分布局首选 |
| flex: 2 1 auto | grow=2 shrink=1 basis=auto | 先保住内容,再按比例伸 |
| flex: 0 0 240px | grow=0 shrink=0 basis=240px | 尺寸焊死,不伸不缩(固定侧栏) |
| flex: auto | flex: 1 1 auto | grow 为 1,但 basis 取内容宽 |
flex-shrink: 0,主区 flex-grow: 1 吃掉剩余空间——把侧栏 width 改成 120 试试.g2 的 grow 改成 3,中间立刻变得更宽.o2 的 order 改成 0,B 立刻挪到最前面八、align-self:给单个项目「开小灶」
容器上的 align-items 是集体口令,项目上的 align-self 是个人请假条:
取值完全相同(stretch / flex-start / flex-end / center / baseline),
但只对自己生效,会覆盖容器设置。聊天界面「自己的消息靠上、别人的靠下」就靠它。
align-self: flex-end 试试默认
center
默认
flex-end
默认
order(上一节)也是「项目级」属性。项目能覆盖容器的口令,
项目级能覆盖的只有:align-self、order、flex 三兄弟——其余都得听容器的。九、经典实战四连
学完属性,来四个真实到可以直接抄走的配方:等宽导航、完美居中、圣杯布局、底部固定页脚。 每个都是面试与日常的高频题。
.it、或把「首页」的 class 去掉 on 试试,宽度都自动重排.fx-center 的 align-items 改 flex-start,卡片立刻顶上flex: 1 自适应——把左栏 width 改成 140,主区自动变窄.content 的 flex: 1 删掉,footer 立刻被拽到中间内容再少,footer 也被推到最底下。
十、Flex 属性速查表
把整章属性的取值归拢到两张表,背下来即可覆盖 90% 的实战。
| 属性 | 取值 | 作用 |
|---|---|---|
| flex-direction | row / row-reverse / column / column-reverse | 决定主轴方向 |
| flex-wrap | nowrap / wrap | 是否换行 |
| flex-flow | 上面两者简写 | 如 flex-flow: row wrap |
| justify-content | flex-start / flex-end / center / space-between / space-around / space-evenly | 主轴空间分配 |
| align-items | stretch / flex-start / flex-end / center / baseline | 交叉轴单行对齐 |
| align-content | 同 justify-content + stretch | 交叉轴多行分布(需 wrap) |
| gap | 长度值 | 项目间距(含换行后的行距) |
| 属性 | 取值 | 作用 |
|---|---|---|
| flex-grow | 数字(默认 0) | 剩余空间按份数伸展 |
| flex-shrink | 数字(默认 1) | 空间不足时按份数收缩 |
| flex-basis | 尺寸 / auto(默认 auto) | 主轴初始尺寸,优先于 width |
| flex | 1 / 0 0 auto 等简写 | 三兄弟一次写完 |
| order | 数字(默认 0) | 改变视觉顺序 |
| align-self | 同 align-items | 覆盖容器的交叉轴对齐 |
十一、本章小结
- 两根轴定乾坤:
justify-content管主轴、align-items管交叉轴;direction 一换,两轴跟着换。 - 容器六件套:
flex-direction、justify-content、align-items、flex-wrap、align-content(多行才生效)、gap。 - 项目四件套:
flex-grow(分剩余)、flex-shrink(压不足)、flex-basis(初始尺寸)、order(视觉排序),外加align-self(个人对齐)。 flex: 1=1 1 0:先清零再平分,等分布局首选。- 四大配方直接背:等宽导航
flex: 1;完美居中justify-content + align-items;圣杯固定宽 + flex: 1;沉底页脚column + flex: 1 + min-height。 - Flex 是一维布局;行 和 列要同时排,交给下一课的 Grid。