首页
/ 深入掌握 CSS Flexbox 的 justify-content 属性:从主轴概念到对齐实战(freeCodeCamp 挑战精讲)

深入掌握 CSS Flexbox 的 justify-content 属性:从主轴概念到对齐实战(freeCodeCamp 挑战精讲)

2026-09-07 14:13:14作者:乔或婵

本文以 freeCodeCamp 开源课程中《Align Elements Using the justify-content Property》挑战为骨架,系统讲解 Flexbox 布局的核心概念「主轴」以及主轴方向上的空间分配属性 justify-content 的六种取值语义,并结合真实挑战代码、课程结构与源码级校验机制,让读者既能写出可运行的对齐代码,也能理解这门课里每一道挑战是如何被自动判定的。读完本文,你将能够独立判断 row/column 容器中五个常用对齐值的细微差异,并能在任何 Flex 容器中正确选用它们。

背景:从「如何让元素并排」到「如何摆放多余空间」

在 freeCodeCamp 的 CSS Flexbox 课程中,前面的挑战解决了「如何把一个容器变成 Flex 容器」(设置 display: flex)以及「子元素沿哪个方向排列」(设置 flex-direction: row | column)。但当容器内部的 flex 子项(flex items)没有填满整个容器时,剩余空间如何处理、子项该如何对齐与分布,就成为下一个必须解决的问题——这正是 justify-content 属性的用武之地。

本挑战位于 css-flexbox 这一 legacy 课程块中,是该块的第 7 个挑战(共 17 个),其前后分别是:

整块课程的挑战顺序与 blockLayoutlegacy-challenge-list)定义在块结构文件 curriculum/structure/blocks/css-flexbox.json 中,属于 helpCategory: "HTML-CSS" 的响应式网页设计知识体系。

预备知识:认识主轴(main axis)

在深入取值之前,必须先理解 Flexbox 的一个核心术语——主轴(main axis)

  • 当 flex 容器被设为 row(行) 时,flex 子项从左到右水平排列,此时的主轴是一条横穿每个子项的水平线;
  • 当 flex 容器被设为 column(列) 时,flex 子项从上到下垂直堆叠,此时的主轴是一条经过各子项的垂直线。

justify-content 的全部作用,就是决定 flex 子项沿主轴这条直线上的分布方式。因此,同一个取值在 row 容器和 column 容器中表现方向不同:row 里表现为「左右」,column 里表现为「上下」。

justify-content 六种取值详解

本挑战文档明确列出了五个常用取值(其中 flex-start 是缺省默认行为)。下表完整归纳了它们的语义,读者可作为速查表使用:

取值 主轴上的对齐效果 row(行)容器直观表现 column(列)容器直观表现
flex-start 对齐到 flex 容器起点 子项全部靠容器左侧 子项全部靠容器顶部
flex-end 对齐到 flex 容器终点 子项全部靠容器右侧 子项全部靠容器底部
center 所有子项在容器内居中 子项水平居中 子项垂直居中
space-between 子项居主轴中线排布,多余空间分配在子项之间;首尾两个子项被顶到容器最边缘 第一个贴左边、最后一个贴右边,其余空间均匀分给中间的子项 第一个贴顶部、最后一个贴底部,中间子项间距均分
space-around space-between 类似,但首尾子项不被锁定在容器边缘;空间围绕每个子项分布,即容器两端各留「半份」空间 每个子项左右都有空隙,两端空隙为中间空隙的一半 每个子项上下都有空隙,两端为一半
space-evenly 在每个子项之间均匀分配空间,且容器两端也各留一整份空间 子项间距 = 首尾到边缘的距离 同上(垂直方向)

几点容易混淆的细节,需要格外注意:

  1. flex-start 是默认行为:如果不写 justify-content,flex 容器默认按 flex-start(现代规范下 justify-content 的初始值为 normal,其在 flex 容器中等同于 flex-start)排列子项,因此「内容靠左/靠上」本就是 Flexbox 的天然形态。
  2. space-betweenspace-around 的最大差异在两端:前者首尾子项紧贴容器边缘(两端空隙为 0),后者容器两端各留「半个子项间距」的空间;而 space-evenly 更进一步,让两端各保留「一整份」间距,使得任意相邻元素之间的间隙完全相等。三者的英文名称与其几何行为一一对应,是选择时最重要的判别依据。
  3. justify-content 只在主轴方向上生效;与之对应的交叉轴(cross axis) 对齐由另一个属性 align-items 负责(详见后续挑战 Align Elements Using the align-items Property)。

动手实战:让两个盒子在容器中居中

本挑战的题目非常直接:在 #box-container 元素上添加 CSS 属性 justify-content,并赋值为 center

初始代码(seed)

挑战在 --seed-contents-- 段中给出的初始 HTML/CSS 如下:

<style>
  #box-container {
    background: gray;
    display: flex;
    height: 500px;

  }
  #box-1 {
    background-color: dodgerblue;
    width: 25%;
    height: 100%;
  }

  #box-2 {
    background-color: orangered;
    width: 25%;
    height: 100%;
  }
</style>

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

在这个初始状态里,#box-container 是一个高 500px 的灰色 flex 容器,两个子项 #box-1(道奇蓝)与 #box-2(橙红)各占容器宽度的 25%、高度 100%。由于两个子项合计只占 50% 宽度,容器右侧会空出一大片未使用的空间——这正是观察 justify-content 效果的最佳场景。

通关答案(solution)

仓库中该挑战文件 --solutions-- 段保存的官方参考解为:在 #box-container 的规则中补上 justify-content: center;

<style>
  #box-container {
    background: gray;
    display: flex;
    height: 500px;
    justify-content: center;   /* 新增这一行 */
  }
  #box-1 {
    background-color: dodgerblue;
    width: 25%;
    height: 100%;
  }

  #box-2 {
    background-color: orangered;
    width: 25%;
    height: 100%;
  }
</style>

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

加入 justify-content: center 后,浏览器会把两个盒子视作一个整体在灰色容器内水平居中:蓝色盒子与左侧边缘、橙色盒子与右侧边缘的距离相等。剩余 50% 的空白被对称地分到左右两侧。

Bonus:逐一尝试其他取值

原挑战在说明中特别标注了 Bonus 练习:在代码编辑器中把 center 替换为其余取值,观察它们的差异。你可以自行把上述规则中的值分别换成 flex-startflex-endspace-betweenspace-aroundspace-evenly,肉眼对比下列预期结果:

  • flex-start:两个盒子贴回容器最左侧(恢复初始默认视觉);
  • flex-end:两个盒子被推到最右侧;
  • space-between:蓝色盒子贴最左、橙色盒子贴最右,中间 50% 空白成为二者间距;
  • space-around:蓝色盒子左边留半份、两个盒子中间留一份、橙色盒子右边留半份(首尾不贴边);
  • space-evenly:左边缘、两盒子之间、右边缘的空白完全相等(各 1/3 的剩余空间)。

需要留意的是,只有 center 是本挑战的唯一通过值;其余取值仅供你观察、理解,不会通过本关卡的自动检测(具体校验机制见下文)。

在真实场景中的第二次应用:Tweet Embed 挑战

为了让读者体会该属性在真实 UI 中的价值,css-flexbox 块的下一个挑战 Use the justify-content Property in the Tweet Embed 提供了一个仿 Twitter 推文组件的 header,其用户名区块 .profile-name 是一个 flex-direction: column 的列式 flex 容器,内部是 <h3>(用户名)与 <h4>(@账号)两行文本:

header .profile-name {
  display: flex;
  flex-direction: column;
  justify-content: center;   /* 官方参考解中补充的取值 */
  margin-left: 10px;
}

在该挑战中,justify-content 作用于 column 容器,效果转为「垂直方向」——center 会让两行文字在 .profile-name 块内上下居中,使文字与头像在视觉上对齐更工整。注意它的检测方式与上一个挑战不同:上一个挑战要求精确等于 center,而这个挑战允许你在 centerflex-startflex-endspace-betweenspace-aroundspace-evenly 六个值中任选其一,通过正则匹配源码中的 justify-content 声明来判定。这组对比很好地说明了 freeCodeCamp 对「概念掌握」与「唯一正确答案」两类题目的不同校验策略。

挑战如何被自动校验:源码视角

一道挑战要能够被自动判定对错,依赖的是挑战 Markdown 文件的 YAML 前置元数据(frontmatter)与 --hints-- 结构。以本挑战为例:

  • frontmatter 声明了挑战的 idtitlechallengeType: 0(普通代码挑战)、forumTopicIddashedName 等字段。所有字段的合法性与必填性都由课程 schema 校验器约束,例如 challengeType 必须是 0–33 的数字、id 必须是合法的 ObjectId,见 curriculum/schema/challenge-schema.js 中的 Joi 定义;其中 tests 数组要求每个测试对象必须包含 texttestString(见 challenge-schema.js)。
  • --hints--承载自动判定逻辑。本挑战只有一个 hint,其判定脚本是典型的 DOM 断言:在页面中查询 #box-container 元素,再用 window.getComputedStyle(...)['justify-content'] 读取浏览器实际计算后的样式值,最后断言它严格等于字符串 center
const boxContainer = document.querySelector('#box-container');
const justifyDirection =
  window.getComputedStyle(boxContainer)['justify-content'];
assert.strictEqual(justifyDirection, 'center');

这套机制意味着:即使学习者在 CSS 中写出视觉上「看起来居中」的等价方案(例如用 margin: 0 auto),只要计算后的 justify-content 值不是 center,判定依然失败——题目考察的正是对指定属性的精确运用。从源码结构推断,这类含代码编辑器的挑战在前端通过 iframe 运行学习者代码,再由上述测试脚本在页面上下文中执行断言(相关执行逻辑位于 client/src/templates/Challenges/utils/frame.ts 与执行 saga 等模块)。

  • --seed-contents-- 提供可编辑的初始代码,而 --solutions-- 保存官方参考解,供挑战审核与自动化流程(如课程快照测试、内容合法性检查)比对使用。

小结与常见误区

常见误区 正确理解
以为 justify-content 同时负责水平与垂直居中 它只作用于主轴方向;垂直/交叉轴对齐要用 align-items
混淆 space-betweenspace-around 前者首尾贴边(两端空隙为 0),后者首尾留半份空间
忘记 flex 容器才生效 元素必须先 display: flex(或 inline-flex)成为 flex 容器,justify-content 才作用于其子项
在 column 容器中用「左右」想象结果 column 的主轴是垂直的,取值表现为上下对齐

掌握 justify-content 的关键,是先建立「主轴」这一心智模型,再记住「between 两端贴边、around 两端半份、evenly 两端整份」这条几何记忆线。若想继续系统学习,可沿着 css-flexbox 块的后续挑战依次攻克 align-itemsflex-wrapflex-shrinkflex-growflex-basis 与简写属性 flexorderalign-self,逐步构建完整的 Flexbox 知识体系。

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