第26课:Flexbox 弹性布局(上)——容器属性:flex-direction、flex-wrap、justify-content、align-items
Flexbox 是 CSS 一维布局的终极方案。它让容器具备了控制子元素对齐、分布和尺寸的能力,彻底告别了浮动和表格布局的繁琐与 hack。Flexbox 的核心思想简单却强大:将容器划分为主轴和交叉轴两条轴线,子元素沿主轴排列,沿交叉轴对齐。本节课将从零开始,深入剖析 Flex 容器上的六个核心属性——flex-direction、flex-wrap、flex-flow、justify-content、align-items 和 align-content——并通过大量可运行示例帮助你建立直观的空间理解。
1. 开启 Flex 布局:display: flex 与 display: inline-flex
将一个元素设置为 Flex 容器,只需一行代码:
1 | .container { |
此时,该元素的所有直接子元素自动成为 Flex 项目,并开始遵循 Flex 布局规则。
| 值 | 容器自身行为 | 子元素行为 | 典型场景 |
|---|---|---|---|
display: flex |
容器为块级元素(占满父容器宽度)。 | 子元素成为 Flex 项目。 | 独立的布局区域、页面区块。 |
display: inline-flex |
容器为行内块元素(宽度由内容决定,可与其他元素同行)。 | 子元素同样成为 Flex 项目。 | 按钮组、标签组、内联的小型布局。 |
1 | <div class="flex-container"> |
一旦设置 display: flex,子元素的 float、clear、vertical-align 将完全失效,因为它们不再处于正常文档流。
2. 主轴与交叉轴:理解 Flexbox 的坐标系
Flex 布局的所有属性都围绕两根轴线运作:
- 主轴(Main Axis):Flex 项目沿着它排列的方向。由
flex-direction定义。 - 交叉轴(Cross Axis):与主轴垂直的方向。用于控制项目的对齐。
flex-direction 值 |
主轴方向 | 交叉轴方向 |
|---|---|---|
row(默认) |
水平,左 → 右 | 垂直,上 → 下 |
row-reverse |
水平,右 → 左 | 垂直,上 → 下 |
column |
垂直,上 → 下 | 水平,左 → 右 |
column-reverse |
垂直,下 → 上 | 水平,左 → 右 |
记忆技巧:
row和column决定了文字的正常阅读方向。-reverse反转的是主轴的起止方向(项目排列顺序颠倒),交叉轴不变。
1 | .container-row-reverse { |
3. 换行控制:flex-wrap
默认情况下,Flex 项目强制单行排列,即使超出容器宽度也不会换行——它们会被压缩(伸缩)以适应单行。flex-wrap 改变这一行为。
| 值 | 行为 |
|---|---|
nowrap(默认) |
不换行。所有项目压缩在一行内。 |
wrap |
换行。当一行放不下时,项目换到下一行。 |
wrap-reverse |
换行,但交叉轴方向反转(下一行出现在上一行的上方,而非下方)。 |
1 | .container-wrap { |
nowrap 的压缩行为:在 nowrap 模式下,即使设置了固定宽度,浏览器也会忽略项目的宽度限制,按比例压缩它们以适应容器。这是很多新手困惑的来源——项目宽度设了不生效。
3.1 flex-flow:flex-direction 与 flex-wrap 的简写
1 | .container { |
4. 主轴对齐:justify-content
justify-content 控制 Flex 项目在主轴上的整体分布。它定义的是剩余空间的分配方式。
| 值 | 行为 | 视觉效果 |
|---|---|---|
flex-start |
项目紧靠主轴起点排列。 | 所有项目向左(或向上)对齐。 |
flex-end |
项目紧靠主轴终点排列。 | 所有项目向右(或向下)对齐。 |
center |
项目居中于主轴。 | 项目聚集在中间,两侧等距。 |
space-between |
第一个项目靠起点,最后一个项目靠终点,中间项目均匀分布,间距相等。 | 两端对齐,中间均分。 |
space-around |
每个项目两侧的间距相等。项目之间的间距是边缘间距的两倍。 | 项目分散,边缘有空隙。 |
space-evenly |
所有间距完全相等(包括项目之间以及项目与容器边缘之间)。 | 最均匀的分布,边缘间距等于项目间距。 |
注意:space-between、space-around、space-evenly 仅在有剩余空间时生效。若项目总宽度超出容器,这些值无效果。
1 | .navbar { |
5. 交叉轴对齐:align-items 与 align-content
5.1 align-items:单行内所有项目的交叉轴对齐
align-items 设置每一行内所有 Flex 项目在交叉轴上的默认对齐方式。它影响单行内所有项目。
| 值 | 行为 |
|---|---|
stretch |
默认值。项目拉伸以填满交叉轴高度(若未设固定高度)。 |
flex-start |
项目紧靠交叉轴起点。 |
flex-end |
项目紧靠交叉轴终点。 |
center |
项目在交叉轴上居中。 |
baseline |
项目的文本基线对齐。 |
1 | .container { |
stretch 的陷阱:只有当项目未显式设置高度时,它才会拉伸。一旦设了 height: 50px,stretch 不再生效。
5.2 align-content:多行时整组行的分布
当容器有多行(flex-wrap: wrap 且实际产生了多行),align-content 控制这些行在交叉轴上的分布——与 justify-content 控制主轴方向类似,只是作用在交叉轴的“行组”上。
前提:必须有多行,且容器有足够的交叉轴空间。单行 flex 容器中 align-content 无效。
| 值 | 行为 |
|---|---|
stretch |
默认值。各行拉伸以平均填满交叉轴空间。 |
flex-start |
各行紧靠交叉轴起点。 |
flex-end |
各行紧靠交叉轴终点。 |
center |
各行在交叉轴上居中。 |
space-between |
第一行靠起点,最后一行靠终点,中间各行均分。 |
space-around |
每行两侧间距相等。 |
space-evenly |
所有间距完全相等。 |
对比总结:
| 属性 | 作用对象 | 作用方向 | 前置条件 |
|---|---|---|---|
justify-content |
Flex 项目 | 主轴 | 无特殊条件。 |
align-items |
单行内 Flex 项目 | 交叉轴 | 无特殊条件。 |
align-content |
多行(行组) | 交叉轴 | flex-wrap: wrap 且产生多行。 |
6. 综合示例:导航栏与卡片网格
6.1 导航栏:Logo 左对齐,链接右对齐
1 | <style> |
6.2 响应式卡片网格:自动换行 + 均分
1 | <style> |
原理:flex: 1 1 250px 让每张卡片最小宽度 250px,自动伸缩填满剩余空间,一行放不下时自动换行(下节课会详细讲解项目属性)。
课后练习
一、概念自测(选择题 / 填空题)
(单选)
justify-content: space-between的效果是?
A. 所有项目两端对齐,项目之间间距相等,边缘无间距。
B. 所有项目均匀分布,项目之间及边缘间距相等。
C. 所有项目靠主轴起点排列。
D. 所有项目在主轴居中,两侧留白相等。(单选)
align-content在以下哪种情况下生效?
A. 任意 Flex 容器。
B. 仅当容器设置了flex-wrap: wrap且有多行项目时。
C. 仅当容器高度固定时。
D. 仅当flex-direction: column时。(填空) 要将主轴方向改为垂直且项目从下向上排列,应设置
flex-direction: ______。(多选) 以下哪些属性用于 Flex 容器(而非 Flex 项目)?
A.justify-content
B.align-items
C.flex-grow
D.flex-wrap
二、AI 编程任务:编写面向 AI 的提示词
场景:你需要实现一个响应式产品筛选栏。要求如下:
- 左侧为“筛选条件”标签组(使用
flex-wrap: wrap),每个标签为一个按钮,之间有 8px 间距。 - 右侧为“排序”下拉按钮,使用
margin-left: auto自动推到最右端。 - 在小屏幕(< 640px)下,右侧按钮自动换到下一行并靠左对齐。
- 整体筛选栏使用 Flexbox 布局,无 JavaScript。
任务要求:请写出一段完整的中文提示词,发送给 AI,使其生成符合上述要求的 HTML + CSS 代码。提示词中需明确指定 Flex 容器属性、flex-wrap、gap 以及右侧元素的自动推进方式。
三、Agent 模式下的提示词示例
你是一个资深前端开发 Agent。请使用 Flexbox 构建一个响应式产品筛选栏组件。需要创建以下文件:
index.html:包含筛选栏 HTML 结构——左侧的筛选标签组(使用<ul>或<div>包裹,内含 6 个<button>标签)和右侧的“排序”<select>。styles/filter-bar.css:定义.filter-bar为display: flex; flex-wrap: wrap; align-items: center; gap: 8px;。右侧的排序组件使用margin-left: auto推到右端。在@media (max-width: 640px)中,让排序组件换行并取消margin-left: auto(设置margin-left: 0或调整布局)。styles/global.css:引入盒模型重置和基础字体。- 确保代码整洁、注释清晰。在
index.html中正确引入 CSS 文件。
课后练习答案
一、概念自测答案
A
- 解析:
space-between使首尾项目贴边,中间项目均匀分布(边缘无间距)。B 描述的是space-evenly。
- 解析:
B
- 解析:
align-content仅在多行 Flex 容器中生效,即需要flex-wrap: wrap且实际产生多行。
- 解析:
column-reverse- 解析:
column-reverse将主轴方向设为垂直,并将项目排列顺序反转(下 → 上)。
- 解析:
A、B、D
- 解析:
justify-content、align-items、flex-wrap均为容器属性。flex-grow是项目属性。
- 解析:
二、AI 编程任务参考答案(提示词示例)
示例提示词:
“请使用 Flexbox 生成一个产品筛选栏。要求:
- 容器
.filter-bar使用display: flex; flex-wrap: wrap; align-items: center; gap: 8px;。- 左侧筛选标签组(6 个
<button>),每两个标签之间间距由gap控制。- 右侧排序下拉框使用
margin-left: auto推到最右端。- 在
@media (max-width: 640px)中,让右侧排序下拉框换到下一行,并设置margin-left: 0使其靠左对齐。- HTML 和 CSS 均需完整、可直接运行。代码注释说明关键布局逻辑。”
三、Agent 模式下的提示词示例
(见上文 Agent 提示词部分)