首页
/ 深入理解 freeCodeCamp Basic CSS 挑战:用 font-size 与元素选择器控制文字大小

深入理解 freeCodeCamp Basic CSS 挑战:用 font-size 与元素选择器控制文字大小

2026-09-07 22:45:03作者:董斯意

本篇以 freeCodeCamp 开源课程仓库中 Basic CSS 板块的「Change the Font Size of an Element」挑战(源文件)为线索,完整讲解 font-size 属性的语法、像素单位语义、元素类型选择器与类选择器的区别,并结合该挑战的 --description----hints----seed----solutions-- 四个源码区块,还原一门真实课程从题目到自动校验的完整设计。读完你可以独立读懂并完成这一关,同时理解 freeCodeCamp 的课程挑战文件是如何组织、被顺序编排并被自动化测试验证的。

一、挑战在 Basic CSS 板块中的定位

该挑战的文件名与挑战 ID 一致(bad87fee1348bd9aedf08806.md),存放于 curriculum/challenges/english/blocks/basic-css/ 目录。根据 basic-css 板块的顺序定义文件,它是「Basic CSS」板块的第 5 个挑战,紧随其后的话题链如下:

  1. Change the Color of Text
  2. Use CSS Selectors to Style Elements
  3. Use a CSS Class to Style an Element
  4. Style Multiple Elements with a CSS Class
  5. Change the Font Size of an Element(本篇主角)
  6. Set the Font Family of an Element
  7. Import a Google Font
  8. Specify How Fonts Should Degrade

可见这一关是「从文本颜色 → 选择器 → 类 → 字体大小 → 字体族」这条字体排版学习线上的关键一环:前面教你怎么选中元素并改颜色,这一关则第一次引入 CSS 的长度值概念(px),为后续「绝对单位与相对单位」「body 样式继承」等更抽象的话题做铺垫。整个板块的 helpCategoryHTML-CSS,是免费学习路径中面向零基础学习者的前端入门内容。

二、核心知识点:font-size 属性与像素值

挑战的 --description-- 区段开门见山给出结论:字体大小由 CSS 的 font-size 属性控制,并给出了一个标准语法示例:

h1 {
  font-size: 30px;
}

这里可以拆出两个概念:

  • font-size:CSS 中负责声明元素文本显示尺寸的属性,取值必须是一个长度值或关键字(如 smalllarge)。
  • 30pxpx(像素)是 CSS 中最常见的长度单位之一。在挑战的这一阶段,只要理解「px 后面的数字越大,文字越大」即可;关于长度单位体系的完整讨论被刻意留到了板块稍后的「Understand Absolute versus Relative Units」挑战中。

需要注意的是 font-size 的写法遵循 CSS 规则集的通用结构:选择器 + 一对花括号,花括号内是 属性名: 值; 的声明,且声明末尾的分号不能省略,否则同一规则块中后续声明可能无法被正确解析。

三、任务要求逐句解读

--instructions-- 给出的目标非常具体:

在包含 red-text 类的同一个 <style> 标签中,为 p 元素创建一条规则,并把 font-size 设为 16 像素(16px)。

拆解其意图:

  1. 选择器是 p(元素/类型选择器):而不是继续沿用上一关学到的 .red-text 类选择器。类选择器只作用于带有该 class 的元素,而元素选择器会命中页面中所有 <p> 标签——这正是任务措辞里没有写 .pp.red-text 的原因。注意 CSS 中元素选择器直接写标签名,不加前缀。
  2. 目标是所有段落:种子代码里既有带 red-text 类的段落(“Click here to view more...”),也有不带类的普通段落(“Things cats love:”等),所以用 p 元素选择器能一次性覆盖全部段落。
  3. 16px 是浏览器常见的默认正文字号:把它显式写出,是为了让学习者感知到「默认样式其实是一段可以被覆盖的 CSS 规则」。

四、从种子代码到参考答案:动手实践路径

挑战的 --seed-contents-- 区块提供了完整的初始 HTML,其中 <style> 区段长这样:

<style>
  .red-text {
    color: red;
  }
</style>

<h2 class="red-text">CatPhotoApp</h2>
<main>
  <p class="red-text">Click here to view more <a href="#">cat photos</a>.</p>
  ...
</main>

要在不破坏既有 .red-text 规则的前提下完成任务,正确的做法是在同一个 <style>追加一条元素选择器规则。仓库中 --solutions-- 区块给出的参考答案如下:

<style>
  .red-text {
    color: red;
  }
  p {
    font-size: 16px;
  }
</style>

<h2 class="red-text">CatPhotoApp</h2>
<main>
  <p class="red-text">Click here to view more <a href="#">cat photos</a>.</p>
  ...
</main>

这段参考代码与后续课程形成了直接的连续性:在下一个挑战「Set the Font Family of an Element」的 种子代码 中,<style> 区段里已经预设了 p { font-size: 16px; } 这条规则——也就是说,系统会默认你把上一关的成果保留下来,再在其基础上追加 font-family: monospace;。这解释了为什么每一关都要求「在同一个 <style> 标签内追加而非重写」:挑战是按递进累积的方式设计的,前一关的解法会作为下一关的起点。

五、源码级校验:--hints-- 到底在检查什么

这是全文件最值得研究的部分。--hints-- 区段给出了本题唯一的自动化断言:

assert.match(__helpers.removeCssComments(code), /p\s*{\s*font-size\s*:\s*16\s*px\s*;\s*}/i);

逐段解析:

  • code:指学习者在浏览器内置编辑器中写下的全部代码。
  • __helpers.removeCssComments(code):测试脚手架提供的辅助函数,先把 CSS 中的注释剥离掉,避免 /* p { font-size: 99px; } */ 这类被注释掉的代码干扰判断(注释里恰好含关键字时会造成误判或漏判)。
  • 正则 p\s*{\s*font-size\s*:\s*16\s*px\s*;\s*}:对空格完全不敏感,p{font-size:16px;}p { font-size : 16px ; } 都能通过;\s* 同时覆盖了换行,因此把规则写成多行也能匹配。
  • 结尾的 i 修饰符:大小写不敏感,FONT-SIZE 也能通过。
  • 断言只做源码级文本匹配,不检测任何 DOM 计算样式。因此它能保证「写了这样一条规则」,但规则是否真正生效(例如是否被更高优先级的规则覆盖)不在此关的检查范围内。

此外 --hints-- 的展示文案明确要求「浏览器与文本缩放应处于 100%」,这是因为 px 是绝对单位,若用户手动放大了页面字号,视觉比对(截图或计算样式校验)会因缩放而失真——这也是后续「相对单位」知识出现的一个伏笔。

六、从本关向外看:px 与单位体系

font-size: 16px 中的 px 并不是唯一可选单位。板块后续的「Understand Absolute versus Relative Units」挑战对长度单位做了系统总结:

  • 绝对单位:与物理长度挂钩,如 in(英寸)、mm(毫米);在屏幕上只是近似物理尺寸,且会因屏幕分辨率不同而有差异。
  • 相对单位:相对另一长度值计算,例如 em 以元素自身字体大小为基准——当你用它设置 font-size 时,它相对的是父元素font-sizerem 则始终相对根元素。
  • 该挑战的说明还特别注明:还有一批与视口大小绑定的相对单位,会在 Responsive Web Design Principles 部分另行讲解。

结合本关可以建立一条进阶路线:先用 px 理解「字号可被 CSS 规则显式控制」,再理解「像素是绝对单位、会受浏览器缩放影响」,最终过渡到 em/rem 等相对单位,写出真正响应式、可缩放友好的样式。

七、仓库视角:课程文件如何被组织与校验

从源码结构看,freeCodeCamp 把「题目」当作结构化数据来管理,每一个挑战 .md 都由 frontmatter 与若干带标记的区块组成。以本文件为例:

  • frontmatterid(全局唯一,也即文件名)、titlechallengeType(本关为 0,属于经典 HTML/CSS 编辑型挑战)、videoUrl(关联视频课)、forumTopicIddashedName(用于生成 URL 的短横线形式);
  • 区块--description--(题干说明)、--instructions--(操作指令)、--hints--(校验断言及提示)、--seed-- 下的 --seed-contents--(初始代码)、--solutions--(参考答案)。

而挑战的排列顺序并不由文件系统决定,而是集中在 curriculum/structure/blocks/basic-css.jsonchallengeOrder 数组里(本关 bad87fee1348bd9aedf08806 排在第 5 位),这保证了课程平台可按顺序渲染并实现上一关到下一关的进度串联。仓库的 curriculum/schema/ 下维护了挑战文件结构校验脚本,用于在 CI 中保证所有挑战的 frontmatter、区块与数据结构合法。

在自由练习场景中,建议你在浏览器控制台或本地编辑器中同时对照 --seed-contents----solutions-- 验证自己的写法,例如尝试把选择器误写成 .p(类选择器)或 p .red-text(后代选择器),再回看 --hints-- 的正则,观察哪种写法会被判定通过——这种「以测试用例反推实现」的思路,正是阅读本仓库其他模块代码时可迁移的方法论。

八、小结

「Change the Font Size of an Element」虽然只是一个入门级挑战,但它浓缩了 CSS 学习中的三个关键转折:第一次接触控制字号的 font-size 属性、第一次从类选择器切换到元素选择器、第一次显式使用像素长度单位。而藏在 --hints-- 中的那条正则断言,则是理解 freeCodeCamp 课程自动化校验机制的绝佳样例。顺着 basic-css.jsonchallengeOrder 继续往后走,你将依次掌握 font-family、Google Fonts 导入、字体降级策略、图片尺寸、边框圆角与盒模型——一条由浅入深、环环相扣的 CSS 入门路径就此展开。

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

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.13 K
2.75 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
857
1.35 K
docsdocs
暂无描述
Markdown
897
5.8 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
529
593
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
915
1.83 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.58 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.35 K
1.46 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.01 K
515
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
547
388