ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

读懂 freeCodeCamp 的 CSS 级联覆盖:Basic CSS 中「后续声明覆盖先前样式」的机制与实践

读懂 freeCodeCamp 的 CSS 级联覆盖:Basic CSS 中「后续声明覆盖先前样式」的机制与实践 读懂 freeCodeCamp 的 CSS 级联覆盖Basic 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 Styles in Subsequent CSSidbad87fee1348bd9aedf04756展开从一个具体的h1文本颜色冲突场景出发讲清楚 CSS 级联Cascade中后声明的样式规则覆盖先声明规则这一核心行为。读完本文你将掌握如何在同一个 HTML 元素上应用多个 CSS 类、理解声明顺序如何决定最终生效的样式、以及如何用getComputedStyle验证覆盖结果并可顺藤摸瓜理解该课程对选择器特异性specificity完整体系的教学设计。挑战背景从类覆盖元素声明到类与类之间的竞争该挑战位于 Basic CSS 块配置文件 所定义的练习序列中承接上一个挑战Prioritize One Style Over Another源文件。前一个挑战的结论是.pink-text类的声明覆盖了body元素上的color: green;即类选择器可以覆盖元素选择器对同一属性的声明。本挑战的题面frontmatter 见 挑战源文件紧接着提出下一个逻辑问题Ourpink-textclass overrode ourbodyelements CSS declaration! We just proved that our classes will override thebodyelements CSS. So the next logical question is, what can we do to override ourpink-textclass?我们的pink-text类覆盖了body元素的 CSS 声明我们已经证明了类可以覆盖body的 CSS。那么下一个问题是如何覆盖pink-text类挑战的初始代码seed如下style body { background-color: black; font-family: monospace; color: green; } .pink-text { color: pink; } /style h1 classpink-textHello World!/h1这段种子代码正是上一个挑战的参考答案三个层级的样式同时作用在页面上body的color: green元素选择器、.pink-text的color: pink类选择器而h1目前通过classpink-text呈现粉色。实操步骤创建blue-text类并叠加两个类题目的操作要求instructions包含三步创建一个名为blue-text的 CSS 类将元素文字颜色设为蓝色且必须声明在pink-text类之后在h1元素上同时应用blue-text类保留pink-text观察最终哪个颜色生效。关于给同一个元素挂多个类的 HTML 写法文档给出了标准语法——类名之间用空格分隔classclass1 class2这里有一条容易混淆但极为重要的知识点文档原文特别强调Note:It doesnt matter which order the classes are listed in the HTML element.类在 HTML 元素的class属性中出现的先后顺序无关紧要。真正起决定作用的是style部分中声明的书写顺序However, the order of theclassdeclarations in thestylesection is what is important. The second declaration will always take precedence over the first. Because.blue-textis declared second, it overrides the attributes of.pink-text.然而类声明在style中的顺序才是关键。第二个声明总会优先于第一个。由于.blue-text是第二个被声明的它覆盖了.pink-text的属性。这就是 CSS 级联中同等条件下后出现的规则覆盖先出现的规则的行为当.blue-text写在.pink-text之后且两者选择器特异性specificity相同时h1上color属性以.blue-text的blue为准。参考答案Solution挑战文件--solutions--段落给出的标准答案是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对比 seed 与 solution 的三点差异恰好对应题目三步新增.blue-text声明、位置放在.pink-text之后、h1的class属性变为pink-text blue-text。值得注意的是即便把h1上写成classblue-text pink-text结果依然相同——这再次印证HTML 中的类顺序不影响结果CSS 中的声明顺序才影响结果。验收逻辑如何用测试断言验证覆盖结果该挑战文件中的--hints--段落实际上就是自动判题所用的断言代码共四条从 DOM 结构到计算样式逐层验证值得作为自检清单复用// 1. h1 必须仍然带有 pink-text 类 assert.isTrue(document.querySelector(h1).classList.contains(pink-text)); // 2. h1 必须带有 blue-text 类 assert.isTrue(document.querySelector(h1).classList.contains(blue-text)); // 3. 两个类必须挂在同一个 h1 元素上 assert.isTrue(document.querySelector(.pink-text).classList.contains(blue-text)); // 4. h1 的最终计算颜色必须是纯蓝 rgb(0, 0, 255) const h1Element document.querySelector(h1); const color window.getComputedStyle(h1Element)[color]; assert.strictEqual(color, rgb(0, 0, 255));第 4 条断言是整个挑战的技术核心window.getComputedStyle()返回的是元素参与级联、继承、级联源优先级比较之后的最终生效值。blue关键字被浏览器规范化为rgb(0, 0, 255)——如果.blue-text没有真正覆盖.pink-text例如声明顺序写反该处取到的将是rgb(255, 192, 203)即pink的 RGB 值见上一挑战的同款断言。这种读计算样式而非读属性的验证方式正是验证级联结果的正确姿势。深入一层声明顺序只是级联规则的一半从源码结构看这个挑战并非孤立知识点而是课程对 CSS 级联体系的分层教学。在 basic-css.json 的练习顺序中本挑战前后各有紧密衔接的关卡顺序挑战标题对应文件验证的级联规则前一个Prioritize One Style Over Anotherbad87fee1348bd9aedf08756.md类选择器覆盖元素选择器特异性类 元素本挑战Override Styles in Subsequent CSSbad87fee1348bd9aedf04756.md特异性相同时后声明的类覆盖先声明的类源顺序后一个Override Class Declarations by Styling ID Attributesbad87fee1348bd8aedf06756.md#orange-textid 选择器无视声明位置覆盖所有类特异性id 类再下一个Override Class Declarations with Inline Stylesbad87fee1348bd9aedf06756.md行内style属性覆盖类声明特异性内联 id把这条线索串起来可以得到本挑战在完整级联优先级链中的准确定位内联 style 属性 #id 选择器 .class 类选择器 元素选择器如 body └── 同层级内部后声明者胜出本挑战验证的行为本挑战专门负责证明同一层级内部同为类选择器、特异性相同的胜负由声明顺序决定而它的下一个挑战id 覆盖类的题面甚至引用了本挑战的结论We just proved that browsers read CSS from top to bottom in order of their declaration. That means that, in the event of a conflict, the browser will use whichever CSS declaration came last. Notice that if we even had putblue-textbeforepink-textin ourh1elements classes, it would still look at the declaration order and not the order of their use!我们刚刚证明了浏览器按声明顺序自上而下读取 CSS。冲突时浏览器采用最后出现的声明。注意即使把blue-text写在h1类的pink-text之前浏览器看的仍是声明顺序而非使用顺序其 seed 代码直接复用本挑战的 solution 作为起点形成上一个挑战的答案 下一个挑战的起点的教学闭环。概念辨析三个顺序不要混淆基于本挑战的题面与断言设计可以把开发者最常踩的三个顺序坑梳理清楚HTMLclass属性中类名的书写顺序——classpink-text blue-text与classblue-text pink-text完全等价浏览器对class属性值按空格拆分后作为集合处理顺序无意义style中声明块的书写顺序——决定同特异性规则谁生效。本挑战要求.blue-text写在.pink-text之后若顺序写反getComputedStyle断言会取到rgb(255, 192, 203)pink而非rgb(0, 0, 255)blue挑战不通过style标签在文档中的出现顺序 / 样式表的引入顺序——从源码结构看本系列所有示例都只使用单个style块不涉及多样式表场景在多样式表工程中规则同样是特异性相同时后引入的样式表中出现的规则获胜本挑战验证的原则可以自然推广。文件结构与元数据速览作为 freeCodeCamp 课程内容文件本挑战的 Markdown 采用统一的分段约定字段定义可参考 挑战校验模式各段落职责如下YAML frontmatterid挑战唯一标识bad87fee1348bd9aedf04756、title、challengeType: 0交互式编码挑战、dashedName: override-styles-in-subsequent-css课程路由用的短横线命名、forumTopicId: 18253配套论坛主题编号# --description--题面背景交代上一个实验的结论并提出新问题# --instructions--操作指令含多类应用语法classclass1 class2与声明顺序注意点# --hints--判题断言4 条classList/getComputedStyle校验# --seed--/## --seed-contents--编辑器初始代码# --solutions--标准参考答案。小结本挑战用一个只有两个类的极简示例验证了 CSS 级联中最基础也最易被误用的规则特异性相同的声明之间书写在后的规则覆盖书写在前的规则且与类在 HTML 元素上的列出顺序无关。掌握这一行为后再结合课程后续的 id 选择器挑战、行内样式挑战即可完整构建元素 类 id 内联同级看顺序的覆盖优先级心智模型——这也是后续使用!important、CSS 变量、模块化样式方案时判断谁该赢的底层依据。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表