WinddSnow

CSS-Flexbox-Layout-Part1-Container-Properties

字数统计: 2.7k阅读时长: 10 min
2026/07/29

第26课:Flexbox 弹性布局(上)——容器属性:flex-directionflex-wrapjustify-contentalign-items

Flexbox 是 CSS 一维布局的终极方案。它让容器具备了控制子元素对齐、分布和尺寸的能力,彻底告别了浮动和表格布局的繁琐与 hack。Flexbox 的核心思想简单却强大:将容器划分为主轴交叉轴两条轴线,子元素沿主轴排列,沿交叉轴对齐。本节课将从零开始,深入剖析 Flex 容器上的六个核心属性——flex-directionflex-wrapflex-flowjustify-contentalign-itemsalign-content——并通过大量可运行示例帮助你建立直观的空间理解。


1. 开启 Flex 布局:display: flexdisplay: inline-flex

将一个元素设置为 Flex 容器,只需一行代码:

1
2
3
.container {
display: flex;
}

此时,该元素的所有直接子元素自动成为 Flex 项目,并开始遵循 Flex 布局规则。

容器自身行为 子元素行为 典型场景
display: flex 容器为块级元素(占满父容器宽度)。 子元素成为 Flex 项目。 独立的布局区域、页面区块。
display: inline-flex 容器为行内块元素(宽度由内容决定,可与其他元素同行)。 子元素同样成为 Flex 项目。 按钮组、标签组、内联的小型布局。
1
2
3
4
5
<div class="flex-container">
<div>项目 1</div>
<div>项目 2</div>
<div>项目 3</div>
</div>

一旦设置 display: flex,子元素的 floatclearvertical-align完全失效,因为它们不再处于正常文档流。


2. 主轴与交叉轴:理解 Flexbox 的坐标系

Flex 布局的所有属性都围绕两根轴线运作:

  • 主轴(Main Axis):Flex 项目沿着它排列的方向。由 flex-direction 定义。
  • 交叉轴(Cross Axis):与主轴垂直的方向。用于控制项目的对齐。
flex-direction 主轴方向 交叉轴方向
row(默认) 水平,左 → 右 垂直,上 → 下
row-reverse 水平,右 → 左 垂直,上 → 下
column 垂直,上 → 下 水平,左 → 右
column-reverse 垂直,下 → 上 水平,左 → 右

记忆技巧

  • rowcolumn 决定了文字的正常阅读方向。
  • -reverse 反转的是主轴的起止方向(项目排列顺序颠倒),交叉轴不变。
1
2
3
4
5
.container-row-reverse {
display: flex;
flex-direction: row-reverse;
/* 项目将从右到左排列,3, 2, 1 */
}

3. 换行控制:flex-wrap

默认情况下,Flex 项目强制单行排列,即使超出容器宽度也不会换行——它们会被压缩(伸缩)以适应单行。flex-wrap 改变这一行为。

行为
nowrap(默认) 不换行。所有项目压缩在一行内。
wrap 换行。当一行放不下时,项目换到下一行。
wrap-reverse 换行,但交叉轴方向反转(下一行出现在上一行的上方,而非下方)。
1
2
3
4
5
.container-wrap {
display: flex;
flex-wrap: wrap;
/* 若项目总宽度 > 容器宽度,自动换行 */
}

nowrap 的压缩行为:在 nowrap 模式下,即使设置了固定宽度,浏览器也会忽略项目的宽度限制,按比例压缩它们以适应容器。这是很多新手困惑的来源——项目宽度设了不生效。

3.1 flex-flowflex-directionflex-wrap 的简写

1
2
3
.container {
flex-flow: row wrap; /* 方向 + 换行 */
}

4. 主轴对齐:justify-content

justify-content 控制 Flex 项目在主轴上的整体分布。它定义的是剩余空间的分配方式

行为 视觉效果
flex-start 项目紧靠主轴起点排列。 所有项目向左(或向上)对齐。
flex-end 项目紧靠主轴终点排列。 所有项目向右(或向下)对齐。
center 项目居中于主轴。 项目聚集在中间,两侧等距。
space-between 第一个项目靠起点,最后一个项目靠终点,中间项目均匀分布,间距相等。 两端对齐,中间均分。
space-around 每个项目两侧的间距相等。项目之间的间距是边缘间距的两倍。 项目分散,边缘有空隙。
space-evenly 所有间距完全相等(包括项目之间以及项目与容器边缘之间)。 最均匀的分布,边缘间距等于项目间距。

注意space-betweenspace-aroundspace-evenly 仅在有剩余空间时生效。若项目总宽度超出容器,这些值无效果。

1
2
3
4
5
.navbar {
display: flex;
justify-content: space-between;
/* Logo 靠左,导航链接靠右,中间的空白自动分配 */
}

5. 交叉轴对齐:align-itemsalign-content

5.1 align-items:单行内所有项目的交叉轴对齐

align-items 设置每一行内所有 Flex 项目在交叉轴上的默认对齐方式。它影响单行内所有项目。

行为
stretch 默认值。项目拉伸以填满交叉轴高度(若未设固定高度)。
flex-start 项目紧靠交叉轴起点
flex-end 项目紧靠交叉轴终点
center 项目在交叉轴上居中
baseline 项目的文本基线对齐。
1
2
3
4
5
6
.container {
display: flex;
height: 200px;
align-items: center;
/* 所有项目垂直居中 */
}

stretch 的陷阱:只有当项目未显式设置高度时,它才会拉伸。一旦设了 height: 50pxstretch 不再生效。

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<style>
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 24px;
height: 64px;
background: #1a1a2e;
color: white;
}
.nav-links {
display: flex;
gap: 24px;
}
</style>

<nav class="navbar">
<div class="logo">🚀 MySite</div>
<div class="nav-links">
<a href="#">首页</a>
<a href="#">产品</a>
<a href="#">关于</a>
</div>
</nav>

6.2 响应式卡片网格:自动换行 + 均分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<style>
.card-grid {
display: flex;
flex-wrap: wrap;
gap: 20px;
padding: 20px;
}
.card {
flex: 1 1 250px;
padding: 24px;
background: #f9f9f9;
border-radius: 8px;
}
</style>

<div class="card-grid">
<div class="card">卡片 1</div>
<div class="card">卡片 2</div>
<div class="card">卡片 3</div>
<div class="card">卡片 4</div>
</div>

原理flex: 1 1 250px 让每张卡片最小宽度 250px,自动伸缩填满剩余空间,一行放不下时自动换行(下节课会详细讲解项目属性)。


课后练习

一、概念自测(选择题 / 填空题)

  1. (单选) justify-content: space-between 的效果是?
    A. 所有项目两端对齐,项目之间间距相等,边缘无间距。
    B. 所有项目均匀分布,项目之间及边缘间距相等。
    C. 所有项目靠主轴起点排列。
    D. 所有项目在主轴居中,两侧留白相等。

  2. (单选) align-content 在以下哪种情况下生效?
    A. 任意 Flex 容器。
    B. 仅当容器设置了 flex-wrap: wrap 且有多行项目时。
    C. 仅当容器高度固定时。
    D. 仅当 flex-direction: column 时。

  3. (填空) 要将主轴方向改为垂直且项目从下向上排列,应设置 flex-direction: ______

  4. (多选) 以下哪些属性用于 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-wrapgap 以及右侧元素的自动推进方式。

三、Agent 模式下的提示词示例

你是一个资深前端开发 Agent。请使用 Flexbox 构建一个响应式产品筛选栏组件。需要创建以下文件:

  1. index.html:包含筛选栏 HTML 结构——左侧的筛选标签组(使用 <ul><div> 包裹,内含 6 个 <button> 标签)和右侧的“排序” <select>
  2. styles/filter-bar.css:定义 .filter-bardisplay: flex; flex-wrap: wrap; align-items: center; gap: 8px;。右侧的排序组件使用 margin-left: auto 推到右端。在 @media (max-width: 640px) 中,让排序组件换行并取消 margin-left: auto(设置 margin-left: 0 或调整布局)。
  3. styles/global.css:引入盒模型重置和基础字体。
  4. 确保代码整洁、注释清晰。在 index.html 中正确引入 CSS 文件。

课后练习答案

一、概念自测答案

  1. A

    • 解析:space-between 使首尾项目贴边,中间项目均匀分布(边缘无间距)。B 描述的是 space-evenly
  2. B

    • 解析:align-content 仅在多行 Flex 容器中生效,即需要 flex-wrap: wrap 且实际产生多行。
  3. column-reverse

    • 解析:column-reverse 将主轴方向设为垂直,并将项目排列顺序反转(下 → 上)。
  4. A、B、D

    • 解析:justify-contentalign-itemsflex-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 提示词部分)

CATALOG
  1. 1. 第26课:Flexbox 弹性布局(上)——容器属性:flex-direction、flex-wrap、justify-content、align-items
    1. 1.1. 1. 开启 Flex 布局:display: flex 与 display: inline-flex
    2. 1.2. 2. 主轴与交叉轴:理解 Flexbox 的坐标系
    3. 1.3. 3. 换行控制:flex-wrap
      1. 1.3.1. 3.1 flex-flow:flex-direction 与 flex-wrap 的简写
    4. 1.4. 4. 主轴对齐:justify-content
    5. 1.5. 5. 交叉轴对齐:align-items 与 align-content
      1. 1.5.1. 5.1 align-items:单行内所有项目的交叉轴对齐
      2. 1.5.2. 5.2 align-content:多行时整组行的分布
    6. 1.6. 6. 综合示例:导航栏与卡片网格
      1. 1.6.1. 6.1 导航栏:Logo 左对齐,链接右对齐
      2. 1.6.2. 6.2 响应式卡片网格:自动换行 + 均分
    7. 1.7. 课后练习
      1. 1.7.1. 一、概念自测(选择题 / 填空题)
      2. 1.7.2. 二、AI 编程任务:编写面向 AI 的提示词
      3. 1.7.3. 三、Agent 模式下的提示词示例
    8. 1.8. 课后练习答案
      1. 1.8.1. 一、概念自测答案
      2. 1.8.2. 二、AI 编程任务参考答案(提示词示例)
      3. 1.8.3. 三、Agent 模式下的提示词示例