首页
/ freeCodeCamp 响应式网页设计课程精读:用 align-items 沿交叉轴对齐 Flex 子项

freeCodeCamp 响应式网页设计课程精读:用 align-items 沿交叉轴对齐 Flex 子项

2026-09-07 19:54:48作者:郜逊炳

align-items 是 CSS Flexbox 布局中负责沿**交叉轴(cross axis)**对齐子项的属性,与沿主轴工作的 justify-content 互为表里。本文以 freeCodeCamp 开源课程仓库中 “Align Elements Using the align-items Property” 一课(挑战文件 587d78ad367417b2b2512af8.md)为核心骨架,完整讲解主轴/交叉轴概念、五种取值的行为差异、align-items: center 的实战写法,并结合仓库源码说明该挑战在课程体系中的位置与自动校验机制,帮助读者掌握“一行 CSS 让内容垂直/水平居中”的核心能力。

课程定位:Flexbox 系列的第 9 步

freeCodeCamp 的课程采用“挑战(challenge)→ 块(block)→ 超级块(superblock)”三层组织方式。本挑战位于 css-flexbox 块中。根据块结构文件 css-flexbox.json(L38-L41),该挑战按顺序排在块内第 9 位,紧跟在 “Use the justify-content Property in the Tweet Embed”(id 587d78ac367417b2b2512af7)之后,并由下一题 “Use the align-items Property in the Tweet Embed”(id 587d78ad367417b2b2512af9)承接做实战演练。

而在更大的课程地图中,整个 css-flexbox 块隶属于响应式网页设计认证(Responsive Web Design)超级块,与 basic-html-and-html5、basic-css、css-grid 等块并列,见 responsive-web-design.json(L1-L11)。也就是说,这一课是 CSS 基础学习路径上的必修内容。

此外,该挑战的 front matter 中 challengeType: 0 对应 HTML 类编码型挑战。在共享配置 challenge-types.ts(L1)中可看到 const html = 0; 的定义,它决定了学习者在代码编辑器中编写 HTML/CSS 并通过测试的运行方式。

复习主轴,认识交叉轴

在动手写 align-items 之前,必须先厘清 Flexbox 的两条“轴”。课程在描述部分明确给出了定义:

  • 主轴(main axis):子项排列所沿的方向。flex-direction: row 时主轴是水平线;flex-direction: column 时主轴是垂直线。
  • 交叉轴(cross axis):与主轴垂直的另一条轴。行(row)布局中交叉轴为垂直方向;列(column)布局中交叉轴为水平方向。

上一课讲解的 justify-content 负责沿主轴分配与对齐子项:行布局中它控制左右位置(flex-start 靠左、center 居中、flex-end 靠右等)。而本课的 align-items 则负责沿交叉轴对齐子项:

  • 布局下,它决定整行子项在容器内如何上下分布;
  • 布局下,它决定全部子项在容器内如何左右分布。

一句话记忆:justify-content 管“顺排方向”,align-items 管“横切方向”。二者组合使用,即可实现任意方向上的居中。

align-items 的五个取值详解

课程原文给出五个核心取值。下表按“取值 → 行(row)布局效果 → 列(column)布局效果 → 语义”整理:

取值 行布局(交叉轴=垂直) 列布局(交叉轴=水平) 语义
flex-start 子项贴向容器顶部 子项贴向容器左侧 对齐到交叉轴起点
flex-end 子项贴向容器底部 子项贴向容器右侧 对齐到交叉轴终点
center 子项垂直居中(上下空间相等) 子项水平居中(左右空间相等) 对齐到交叉轴中间
stretch 子项被拉伸填满容器上到下 子项被拉伸填满容器左到右 默认值,未设置 align-items 时生效
baseline 文本基线对齐各子项 同左 让不同字号文字处于同一条“书写基线”上

其中需要注意两点:

  1. stretch 是默认行为:当子项没有显式设置交叉轴方向的尺寸(如行布局中未设置 height)时,Flexbox 默认会拉伸子项填满容器交叉轴空间。这就是为什么想让 stretch 失效、改用 center 或两端对齐时必须显式写 align-items
  2. baseline 是文本概念:基线可以理解为“字母坐在其上的那条线”。当各子项内文字字号不一致时,baseline 能避免因字号差异导致的错位,让首行文字对齐在同一条基线上。

动手实践:让两个盒子在 500px 高容器中垂直居中

课程练习题给出如下种子代码,目标是在灰色 Flex 容器中把两个不同大小的内容块垂直居中:

<style>
  #box-container {
    background: gray;
    display: flex;
    height: 500px;
  }
  #box-1 {
    background-color: dodgerblue;
    width: 200px;
    font-size: 24px;
  }

  #box-2 {
    background-color: orangered;
    width: 200px;
    font-size: 18px;
  }
</style>

<div id="box-container">
  <div id="box-1"><p>Hello</p></div>
  <div id="box-2"><p>Goodbye</p></div>
</div>

观察这段种子的关键细节:

  • #box-container 已设置 display: flex未设置 flex-direction,因此默认是 row,主轴水平、交叉轴垂直)和 height: 500px,给交叉轴留出了可分配的垂直空间;
  • 两个子项只定义了 width: 200px没有设置 height,高度由内容(<p> 文本)撑起,且字号不同(24px 与 18px),天然呈现“一高一矮”的姿态——这正是观察交叉轴对齐效果的好素材;
  • 若什么都不做,两个盒子会因默认的 stretch 行为而被拉伸至 500px 高。

解题步骤:在 #box-container 规则内补上 align-items: center;

<style>
  #box-container {
    background: gray;
    display: flex;
    height: 500px;
    align-items: center;
  }
  #box-1 {
    background-color: dodgerblue;
    width: 200px;
    font-size: 24px;
  }

  #box-2 {
    background-color: orangered;
    width: 200px;
    font-size: 18px;
  }
</style>

<div id="box-container">
  <div id="box-1"><p>Hello</p></div>
  <div id="box-2"><p>Goodbye</p></div>
</div>

执行后,两个盒子会恢复其内容高度,并在容器中垂直居中——即盒子上下两侧留出相等的空白。这就是官方解答(# --solutions-- 区块)给出的最终形态。

Bonus 建议:课程鼓励把 center 依次换成 flex-startflex-endstretchbaseline 观察差异:

  • flex-start:两盒贴到灰色容器顶部;
  • flex-end:两盒沉到容器底部;
  • stretch:两盒各自被拉满到 500px 高(此时视觉上内容差异消失,回归默认行为);
  • baseline:尽管字号不同,两盒内文字的“基线”会对齐在同一条水平线上。

自动校验机制:测试如何判定你写对了

本挑战的判定逻辑位于 # --hints-- 区块。它通过浏览器运行以下断言:

const boxContainer = document.querySelector('#box-container');
const alignment = window.getComputedStyle(boxContainer)['align-items'];
assert.strictEqual(alignment, 'center');

测试流程分三步:先用 querySelector('#box-container') 定位到目标 Flex 容器;再用 window.getComputedStyle(...) 读取其最终生效的 align-items 计算值(即浏览器完成 CSS 层叠计算后的真实值);最后用 strictEqual 精确断言该值必须等于字符串 'center'

由此可以提炼两点实战认知:

  1. 测试检查的是计算样式(computed style),因此任何能让最终计算值等于 center 的合法写法(直接写在 #box-container 上、写在 * 通配符上等)都能通过,但课程练习通常要求直接改目标元素;
  2. 只有 center 能通过本挑战,这正是把“其他取值当作 Bonus 自由探索”的原因——先掌握标准答案,再横向比较差异。

freeCodeCamp 对挑战文件的结构合法性有一套 Joi 校验体系(见 challenge-schema.js,其中对 challengeTypedashedNamevideoUrlforumTopicId 等字段均有约束),保证每个挑战的格式稳定、可被课程构建系统可靠解析与运行。

从课堂走向真实 UI:在 Tweet Embed 中应用

学会语法之后,课程立刻安排了实战延伸——“Use the align-items Property in the Tweet Embed”(587d78ad367417b2b2512af9.md)。该挑战要求把 Twitter 风格卡片顶部的 .follow-btn 设为 display: flex 后加上 align-items: center;,从而让 “Follow” 按钮内部的文本在按钮内垂直居中:

header .follow-btn {
  display: flex;
  align-items: center;
  margin: 0 0 0 auto;
}

这是一个非常典型的生产场景:当元素既设置了 display: flex 又不希望子内容被 stretch 拉高时,align-items: center 能实现单行文本的完美垂直居中。在实际布局中,凡是要对“图标 + 文字”“头像 + 按钮”“文本行 + 徽章”这类内容做垂直居中,align-items: center 几乎都是首选方案。

延伸阅读:与 align-self 的关系

css-flexbox 块的最后一个挑战是 “Use the align-self Property”(id 587d78af367417b2b2512b00,见 css-flexbox.json L70-L73)。它揭示了同一体系的另一面:align-items 是一次性作用于容器内所有子项的交叉轴对齐规则,而 align-self 允许某个单独子项覆盖这条规则、拥有自己的交叉轴对齐方式。两者取值一一对应,理解本课的取值语义后,学习 align-self 将毫无障碍。

小结

通过本课可以带走三条核心经验:

  1. justify-contentalign-items 各管一条轴——前者沿主轴、后者沿交叉轴,组合使用可实现任意方向居中;
  2. align-itemsflex-start / flex-end / center / stretch / baseline 五个取值,默认值是 stretch,想让子项保持内容尺寸并精准对齐必须显式声明;
  3. 当容器 flex-direction 改变时,两条轴随之互换(row 的交叉轴是垂直方向,column 的交叉轴是水平方向),判断取值效果前先确认当前主轴方向。

将上述结论放进 freeCodeCamp 的完整 Flexbox 学习序列中继续实践——先掌握语法与值,再在 Tweet Embed 等真实组件中打磨手感,最后用 align-self 实现单子项的精细微调,你就能系统掌握 Flexbox 的对齐体系。

登录后查看全文
热门项目推荐
相关项目推荐