freeCodeCamp Basic-CSS 实战:用 id 选择器覆盖 Class 声明,理解 CSS 优先级机制

发布时间:2026/9/7 1:54:42
freeCodeCamp Basic-CSS 实战:用 id 选择器覆盖 Class 声明,理解 CSS 优先级机制 freeCodeCamp Basic-CSS 实战用 id 选择器覆盖 Class 声明理解 CSS 优先级机制【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp本篇基于 freeCodeCamp 课程中 basic-css 模块的实战练习 Override Class Declarations by Styling ID Attributes讲解当同一个元素同时命中多个 CSS 声明时的冲突裁决规则为什么后声明的 class会覆盖先声明的 class以及如何通过为元素添加id属性并编写#id选择器无条件地压过所有 class 级声明。读完后你将掌握 id 选择器的写法、class 声明顺序与 HTML 中使用顺序的区别并能用计算样式getComputedStyle验证覆盖结果。前置背景这条课程线的演进脉络该练习位于课程文件curriculum/structure/superblocks/responsive-web-design.json所定义的 Responsive Web Design 超级块下的 basic-css 区块是其中样式优先级三连击的中间一环。从 challengeOrder 的顺序 可以看到这条知识链Prioritize One Style Over Another源文件创建.pink-textclass 并应用到h1证明 class 声明可以覆盖body元素继承下来的color: green。Override Styles in Subsequent CSS源文件在.pink-text之后再声明.blue-text同时把两个 class 加到同一个h1上证明声明顺序靠后者获胜而与 HTML 中 class 的书写顺序无关。本篇Override Class Declarations by Styling ID Attributes进一步用#orange-textid 声明覆盖上述两个 class 的声明。本篇练习结束后课程还会继续讲解用内联 style 属性Override Class Declarations with Inline Styles和!importantOverride All Other Styles by using Important覆盖声明共同构成完整的优先级阶梯。而 id 选择器本身并非本篇首次出现——在更早的 Use an id Attribute to Style an Element 练习中已经建立了两个关键认知id 不可复用、只应用于一个元素id 的优先级specificity高于 class两者冲突时 id 的样式胜出。本篇正是在此基础上做的实战验证。核心概念回顾声明顺序决定 class 冲突的赢家练习文档开头的 description 部分首先回顾上一节的结论浏览器按 CSS 声明在style元素中的书写顺序自上而下读取冲突时采用最后声明的那条。这里有一个容易被忽视的细节即使我们在h1元素的 class 列表中把blue-text写在pink-text前面浏览器看的依然是声明顺序而不是它们被使用的顺序这一点与上一节练习中的 Note 呼应It doesnt matter which order the classes are listed in the HTML element. However, the order of theclassdeclarations in thestylesection is what is important.练习任务给 h1 添加 id 并编写 id 声明本篇练习的具体目标是把h1的文字变成橙色手段是绕开 class 声明顺序——给元素一个 id然后为这个 id 写 CSS 声明。文档给出的操作步骤如下给h1元素添加id属性值为orange-text。id 属性在 HTML 中的写法形如h1 idorange-text保留h1上原有的blue-text和pink-text两个 class不要移除。在style元素中为orange-text这个 id 创建 CSS 声明。id 选择器的语法是在 id 名前加#文档给出的示例#brown-text { color: brown; }按同样格式你需要写的是#orange-text { color: orange; }文档特别强调了一条关键规则也是本篇的题眼Note:无论你把这条 CSS 声明写在.pink-textclass 的上面还是下面都没有关系——因为id属性声明永远优先theidattribute will always take precedence。这意味着 id 声明的胜负与声明顺序解耦了这与上一节后声明者胜的 class 规则形成鲜明对比。种子代码与参考答案练习的起点是--seed--中给出的初始代码此时h1是蓝色.blue-text声明在后style body { background-color: black; font-family: monospace; color: green; } .pink-text { color: pink; } .blue-text { color: blue; } /style h1 classpink-text blue-textHello World!/h1完成练习后的参考答案--solutions--如下可以看到两处改动style中新增#orange-text声明以及h1标签上新增idorange-textstyle body { background-color: black; font-family: monospace; color: green; } .pink-text { color: pink; } .blue-text { color: blue; } #orange-text { color: orange; } /style h1 idorange-text classpink-text blue-textHello World!/h1注意两个 class 依然保留在元素上h1实际命中的声明有四条body继承色、.pink-text、.blue-text、#orange-text最终渲染为橙色正是 id 优先级高于 class 的直观证据。验收标准文档内置的自动化断言该练习文件以 frontmatter 标记区块--description--、--instructions--、--hints--、--seed--、--solutions--的结构组织其中--hints--区块内嵌了 7 条 JavaScript 断言构成了客观的验收标准。逐条拆解如下断言校验内容classList.contains(pink-text)h1必须仍带有pink-textclassclassList.contains(blue-text)h1必须仍带有blue-textclassgetAttribute(id) orange-texth1的 id 必须为orange-textlengthOf(queryAll(h1), 1)页面只能有一个h1元素assert.match(..., /#orange-text\s*{/gi)源码中必须存在#orange-text {声明先经removeCssComments去除注释再匹配notMatch(..., /h1.*style.*/gi)h1上不允许出现style属性——本篇禁用内联样式这条捷径getComputedStyle(h1)[color] rgb(255, 165, 0)计算样式必须是橙色rgb(255, 165, 0)即orange的标准 RGB 值最后一条断言特别值得玩味它不检查你写的是orange还是rgb(255, 165, 0)而是读取浏览器最终计算出的样式值。orange会被解析为rgb(255, 165, 0)所以两种写法都能通过但若 id 声明写错或被 class 覆盖导致颜色不是橙色断言立刻失败。配合第二条禁用style属性的断言这套检查保证了练习真正在验证用 id 声明覆盖 class 声明这一知识点而非其他取巧手段。优先级阶梯小结结合 basic-css 区块中这几道连续练习的实验结果从源码结构看课程的结论可以整理为如下优先级阶梯从高到低且高优先级与声明位置无关内联 style 属性 下一篇验证见 Override Class Declarations with Inline Styles !important 声明 Override All Other Styles by using Important id 选择器#orange-text ← 本篇验证无条件压过所有 class 声明 后声明的 class.blue-text Override Styles in Subsequent CSS同级 class 按声明顺序 先声明的 class.pink-text 元素选择器body 继承的 color: green本篇练习的价值在于用一次最小改动加一个 id、三条 CSS实证了阶梯中id 高于 class这一层并与前后练习形成可对照的实验序列同一元素、同一组冲突声明仅改变覆盖手段观察getComputedStyle读到的color值从rgb(0, 0, 255)蓝变为rgb(255, 165, 0)橙再在后续练习中变为rgb(255, 255, 255)白内联样式。需要说明的是freeCodeCamp 课程文档对id 永远优先于 class的表述是针对单一 id 对多个 class这一常见场景的教学简化完整的 CSS 规范优先级specificity计算还涉及属性选择器、伪类、多层选择器的叠加比较等可推断在后续更高级的课程模块中会进一步展开。就本篇练习而言掌握id 声明不受书写位置影响地覆盖 class 声明这一结论已足以应对绝大多数日常开发中的样式覆盖需求。延伸阅读路径Basic-CSS 区块结构与练习顺序使用 id 属性为元素添加样式前置练习用后续 CSS 声明覆盖样式上一环实验用内联样式覆盖 Class 声明下一环实验Responsive Web Design 超级块区块列表【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考