ARTICLE DETAIL

资讯详情

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

freeCodeCamp 课程详解:用 Bootstrap 栅格系统为 Cat Photo App 打造自定义标题栏

freeCodeCamp 课程详解:用 Bootstrap 栅格系统为 Cat Photo App 打造自定义标题栏 freeCodeCamp 课程详解用 Bootstrap 栅格系统为 Cat Photo App 打造自定义标题栏【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp这篇技术指南聚焦 freeCodeCamp 前端开发认证课程中 Bootstrap 模块的第 12 个练习“Create a Custom Heading”以仓库中该挑战的完整 Markdown 源文件curriculum/challenges/english/blocks/bootstrap/bad87fee1348bd9aede08845.md为核心展开。你将读懂该练习的关卡结构、响应式栅格原理、自动判题规则并拿到可直接运行的完整解法代码与扩展说明从而掌握用 Bootstrap 将「标题 图片」编排到同一行的标准做法。一、挑战背景在页面中编排一个自定义标题栏本次挑战所属的bootstrap代码块block位于Front End Development Libraries认证的第一个学习块。在 curriculum/structure/superblocks/front-end-development-libraries.json 中可以看到该认证按bootstrap → jquery → sass → react → redux → react-and-redux → front-end-development-libraries-projects的顺序组织课程内容。块级文件 curriculum/structure/blocks/bootstrap.json 中记录了 Bootstrap 模块的完整练习序列challengeOrder本次“Create a Custom Heading”位于第 12 位其上一关是“Use a span to Target Inline Elements”下一关是“Add Font Awesome Icons to our Buttons”。这意味着此时学习者已经掌握了container-fluid容器、row行、col-xs-*分栏、btn按钮与text-*文本工具类的基础用法。挑战的目标很直观为Cat Photo App页面做一个自定义页头——把应用标题与一张猫咪图片放进同一行。该块在学习环境中预置了 Bootstrap 3.3.7 的 CDN 样式{ dashedName: bootstrap, helpCategory: HTML-CSS, required: [ { link: https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.css } ], blockLayout: legacy-challenge-list }注意此处的blockLayout: legacy-challenge-list说明 Bootstrap 块使用经典「挑战列表」布局渲染这也是该块内练习保留了传统 HTML/内联编辑器交互形态的原因。二、关卡文件的结构解剖Front Matter 与四个标准段落每个课程挑战在仓库中都是一个 Markdown 文件正文由特殊标记切分为若干标准区块。本关卡的 YAML Front Matter 为--- id: bad87fee1348bd9aede08845 title: Create a Custom Heading challengeType: 0 forumTopicId: 16816 dashedName: create-a-custom-heading ---关键字段含义id挑战在课程数据库中的全局唯一标识是 bootstrap.json 中challengeOrder引用的主键challengeType: 0标识为html类型。可对照 packages/shared/src/config/challenge-types.ts 中const html 0的定义理解——HTML 类型挑战会以经典代码编辑器方式呈现并运行浏览器内 DOM 断言dashedName由标题派生的 URL 友好名用于链接定位forumTopicId历史遗留的论坛话题 ID。Front Matter 之后依次是四个# --xxx--标记段落--description--题目描述与练习目标--hints--自动判题的断言代码每一段 Hint 附带一段可执行的 JS 校验--seed--起点代码内含--seed-contents--子标记即编辑器初始渲染的 HTML--solutions--官方参考答案。这种「Markdown 描述 嵌入式断言」的格式是 freeCodeCamp 全部课程内容的统一存储规范字段的合法性由 curriculum/schema/challenge-schema.js 中的 Joi 校验规则约束。三、响应式栅格原理为什么是 row col-xs-8 col-xs-4--description--段落给出的核心知识点是 Bootstrap 的响应式栅格系统页面被划分为12 列通过把子元素放进.row行内、再为每个子元素指定相对宽度类如col-xs-8表示占 8/12 2/3 宽即可让元素横向并排Bootstrap 的绝大多数工具类都可以直接作用于div元素栅格类在移动优先mobile-first的 Bootstrap 3 中col-xs-*对额外小屏幕及以上所有尺寸生效——这也是本关只在col-xs-*前缀上做文章的原因col-xs-8与col-xs-4之和恰为 12标题与图片因此能严丝合缝地占据整行。具体任务只有一句话级别的操作却直接演示了栅格最核心的用法把「第一张图片」与h2一起嵌套进同一个div classrow其中h2放进div classcol-xs-8、图片放进div classcol-xs-4。描述中特意提示观察点图片此时会自动缩放到恰好适合文本并排的宽度——这是img-responsive类与分栏宽度的共同效果。四、起点代码看清你拿到手的状态--seed-contents--中呈现了编辑器初始代码源文件第 62–119 行link hrefhttps://fonts.googleapis.com/css?familyLobster relstylesheet typetext/css style h2 { font-family: Lobster, Monospace; } .thick-green-border { border-color: green; border-width: 10px; border-style: solid; border-radius: 50%; } /style div classcontainer-fluid h2 classtext-primary text-centerCatPhotoApp/h2 a href#img classimg-responsive thick-green-border srchttps://cdn.freecodecamp.org/curriculum/cat-photo-app/relaxing-cat.jpg altA cute orange cat lying on its back./a img srchttps://cdn.freecodecamp.org/curriculum/cat-photo-app/running-cats.jpg classimg-responsive altTuxedo cats running on dirt ground. div classrow div classcol-xs-4 button classbtn btn-block btn-primaryLike/button /div div classcol-xs-4 button classbtn btn-block btn-infoInfo/button /div div classcol-xs-4 button classbtn btn-block btn-dangerDelete/button /div /div pThings cats span classtext-dangerlove:/span/p ul licatnip/li lilaser pointers/li lilasagna/li /ul pTop 3 things cats hate:/p ol liflea treatment/li lithunder/li liother cats/li /ol form actionhttps://freecatphotoapp.com/submit-cat-photo labelinput typeradio nameindoor-outdoor Indoor/label labelinput typeradio nameindoor-outdoor Outdoor/label labelinput typecheckbox namepersonality Loving/label labelinput typecheckbox namepersonality Lazy/label labelinput typecheckbox namepersonality Crazy/label input typetext placeholdercat photo URL required button typesubmitSubmit/button /form /div起点代码值得注意的几个细节页面上存在两张猫图第一张relaxing-cat.jpg被包在a href#链接中并且叠加了自定义圆形绿边框类.thick-green-border第二张running-cats.jpg是独立的整行图片。描述中反复说“你的第一张图片 / topmost img”正是为了精确锁定嵌套在a中的那张图页面下方已经存在一个row其中三个按钮各占col-xs-4合计 12 列——这是一个可对照参考的“标准分栏范例”说明为何标题与图片也必须合计 12 列container-fluid提供全宽响应式容器h2目前使用text-primary蓝色与text-center居中工具类而这些排版类与栅格完全正交、可以自由组合。五、实现步骤与官方解法动手改动的范围极小仅需调整h2与其上方第一张图片的容器结构。逐步操作如下在container-fluid内部、现有h2 classtext-primary text-centerCatPhotoApp/h2的上方或包裹处新建div classrow在该row内新建div classcol-xs-8把h2元素移入其中在该row内再新建div classcol-xs-4把包含第一张图片的a href#img .../a整体移入其中确保两列宽度合计为 12并保证所有新增div标签都正确闭合。官方解法完整代码源文件第 121–182 行link hrefhttps://fonts.googleapis.com/css?familyLobster relstylesheet typetext/css style h2 { font-family: Lobster, Monospace; } .thick-green-border { border-color: green; border-width: 10px; border-style: solid; border-radius: 50%; } /style div classcontainer-fluid div classrow div classcol-xs-8 h2 classtext-primary text-centerCatPhotoApp/h2 /div div classcol-xs-4 a href#img classimg-responsive thick-green-border srchttps://cdn.freecodecamp.org/curriculum/cat-photo-app/relaxing-cat.jpg altA cute orange cat lying on its back./a /div /div img srchttps://cdn.freecodecamp.org/curriculum/cat-photo-app/running-cats.jpg classimg-responsive altTuxedo cats running on dirt ground. div classrow div classcol-xs-4 button classbtn btn-block btn-primaryLike/button /div div classcol-xs-4 button classbtn btn-block btn-infoInfo/button /div div classcol-xs-4 button classbtn btn-block btn-dangerDelete/button /div /div pThings cats span classtext-dangerlove:/span/p ul licatnip/li lilaser pointers/li lilasagna/li /ul pTop 3 things cats hate:/p ol liflea treatment/li lithunder/li liother cats/li /ol form actionhttps://freecatphotoapp.com/submit-cat-photo labelinput typeradio nameindoor-outdoor Indoor/label labelinput typeradio nameindoor-outdoor Outdoor/label labelinput typecheckbox namepersonality Loving/label labelinput typecheckbox namepersonality Lazy/label labelinput typecheckbox namepersonality Crazy/label input typetext placeholdercat photo URL required button typesubmitSubmit/button /form /div需要注意row与col-xs-*构成了新的 DOM 层级原先直接躺在container-fluid下的h2与第一张图片被整体“上移”进栅格结构中running-cats.jpg则保持原样留在行外继续以img-responsive独立换行显示。六、从 --hints-- 反推判题逻辑DOM 断言逐条拆解--hints--段落里的每段 JS 都是真实运行在浏览器环境中的断言它们精确刻画了“什么样的 DOM 结构才算过关”。逐条理解它们等于读懂了 freeCodeCamp 如何用document.querySelector校验嵌套结构Hint 1h2 与图片必须同处一个.row内const row document.querySelector(div.row); const h2 row?.querySelectorAll(:scope ${h2}) const image row?.querySelectorAll(:scope ${img}) assert.lengthOf(h2,1); assert.lengthOf(image ,1);querySelector(div.row)命中页面第一个div.row。注意页面中共有两个row——按钮行与本关新建的标题行由于 HTML 文档顺序这里的第一个row恰好是你新建的标题行因此标题与第一张图片必须出现在文档里更靠前的那个row中:scope限定只在当前row内部查找而非整页搜索assert.lengthOf(image, 1)要求该行内恰好出现一张img即图片必须被移进行而不是继续留在container-fluid层。Hint 2图片要放进col-xs-4且不得再嵌一层 divconst column document.querySelector(div.col-xs-4); const div column?.querySelectorAll(:scope ${div}); const img column?.querySelectorAll(:scope ${img}) assert.isEmpty(div); assert.lengthOf(img,1)页面里唯一的div.col-xs-4就是你新建的分栏按钮行里不存在col-xs-4之外的类组合事实上按钮行使用col-xs-4此处会命中按钮行中第一个col-xs-4……但要求该列不含任何嵌套 div且含恰好一张 img。为避免歧义官方解法的结构保证标题行先于按钮行出现querySelector命中第一个匹配节点因此按正确顺序编写即通过assert.isEmpty(div)强调列内不能有多余的包装div图片应直接位于该列下可经a包裹。Hint 3h2 放进col-xs-8同样不允许中间再套 divconst column document.querySelector(div.col-xs-8); const div column?.querySelectorAll(:scope ${div}); const h2 column?.querySelectorAll(:scope ${h2}) assert.isEmpty(div); assert.lengthOf(h2, 1);Hint 4标签闭合完整性assert.match(code,/\/div/g); assert.match(code,/div/g); assert.equal(code.match(/\/div/g).length,code.match(/div/g).length);这段断言面向源码文本而非 DOM统计源码中div与/div的出现次数并要求两者相等防止因漏写闭合标签造成隐性 HTML 结构错误——这正是本次新增两个嵌套div后最易犯的错误。七、放在更大图景中这一关在课程体系里的位置与复用价值从仓库结构看本文件只是 Bootstrap 模块 31 个练习之一curriculum/structure/blocks/bootstrap.json 的challengeOrder完整列出同目录下相邻文件如 bad87fee1348bd9aedc08845.md延续了同样的 Cat Photo App 项目逐步叠加 Font Awesome 图标、响应式单选/复选框、表单控件等。这种“同一项目反复迭代”的设计让每一关改动都很小、可验证性强。这一关沉淀的可复用技能点包括Bootstrap 3 栅格三分法col-xs-8col-xs-4或三个col-xs-4是“图标标题 缩略图”“侧栏 主内容”等布局的原型媒体类与容器组合img-responsive使图片宽度跟随分栏不超出父容器这是图片能“正好适配文本旁”的根本原因工具类正交组合text-primary text-center、.thick-green-border等类可与栅格类共存于同一元素互不干扰读懂断言式 Hintassert.lengthOf / assert.isEmpty / assert.equal组合出的 DOM 校验是课程后续所有 HTML/CSS/jQuery 挑战通用的判题语言。如果学习时遇到“Hint 不通过”优先检查目标元素是否在正确的父级里、是否嵌套了多余 div、闭合标签数量是否匹配。对课程贡献者与研究者而言若要在本地验证该文件的规范合法性可参考 curriculum/schema/challenge-schema.js 与同级测试对 Front Matter 与内容段的约束若需了解各挑战类型如何映射到渲染与提交流程可对照 packages/shared/src/config/challenge-types.ts 中viewTypes、submitTypes的映射表——challengeType: 0html对应classic视图与基于测试的提交方式与--hints--里那些浏览器内断言完全吻合。总之这一课麻雀虽小却完整串联了“栅格分栏 → DOM 嵌套 → 自动化断言”的 freeCodeCamp 前端教学闭环是理解经典前端教程如何把响应式布局拆解为可操作、可检验步骤的绝佳样本。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表