freeCodeCamp 课程解析:用 repeat() 函数简化 CSS Grid 轨道模板
freeCodeCamp 课程解析用 repeat() 函数简化 CSS Grid 轨道模板【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp本文基于 freeCodeCamp 课程中 CSS Grid 模块的挑战题《Reduce Repetition Using the repeat Function》完整讲解repeat()函数的语法、多值重复与混用规则并结合课程仓库中的种子代码、断言实现与挑战体系源码说明该挑战是如何被编写、校验和验证的。读完后可掌握用一行repeat()替代冗长轨道声明的写法并能理解课程平台对 CSS 类挑战的自动化验证机制。一、问题背景逐值声明轨道的维护成本课程原文先铺垫了一个前提在使用grid-template-columns和grid-template-rows定义网格结构时你需要为创建的每一行或每一列逐个写入一个值。这一前提在课程前一节 Add Columns with grid-template-columns 中就有体现.container { display: grid; grid-template-columns: 50px 50px; }该题的说明文字明确指出「传给grid-template-columns的参数个数表示网格的列数每个参数的值表示对应列的宽度」。由此引出repeat()要解决的问题假设你需要一个同样高度的 100 行网格逐个插入 100 个值显然不现实。repeat()函数提供了更优方案——先指定你想重复的次数接着是一个逗号再跟上要重复的值。课程给出的例子即创建一个 100 行、每行高 50px 的网格grid-template-rows: repeat(100, 50px);这行声明等价于手写 100 个50px但只需维护一个数字。列定义同理例如本挑战最终答案中的grid-template-columns: repeat(3, 1fr);二、进阶用法重复多个值与混排其他值repeat()不仅能重复单个值还可以重复一串值并且函数本身可以和其他值混排在同一条轨道声明中。课程原文给出了这个例子grid-template-columns: repeat(2, 1fr 50px) 20px;它等价展开为grid-template-columns: 1fr 50px 1fr 50px 20px;原文的 Note 特别强调1fr 50px这组值被重复了两次之后才接上20px——也就是说逗号之后的部分是一个整体值序列重复次数只作用于这个序列序列之外的值按原样保留。理解这一点就能解释课程中后续几个章节的进阶写法例如 Create Flexible Layouts Using auto-fill 中把重复次数替换为关键字auto-fill的repeat(auto-fill, minmax(60px, 1fr))以及 Limit Item Size Using the minmax Function 中把被重复的值换成函数minmax(90px, 1fr)——repeat()的第一个参数接受次数或auto-fill/auto-fit第二个参数位置接受任意轨道尺寸值含函数这是课程后面几节能够成立的语法基础。三、动手练习把 1fr 1fr 1fr 改写为 repeat(3, 1fr)挑战的题目要求原文 instructions是使用repeat去掉grid-template-columns中的重复。完整的初始编辑器代码如下即原文档的 seed 内容含 5 个彩色网格项style .item1 { background: LightSkyBlue; } .item2 { background: LightSalmon; } .item3 { background: PaleTurquoise; } .item4 { background: LightPink; } .item5 { background: PaleGreen; } .container { font-size: 40px; min-height: 300px; width: 100%; background: LightGray; display: grid; /* Only change code below this line */ grid-template-columns: 1fr 1fr 1fr; /* Only change code above this line */ grid-template-rows: 1fr 1fr 1fr; grid-gap: 10px; } /style div classcontainer div classitem11/div div classitem22/div div classitem33/div div classitem44/div div classitem55/div /div只需修改标记区域内的行官方标准答案原文档 solutions 段为style .container { grid-template-columns: repeat(3, 1fr); } /style这里1fr是可用空间份数单位。课程前一节 Use CSS Grid units to Change the Size of Columns and Rows 对此有定义fr把列或行设为可用空间的分数auto随内容自适应%按容器百分比计算。三个1fr等分的列用repeat(3, 1fr)表达后布局结果完全一致可读性更好。挑战的自动判分逻辑该挑战 hints 段给出的判分断言不是检查计算后的样式而是对源代码文本做正则匹配assert.match( code, /.container\s*?{[\s\S]*grid-template-columns\s*?:\s*?repeat\s*?\(\s*?3\s*?,\s*?1fr\s*?\)\s*?;[\s\S]*}/gi );这个正则逐段拆解即定位.container { ... }块要求其中存在grid-template-columns属性值部分允许任意空白\s*?且必须形如repeat(3, 1fr);。正则中大量\s*?说明判分对空格、换行不敏感——你写成repeat ( 3 , 1fr )也能通过。而对比前一节grid-template-columns挑战的断言方式则完全不同const templateColumns new __helpers.CSSHelp(document).getStyle( .container )?.gridTemplateColumns; assert.strictEqual(templateColumns, 100px 100px 100px);它通过__helpers.CSSHelp(document).getStyle(.container)读取 DOM 计算样式再精确比对。CSSHelp是平台注入到预览 iframe 的辅助类其宿主脚本可见于 frame.ts该文件注释还提到会给注入的样式元素加fcc-hide-header类使 CSSHelper 在测试时忽略这些样式避免误报。从源码结构看这类 CSS 挑战存在两种验证策略结果型比对计算样式适合像素级断言与文本型正则匹配源码适合必须使用某语法的练习目标。repeat这题选后者正是因为考点就是是否写出了repeat()本身。四、该挑战在课程中的位置与文件组织从课程结构文件 css-grid.json 看css-grid区块共 21 个挑战本挑战5a94fe3669fb03452672e45f位于第 18 位前后知识脉络清晰前面已铺垫创建网格、grid-template-columns/grid-template-rows、轨道单位fr/auto/%、grid-gap、grid-area紧随其后的是三个轨道模板函数/关键字系列minmax5a94fe4469fb03452672e460.md、auto-fill5a94fe5469fb03452672e461.md、auto-fit5a94fe6269fb03452672e462.md最后以媒体查询响应式布局与网格嵌套收尾。值得注意的是minmax题的种子代码正是把上一题的答案grid-template-columns: repeat(3, 1fr);作为起点再要求把其中的1fr替换为minmax(90px, 1fr)——章节之间形成了上一题答案即下一题初始代码的衔接repeat()是这一系列进阶写法的公共基座。在文件组织上每个挑战是一个带 YAML frontmatter 的 Markdown 文件按固定标题分节--description--、--instructions--、--hints--、--seed--、--solutions--。frontmatter 中的id、dashedName、forumTopicId、videoUrl等字段由课程解析管线消费challenge-parser 负责把这种 Markdown 结构解析成教学前端可用的挑战对象。本挑战 frontmatter 中的challengeType: 0表示常规编程题dashedName: reduce-repetition-using-the-repeat-function对应课程 URL 路径。五、要点小结语法repeat(次数, 值)中值可以是单值50px或值序列1fr 50px序列外还可在同一条声明中追加其他值等价性repeat(2, 1fr 50px) 20px≡1fr 50px 1fr 50px 20px重复次数只作用于逗号后的值序列本挑战答案grid-template-columns: repeat(3, 1fr);判分用正则匹配源码而非计算样式对空白不敏感进阶衔接repeat的第一个参数可换成auto-fill/auto-fit值位置可嵌套minmax()课程后三节即围绕这两点展开延伸阅读挑战源文件 5a94fe3669fb03452672e45f.md 本身即是完整教学材料配合 frame.ts 中的CSSHelp使用场景可完整理解 freeCodeCamp 如何把可运行的练习与可自动验证的断言组织在同一个 Markdown 文件中。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考