<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Web - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ freeCodeCamp 是一个免费学习编程的开发者社区，涵盖 Python、HTML、CSS、React、Vue、BootStrap、JSON 教程等，还有活跃的技术论坛和丰富的社区活动，在你学习编程和找工作时为你提供建议和帮助。 ]]>
        </description>
        <link>https://www.freecodecamp.org/chinese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Web - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/chinese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Thu, 04 Jun 2026 20:19:22 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/chinese/news/tag/web/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Ep. 11 琚致远：多一份踏实和耐心，解锁技术旅程中更多可能性 ]]>
                </title>
                <description>
                    <![CDATA[ 2019 年的夏天，我用文字的形式采访了致远。那时候他刚大学毕业，他说自己正在努力成为一名优秀的 Web 全栈工程师，希望自己未来可以踏踏实实，继续做自己喜欢的事情，在此前提下，能够鼓励、帮助身边的人自我实现。 这个 9 月，我邀请他作为播客嘉宾，聊聊他的学习、工作和生活，发现他这几年确实持续着这种状态：踏实地做喜欢的事情，也为他人提供帮助，不仅是一位优秀的开发者，也逐渐成为经验丰富的创业者。 琚致远致远在 7 岁时接触计算机，小学、中学时自学编程，还尝试写程序帮助老师管理资料。在大学期间他带着同学一起承接技术项目，逐渐熟悉项目管理流程。他也帮助同学们学习编程，比如推荐他们使用 freeCodeCamp 的课程学习 Web 开发。 在经历了去德国做交换生、加入海外远程开发团队和网易研究院工作之后，他进入一个全球化的创业公司，担任  global team leader，也维护这个公司捐赠给 Apache 软件基金会的开源 API 网关项目 APISIX。 在节目中，致远聊到他如何适应从工程师转做客户支持，如何平衡商业和开源，以及给印度开发者捐赠最新款的苹果电脑，这些丰富的体验给 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/interview-ju-zhi-yuan-web-developer-unlock-possibilities-in-tech/</link>
                <guid isPermaLink="false">6515bc9a64289f03e60ed6e0</guid>
                
                    <category>
                        <![CDATA[ 播客 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 开源 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miya Liu ]]>
                </dc:creator>
                <pubDate>Thu, 28 Sep 2023 13:00:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2023/09/Chinese-3.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>2019 年的夏天，我用文字的形式采访了致远。那时候他刚大学毕业，他说自己正在努力成为一名优秀的 Web 全栈工程师，希望自己未来可以踏踏实实，继续做自己喜欢的事情，在此前提下，能够鼓励、帮助身边的人自我实现。</p><p>这个 9 月，我邀请他作为播客嘉宾，聊聊他的学习、工作和生活，发现他这几年确实持续着这种状态：踏实地做喜欢的事情，也为他人提供帮助，不仅是一位优秀的开发者，也逐渐成为经验丰富的创业者。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2023/09/WechatIMG140.jpeg" class="kg-image" alt="WechatIMG140" srcset="https://chinese.freecodecamp.org/news/content/images/size/w600/2023/09/WechatIMG140.jpeg 600w, https://chinese.freecodecamp.org/news/content/images/size/w1000/2023/09/WechatIMG140.jpeg 1000w, https://chinese.freecodecamp.org/news/content/images/2023/09/WechatIMG140.jpeg 1080w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>琚致远</figcaption></figure><!--kg-card-begin: html--><iframe width="100%" height="180" frameborder="no" scrolling="no" seamless="" src="https://share.transistor.fm/e/ea96fb9e" title="嵌入内容" loading="lazy"></iframe><!--kg-card-end: html--><p>致远在 7 岁时接触计算机，小学、中学时自学编程，还尝试写程序帮助老师管理资料。在大学期间他带着同学一起承接技术项目，逐渐熟悉项目管理流程。他也帮助同学们学习编程，比如推荐他们使用 freeCodeCamp 的课程学习 Web 开发。</p><p>在经历了去德国做交换生、加入海外远程开发团队和网易研究院工作之后，他进入一个全球化的创业公司，担任 &nbsp;global team leader，也维护这个公司捐赠给 Apache 软件基金会的开源 API 网关项目 APISIX。</p><p>在节目中，致远聊到他如何适应从工程师转做客户支持，如何平衡商业和开源，以及给印度开发者捐赠最新款的苹果电脑，这些丰富的体验给我挺多启发，也让我想起 4 年前我在那篇访谈文章里写的：淡泊明志，宁静致远，愿我们始终年轻。</p><p>希望你也喜欢这期节目，期待你把致远的故事分享给更多朋友，当然也欢迎你给我们发邮件分享自己的故事。你可以在<a href="https://www.freecodecamp.org/chinese/news/freecodecamp-podcast-in-chinese/">这篇文章</a>里找到我们的邮箱地址。</p><p>欢迎在 <a href="https://chinese.freecodecamp.org/">https://chinese.freecodecamp.org/</a> 查看更多免费的编程学习资源。</p><h2 id="-"><strong>更多关于嘉宾的信息</strong></h2><ul><li><a href="https://github.com/juzhiyuan">GitHub</a></li><li><a href="https://juzhiyuan.me/">博客</a></li></ul><h2 id="--1"><strong>主要话题</strong></h2><ul><li>04:06 小学初中自学编程</li><li>05:33 脚本小子找回被盗的 QQ</li><li>06:39 投入 Web 开发</li><li>08:39 第一个正式个人项目</li><li>12:12 大学两年赚 20 多万</li><li>13:06 组建小型远程开发团队</li><li>15:32 怎么使用这么多钱</li><li>18:25 教同学们学 Web 开发</li><li>20:35 去德国做交换生</li><li>22:20 家庭的支持</li><li>24:57 不适应网易研究院的安逸节奏</li><li>26:39 在远程团队拓展技术</li><li>29:29 给 Ant Design 做贡献</li><li>31:59 为 APISIX 贡献 dashboard</li><li>36:28 从开源贡献者到创业伙伴</li><li>37:48 基于开源项目做企业版</li><li>39:25 如何进入 Apache 软件基金会</li><li>44:32 成为年纪最小的 Apache Member</li><li>46:38 在基金会中的收获</li><li>51:31 离用户最近</li><li>56:25 工程师转做客户支持</li><li>58:19 全球团队每周只开会半小时</li><li>60:38 平衡开源和商业利益</li><li>64:29 给印度开发者捐赠 MacBook</li><li>66:26 做好 2B 产品</li><li>71:23 参与进去</li></ul><h2 id="--2"><strong>提到的资源</strong></h2><ul><li>《琚致远：优秀 Web 全栈工程师的成长之路》(<a href="https://www.freecodecamp.org/chinese/news/fcc-devtalk-ju-zhi-yuan-growth-path-of-an-excellent-full-stack-web-developer/">https://www.freecodecamp.org/chinese/news/fcc-devtalk-ju-zhi-yuan-growth-path-of-an-excellent-full-stack-web-developer/</a>)</li><li><a href="https://ant.design/">Ant Design</a></li><li><a href="https://www.apache.org/">Apache 软件基金会</a></li><li><a href="https://apisix.apache.org/zh/">Apache APISIX</a></li><li><a href="https://api7.ai">API7.ai</a></li><li><a href="https://juzhiyuan.me/p/b2b-startup-customers-want-solutions">B2B Startup: Customers Want Solutions Than Software</a></li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 28关学会HTML与HTML5基础 ]]>
                </title>
                <description>
                    <![CDATA[ 「经历」 我自学前端已经有 6 年多了，自问当时学前端是没有系统化学习的。一开始边看文档，连滚带爬学 HTML 和 CSS 排版，然后深入研究 JavaScript，因为当时最火的就是 JQuery，所以用了很长一段时间的 JQ。 到了后面遇到有一个项目需要我做 APP 开发，但是不可能去学 IOS 开发和安卓开发，因为项目时间也不可能给我们这么充裕的学习时间。所以当时的我深入分析了几个混合 APP 开发的框架。分析对象包括当时基于 AngularJs 的 Ionic 框架和 React Native。综合考虑最后选择了 Ionic，然后自学了 Angular2。（过程也是踩过成千上万的坑学会的） APP 开发的这个过程让我深入感觉到那时候前端的革命性变化。庞大的前端知识扑面而来，也没有想到前端已经发展到这样一个地步。这段时间让我深刻领会到前端的博大精深，并且被前端这个技术领域深深的吸引住了。 到了后面 Vue 突然开始火了，各大技术公司都开始使用 Vue+Cli 脚手架搭建前端应用。越来越多的企业要求使用 Vue 开发前端应用和 WebAPP。热爱前端的我从来不畏惧需要学更多的 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/28-html-html5-challenges/</link>
                <guid isPermaLink="false">5f114ddadb4be8080eb7126b</guid>
                
                    <category>
                        <![CDATA[ Web ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 技术 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 自学编程 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ 三钻 ]]>
                </dc:creator>
                <pubDate>Thu, 29 Jul 2021 09:20:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2020/07/banner.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <h1 id="">「经历」</h1>
<p>我自学前端已经有 6 年多了，自问当时学前端是没有系统化学习的。一开始边看文档，连滚带爬学 HTML 和 CSS 排版，然后深入研究 JavaScript，因为当时最火的就是 JQuery，所以用了很长一段时间的 JQ。</p>
<p>到了后面遇到有一个项目需要我做 APP 开发，但是不可能去学 IOS 开发和安卓开发，因为项目时间也不可能给我们这么充裕的学习时间。所以当时的我深入分析了几个混合 APP 开发的框架。分析对象包括当时基于 AngularJs 的 Ionic 框架和 React Native。综合考虑最后选择了 Ionic，然后自学了 Angular2。（过程也是踩过成千上万的坑学会的）</p>
<p>APP 开发的这个过程让我深入感觉到那时候前端的革命性变化。庞大的前端知识扑面而来，也没有想到前端已经发展到这样一个地步。这段时间让我深刻领会到前端的博大精深，并且被前端这个技术领域深深的吸引住了。</p>
<p>到了后面 Vue 突然开始火了，各大技术公司都开始使用 Vue+Cli 脚手架搭建前端应用。越来越多的企业要求使用 Vue 开发前端应用和 WebAPP。热爱前端的我从来不畏惧需要学更多的知识，既然 Vue 来势汹汹，我也开始深入研究和学习 Vue 开发前端。经过一番折腾 Vue 也上手了。</p>
<p>至今我依然在不停的学习前端无边无际的知识和技术。</p>
<p>最近我发现，现在学习技术容易了很多。有各种技术文章、手摸手教学、线上培训课程和视频，甚至还有全免费的线上学习课程和练习。相比以前从看文档，连滚带爬的在项目中试错式的学习真的是容易多了。</p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="">「前言」</h1>
<p>我们都深刻知道，如果想在前端走的更远更久，基础知识必须是要牢固的。最近发现一个免费学习编程的网站 <code>freeCodeCamp(🔥)</code> - <a href="https://www.freecodecamp.org"><code>官方版（英文）</code></a> ｜ <a href="https://www.freecodecamp.one"><code>中文社区版</code></a> 。我好学的性格牵动着我的灵魂，忍不住就去研究了一下。我发现里面的课程确实很全面，而且还有实时和实战编程练习。就算是对于零基础的童鞋，也是可以开始学习编程的。</p>
<p>在一个夜深人静的夜晚，我看着电脑思考人生的时候，我灵机一动，要不我开始写一个系列的文章和大家一起闯关进攻前端全方位知识点。没有闯过这些关卡的童鞋，无论前端能力如何，这个可以锻炼我们自己，也可以深入知道我们自己的前端水平和差距。想学习前端的童鞋可以从零开始学习，一起排除困难共同打开前端大门！</p>
<p>使用这个免费网站学习编程，每一个知识学习完成后会给大家发放一个证书，然后每一个关键学习点之后，还有项目实战。自从 2014 年，有超过 4 万个<code>freeCodeCamp</code>毕业的童鞋获得了大企业工作机会。（里面有提到谷歌，苹果，微软，亚马逊，Spotify 等公司）</p>
<p>还有看到一些学员的评价：</p>
<blockquote>
<ul>
<li>“我在实习的时候，导师就叮嘱我在 freeCodeCamp 上做题闯关。技术的精进不仅给了我强大的自信，也让我得以进入大厂 ThoughtWorks。” --- 姜玉珍</li>
<li>“对于还没有形成编程思维的新人，即使是 leetcode 上面 easy 级别的算法题目都感到非常有难度，而 freeCodeCamp 的算法题恰好是一个良好的过渡。” --- 魏朝欣</li>
</ul>
</blockquote>
<p>无论这些证书是否对我们在中国的企业有一定的价值。但是能获得多一个证书，没有什么不好的呀。废话不多说了，我们这里就开始勇闯第一课《基础 HTML 与 HTML5 入门》！</p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="">「规则」如何一起闯关</h1>
<p>在开始这个闯关的系列之前，讲一下我们具体怎么一起闯关。</p>
<blockquote>
<p><strong>首先</strong>，如果我是单纯在这里给大家发布答案，我觉得这些文章就没有太大意义了。所以我希望在闯关的过程中一起学习到更多的知识，弄懂更深层的技术和用我的相关经验讲说这些知识在工作中的使用场景和小技巧。</p>
<hr>
<p>个人觉得英文版本的操作和体验都更好，加上英文版本的课题会更新。所以我会在英文版中与大家一起闯关。但是喜欢用中文社区版本也是可以的哦。酸甜苦辣各有所爱，但是效果和课题基本都是一样的哈。</p>
</blockquote>
<p><strong>每一篇文章的大概内容：</strong></p>
<ol>
<li>首先我们每一篇文章会尽量包含一个大知识点中的 N 个关卡。每一个知识点的关卡数量不一，所以有时候可能会拆分成几篇文章来讲说。</li>
<li>每一个关卡当中的知识点在 freeCodeCamp 中有一定的知识材料。但是在一起闯关的文章当中也会做一些详细的知识补充和一些有趣的理解方式。</li>
<li>每一个较难的关卡，都会在文章当中做详细的思路，多种实现方式等等的讲说，让我们在每一个关卡中能带走更多深层的知识点。</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h2 id="freecodecamp">freeCodeCamp 使用教程</h2>
<hr>
<h3 id="">课程内容</h3>
<p>FCC 一共有 6 大课程，一共大约 1800 个小时的内容和练习。如果是新人，推荐从第一个开始一个一个闯关学习。如果是老司机，是来这里学习你需要的知识，那可以随意选择你需要的课程开始学习。</p>
<ul>
<li>响应式 Web 设计（300 个小时）</li>
<li>算法和数据结构（300 个小时）</li>
<li>前端库和框架（300 个小时）</li>
<li>数据可视化（300 个小时）</li>
<li>API 和微服务（300 个小时）</li>
<li>信息安全和质量保证（300 个小时）</li>
</ul>
<p>最后还有一个是数千个小时的面试题可以提供给我们使劲的刷哦！</p>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="600" height="400" loading="lazy"></p>
<h3 id="">进入关卡</h3>
<p>首先我们展开第一课看一下：</p>
<p><img src="https://img-blog.csdnimg.cn/20200508151501995.png" alt="20200508151501995" width="2108" height="814" loading="lazy"></p>
<ol>
<li>第 1 点这里是基础知识的文章，可以点击查看。看完基础知识之后可以点击下方的<code>回到第一小节</code>开始闯关！</li>
<li>第 2 点这里下面所有的都是练习题，一个一个顺着闯关即可。</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h3 id="">关卡教程</h3>
<blockquote>
<p>⚠️ 注意：<br>
大家闯关之前，推荐大家都先使用 GitHub 登陆，到时候颁发的证书和闯关进度才能得到保存和跟踪哦！！！</p>
</blockquote>
<p>我们先从左边 👈 部分的内容开始说明：</p>
<ol>
<li>简单讲说了这个关卡涉及的知识点</li>
<li>描述关卡的挑战内容</li>
<li>本关卡的所有目标，点击测试代码的时候，完成的会出现 ✅，没有全部 ✅ 那就是还有部分我们没有实现哦。所有 ✅ 才能通关。</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504234332698.png" alt="20200504234332698" width="1358" height="1596" loading="lazy"></p>
<p>接下来就是说明中间的代码区：</p>
<ol>
<li>代码区，用于编写我们这个关卡的代码。</li>
<li>错误输出区域，当我们点击<code>测试代码</code>后，如果有错误就会显示在这里。</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504234641496.png" alt="20200504234641496" width="1386" height="1600" loading="lazy"></p>
<p>最后，最右边的部分是代码被编译后的效果，也就是我们在代码去编写的代码最终会在浏览器呈现出来的效果哦。（这里的效果会在我们编写代码的同时触发变化哦！）</p>
<p><img src="https://img-blog.csdnimg.cn/2020050423175522.png" alt="2020050423175522" width="950" height="350" loading="lazy"></p>
<p>提交代码/测试成功后：</p>
<p><img src="https://img-blog.csdnimg.cn/20200504234802981.png" alt="20200504234802981" width="1816" height="1258" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="">「知识」闯关基础知识点</h1>
<blockquote>
<p><strong>HTML 是什么？</strong><br>
HTML 的全称是 HyperText Markup Language（超文本标签语言），它是一种用来描述网页结构的标签语言。<br>
它采用一种特殊的语法或符号来组织网页的内容，元素通常都有开始标签和结束标签，例如标题、段落、列表。</p>
</blockquote>
<h2 id="html">更好的理解 HTML</h2>
<p>对于没有计算机基础的童鞋（就算是有）都会觉得有点抽象，不太好理解。我们换一个说法来理解一下：</p>
<blockquote>
<p>HTML 就等同于我们人体里面的骨架，一块一块骨头（标签）组装起来建立起一个人的骨架和结构。比如说经常可以见到的<code>head</code>，<code>body</code>，<code>footer</code>等标签，就等同于一个人的<code>头</code>，<code>身体</code>和<code>脚</code>。那其他的标签比如<code>h1</code>，<code>h2</code>，<code>div</code>，<code>section</code>和<code>ul</code>，<code>li</code>等标签就是用来组建我们人体每一个部位的小骨头。</p>
</blockquote>
<center><img src="https://img-blog.csdnimg.cn/2020050417151024.png" width="614" height="1384" alt="2020050417151024" loading="lazy"></center>
<p>如果 HTML 加上了 JavaScript（人体中的大脑和肌肉）就可以操控整个人的动作，让一个人活起来了。但是只有骨头和肌肉，这个也太难看了吧？想想都觉得吓人。所以我们会有皮肤来把这些不太好看的东西藏起来，这个时候就需要在 HTML 中使用 CSS（人体的皮肤）。这样子我们有好的皮肤加上衣服和化妆品的打扮，这样才可以貌美如花嘛对吧？</p>
<center><img src="https://img-blog.csdnimg.cn/20200504165855630.png" width="940" height="572" alt="20200504165855630" loading="lazy"></center>
<p>如果我们上面说的骨头和骨架，在代码中又是什么样子的呢？我们一起来看看：</p>
<pre><code class="language-html">&lt;h1&gt;Top level heading: Maybe a page title&lt;/h1&gt;

&lt;p&gt;
  A paragraph of text. Some information we would like to communicate to the viewer. This can be as
  long or short as we would like.
&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Number one on the list&lt;/li&gt;
  &lt;li&gt;Number two&lt;/li&gt;
  &lt;li&gt;A third item&lt;/li&gt;
&lt;/ol&gt;
</code></pre>
<p>这段代码被编译后就会在浏览器呈现出这个样子：</p>
<p><img src="https://img-blog.csdnimg.cn/20200504180352518.png" alt="20200504180352518" width="1736" height="468" loading="lazy"></p>
<h2 id="html5">HTML5 又是什么？</h2>
<p>HTML 这种超文本源自于 Web 早期和最初的用例。当时页面都是静态文档，并且文档中也有连接和引用到其他的文档。通过浏览器中的 hypertext links（超文本链接）在文档之中跳转与导航。这样用户就可以自由的在文档之中翱翔，不用在文档直接搜索查看。</p>
<p>后期 web 页面和 web 应用渐渐变得越来越复杂，W3C 更新了 HTML 的规范来让所有的浏览器更加兼容彼此。为什么呢？大家应该都知道市面上有五花八门的各种浏览器，如果每一个浏览器都对 HTML 有不同的写法，不同的规范，那我们做前端开发的，有多少的浏览器规范我们就需要学会多少种写法。不用后浪推上来，已经累死在沙滩上了。</p>
<p>那 HTML5 其实就是第五版的 HTML 规范，也是目前最新的版本。</p>
<p>基础知识弄懂了，我们马上就来开始闯关吧！GO GO GO！</p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="html">「第一关」用 HTML 元素与世界问好</h1>
<blockquote>
<p>关卡名：<code>Say Hello to HTML Elements</code></p>
</blockquote>
<p>身在技术领域的童鞋们都知道，入门任何语言的开头都是先与世界问个好（所谓的输出一个"Hello World"）。所以第一关当然是用 HTML 元素与世界问好啦！😂</p>
<h5 id="">知识点</h5>
<ul>
<li>这一关我们看到代码区域有<code>&lt;h1&gt;hello&lt;/h1&gt;</code>这一段代码，这个就是所谓的 HTML 元素了！也就是人体中的一小块骨头 🦴！。</li>
<li>HTML 中每一个标签都需要开始与结束标签：<code>&lt;h1&gt;</code> 为开始，<code>&lt;/h1&gt;</code> 为结束。</li>
<li>开始与结束标签的区别，就是结束标签多了<code>/</code>（斜杠）。</li>
</ul>
<h5 id="">过关目标</h5>
<ul>
<li>修改开始标签<code>&lt;h1&gt;</code>与关闭标签<code>&lt;/h1&gt;</code>之间的内容。</li>
<li>把内容从<code>Hello</code>改为<code>Hello World</code>。</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>HTML 中的开始与结束标签的格式与规范</li>
<li>标签的内容是什么</li>
<li>如何修改标签内容</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508232647107.png" alt="20200508232647107" width="1492" height="368" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="h2">「第二关」使用 H2 元素加入副标题</h1>
<blockquote>
<p>关卡名：<code>Headline with the h2 Element</code></p>
</blockquote>
<p>接下来的几个关卡中，我们会慢慢的一步一步的搭建一个 HTML5 的 <strong>“猫星人图片的网页应用”</strong>。</p>
<h5 id="">知识点</h5>
<ul>
<li><code>h2</code>元素是常用的副标题，其实就是比<code>h1</code>字体要小的标题，用过<code>WPS</code>或者<code>word</code>文档的童鞋应该秒懂了。</li>
<li>这些标题标签会告诉浏览器去显示一些默认的标题样式</li>
<li><code>h1</code>一般用于网页大标题，而<code>h2</code>就是用于副标题。</li>
<li>其实在 HTML 当中还有很多自带的标题元素，例如<code>h3</code>，<code>h4</code>，<code>h5</code>和<code>h6</code>，每一个代码一个等级的副标题，这里数字越大，标题的大小就越小哦。</li>
</ul>
<h5 id="">过关目标</h5>
<ul>
<li>在<code>h1</code>标签后面（第二行）加入一个<code>h2</code>标签。</li>
<li>并且在<code>h2</code>元素中加入<code>CatPhotoApp</code>的文字内容。</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li>创建一个<code>h2</code>元素</li>
<li><code>h2</code>元素必须有一个结束标签</li>
<li><code>h2</code>元素必须含有"<strong>CatPhotoApp</strong>"的文字内容</li>
<li><code>h1</code>元素必须含有"<strong>Hello World</strong>"的文字内容</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>什么是副标题</li>
<li>HTML 有哪些副标题</li>
<li>如何加入副标题</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508232620883.png" alt="20200508232620883" width="1492" height="406" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="">「第三关」段落元素加入信息内容</h1>
<blockquote>
<p>关卡名：<code>Inform with the Paragraph Element</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li><code>p</code>是<code>paragragh</code>（段落）的缩写，就是我们在写文章中的段落一样，一般都是用来放信息内容的。</li>
<li>我们可以用<code>&lt;p&gt;我是一个p标签&lt;/p&gt;</code>，这样的方式来加入段落元素。</li>
</ul>
<h5 id="">过关目标</h5>
<ul>
<li>在我们的<code>h2</code>元素下方加入<code>p</code>元素。</li>
<li>在<code>p</code>元素的内容中加入文字"<strong>Hello Paragraph</strong>"。</li>
<li>注意：HTML 的规范中说明，<strong>所有标签的英文字母都必须使用小写！</strong></li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li>代码中必须有一个规范的<code>p</code>元素。</li>
<li><code>p</code>元素中必须含有文字"<strong>Hello Paragraph</strong>"。</li>
<li><code>p</code>元素必须有一个结束标签。</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li><code>p</code>元素是什么</li>
<li>如何加入信息内容段落</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508232551519.png" alt="20200508232551519" width="1492" height="444" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="">「第四关」加入“占位”文字</h1>
<blockquote>
<p>关卡名：<code>Fill in the Blank with Placeholder Text</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>开发者们用一个传统，就是在没有内容的时候，排版时都会用统一的占位文字“<strong>lorem ipsum text</strong>”。很多人很好奇，为什么都用这个？</li>
</ul>
<blockquote>
<p>Lorem ipsum 从 15 世纪开始就被广泛地使用在西方的印刷、设计领域中，在电脑排版盛行之后，这段被传统印刷产业使用几百年的无意义文字又再度流行。由于这段文字以“Lorem ipsum”起头，并且常被用于标题的测试中，所以一般称为 Lorem ipsum，简称为 Lipsum。</p>
<hr>
<p>原先大家以为这段拉丁文只是没有意义的组合，目的是让阅读者不要被文章内容所影响，而只专注于观察字型或版型，并借此填满空间。但根据美国拉丁学者 Richard McClintock 的研究，Lorem ipsum 原来起源于西赛罗《善恶之尽》（De finibus bonorum et malorum）第一章（Liber Primus）的 32、33 两节。</p>
</blockquote>
<ul>
<li>这段占位文字用了 5 个世纪也是够长情的了，既然我们这些关卡是在搭建一个“猫星人”的应用，那么我们改为“<strong>kitty ipsum text</strong>”。😁</li>
</ul>
<h5 id="">过关目标</h5>
<ul>
<li>把<code>p</code>元素的内容替换成这一段占位文字：“<strong>Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.</strong>”</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>p</code>元素需要含有“<strong>kitty ipsum text</strong>”的首几个单词。</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>什么是“<strong>lorem ipsum text</strong>”</li>
<li>为什么“<strong>lorem ipsum text</strong>”经常用于设计和排版的占位文案</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508232456551.png" alt="20200508232456551" width="2048" height="558" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="html">「第五关」清除 HTML 代码注释</h1>
<blockquote>
<p>关卡名：<code>Uncomment HTML</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>代码注释是为了在代码中留下备注的一种常用写法。通常为了给自己和其他开发者留下有意义的备注，让大家可以更容易的懂得代码的作用或者含义。代码注释是不会影响代码的运行，或者是显示出来给到用户看到的。</li>
<li>代码注释还有一个非常使用的目的，就是屏蔽代码。被注释的代码就不会被编译器运行，这样被注释的代码就不会生效了。</li>
<li>不同语言有不同的注释写法，HTML 的注释写法开始是<code>&lt;!--</code>，结束使用<code>--&gt;</code>。例如：<code>&lt;!-- &lt;p&gt; abc &lt;/p&gt; --&gt;</code>。</li>
</ul>
<h5 id="">过关目标</h5>
<ul>
<li>此关卡的代码都被注释掉了，所以所有的代码都没有生效。（预览区可以看到是空白的）</li>
<li>我们需要清除掉这里的注释，让<code>h1</code>，<code>h2</code>和<code>p</code>元素生效。</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li>页面预览区需要可以看到<code>h1</code>元素内容</li>
<li>页面预览区需要可以看到<code>h2</code>元素内容</li>
<li>页面预览区需要可以看到<code>p</code>元素内容</li>
<li>页面中没有遗漏结束注释标签<code>--&gt;</code></li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>什么是代码注释</li>
<li>代码注释有什么作用</li>
<li>如何清除代码注释</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508232414817.png" alt="20200508232414817" width="2048" height="558" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="html">「第六关」局部 HTML 代码注释</h1>
<blockquote>
<p>关卡名：<code>Comment out HTML</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>上一关我们看到可以把整个代码注释掉，但是其实很多时候我们可能需要注释掉局部的代码，或者是多段代码。</li>
<li>使用方式也是一样的，在想开始注释的地方加入<code>&lt;!---</code>，然后结束的地方加入<code>--&gt;</code>。</li>
</ul>
<blockquote>
<p>⚠️ 注意：<br>
在注释代码的时候要注意的一个点，HTML 的元素都是有开始与结束标签的，注释的过程中如果我们注释掉半个元素，那代码就会有结束没有开头了。这样是会报错的哦。同等概念，后面我们会学到，HTML 元素是可以加入属性的，属性也是无法单独注释的。</p>
</blockquote>
<h5 id="">过关目标</h5>
<ul>
<li>注释掉整个<code>h1</code>元素和<code>p</code>元素，<code>h2</code>元素要生效。（也可以说页面上只能看到<code>h2</code>这个元素的效果）</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>h1</code>元素应该被注释掉，页面看不到该元素效果</li>
<li><code>p</code>元素应该被注释掉，页面看不到该元素效果</li>
<li>页面预览区需要可以看到<code>h2</code>元素内容</li>
<li>每一段注释都应该有结束注释标签<code>--&gt;</code></li>
<li><code>h1</code>，<code>h2</code>和<code>p</code>元素在代码中的顺序不能变</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>如何局部注释代码</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508232349471.png" alt="20200508232349471" width="2048" height="634" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="html">「第七关」删除 HTML 元素</h1>
<blockquote>
<p>关卡名：<code>Delete HTML Elements</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>场景：因为手机的屏幕高度可呈现的空间不多，所以我们要把<code>h1</code>元素删除掉。</li>
</ul>
<blockquote>
<p>⚠️ 注意：<br>
删除代码和注释代码都有一个一样的原则。就是开始与结束的标签不能缺了其中之一，要不代码就会报错。所以删除元素的时候也要注意元素的开始与结束标签的完整性。</p>
</blockquote>
<h5 id="">过关目标</h5>
<ul>
<li>删除掉代码中的<code>h1</code>元素，让我们的页面更加整洁和更有空间感。</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>h1</code>元素应该被完整的被删除</li>
<li>页面预览区需要可以看到<code>h2</code>元素内容</li>
<li>页面预览区需要可以看到<code>p</code>元素内容</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>如何正确的删除元素</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508232309358.png" alt="20200508232309358" width="2048" height="482" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="html5">「第八关」HTML5 元素</h1>
<blockquote>
<p>关卡名：<code>Introduction to HTML5 Elements</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>HTML5 给我们带来了更多具备丰富代表性的 HTML 标签。这些标签包括<code>main</code>（主要内容）、<code>header</code>（头部）、<code>footer</code>（脚步）、<code>nav</code>（导航）、<code>video</code>（视频）、<code>article</code>（文章）、<code>section</code>（区域/分段内容）和更多。</li>
<li>这些标签给 HTML 的结构带来了更多可描述性的意义。就好像人体也有很多代表性的结构与区域名称，比如说：肱骨、股骨、腕骨、肩胛和不规则骨等等。</li>
<li>人体的骨头要分类，也是为了让医生更好的在大量的骨头中找到或者描述到具体的那种骨头。那 HTML5 中的这些丰富的标签也是一样的。他们可以更好的帮助<code>搜索引擎</code>找到对应的内容，加入这些标签也让我们的网页做到更好的<strong>搜索引擎优化（SEO）</strong>。</li>
</ul>
<blockquote>
<p><strong>什么是搜素引擎？</strong><br>
我们可以把搜索引擎看作是一本很大很大的书中的目录。我们想想在现代的互联网中，全世界有多少个网站或者网页应用？如果没有一个目录让我们可以搜索，我们怎么可以找到我们想看的内容或者网站？可以说基本是不可能的！</p>
<hr>
<p><strong>搜索引擎怎么运作？</strong><br>
那搜索引擎的目录是怎么生成的呢？这个世界有一种很厉害的虫，那就是"爬虫"。每天搜索引擎的公司会派出成千上万的爬虫军队出去，在互联网上到处找网站，然后进入每一个网站中阅读里面的内容。然后收集回来的内容会经过做过滤和分析，然后建立关键词等等，最后生成一个搜索目录。我们经常用的搜索引擎包括：百度搜索，谷歌搜索，搜狗搜素，360 搜素等等。</p>
</blockquote>
<p>用其中一个标签来举例，一个<code>main</code>元素中嵌套了两个子元素：</p>
<pre><code class="language-html">&lt;main&gt;
  &lt;h1&gt;Hello World&lt;/h1&gt;
  &lt;p&gt;Hello Paragraph&lt;/p&gt;
&lt;/main&gt;
</code></pre>
<blockquote>
<p>小贴士：这些 HTML5 的标签的作用和适用性会在后面的“Applied Accessibility（应用无障碍）”的课程中详细讲说。</p>
</blockquote>
<h5 id="">过关目标</h5>
<ul>
<li>在原有的<code>p</code>元素下方添加一个新的<code>p</code>元素，并且加入这段内容<code>Purr jump eat the grass rip the couch scratched sunbathe, shed everywhere rip the couch sleep in the sink fluffy fur catnip scratched.</code></li>
<li>然后用一个<code>main</code>元素两个<code>p</code>元素包裹起来。</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li>应该有 2 个<code>p</code>元素，每个都有文字内容</li>
<li>每个<code>p</code>元素都有结束标签</li>
<li>第二个<code>p</code>元素的内容含有“Purr jump eat...”这段文字</li>
<li>代码中必须含有<code>main</code>元素</li>
<li><code>main</code>元素中必须含有两个<code>p</code>子元素</li>
<li><code>main</code>元素开始必须在第一个<code>p</code>元素之前</li>
<li><code>main</code>元素结束必须在第二个<code>p</code>元素之后</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>学到了更多丰富的 HTML5 标签</li>
<li>学会使用<code>main</code>元素</li>
<li>学会嵌套元素</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/2020050823222173.png" alt="2020050823222173" width="2048" height="634" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="">「第九关」网站中插入图片</h1>
<blockquote>
<p>关卡名：<code>Add Images to Your Website</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>我们可以通过使用<code>img</code>元素为我们的网页插入图片，然后使用元素中的<code>src</code>属性来指定图片地址。</li>
</ul>
<blockquote>
<p>⚠️ 注意：<code>img</code>元素是不需要结束标签的，它是属于自动关闭型元素。</p>
</blockquote>
<ul>
<li>W3C 规范中，所有<code>img</code>必须填写<code>alt</code>属性（alt 是“<strong>Alternative</strong>”的缩写，就是“<strong>替代</strong>”的意思）。当一个图片无法加载或者显示时，<code>alt</code>属性的值就会替代这个图片显示出来。</li>
<li>另外<code>alt</code>对于搜索引擎优化是有一定的帮助的，因为这个属性是用来描述一个图片的。如果这个图片是一只猫，对于搜索引擎的爬虫会针对图片的 Alt 取得关于这个图片的描述。这样搜索引擎才能知道这个图片大概是什么。</li>
</ul>
<blockquote>
<p>⚠️ 注意：</p>
<ul>
<li>如果图片是单纯为了装饰的，那<code>alt</code>就留空：<code>alt=""</code></li>
<li>尽量不要在<code>alt</code>属性中加入特殊字符（或者符号），除非是必须的</li>
</ul>
</blockquote>
<p>一个完整的<code>img</code>元素例子如下：</p>
<pre><code class="language-html">&lt;img
  src="https://www.your-image-source.com/your-image.jpg"
  alt="Author standing on a beach with two thumbs up."
/&gt;
</code></pre>
<h5 id="">过关目标</h5>
<ul>
<li>在<code>main</code>元素中的<code>p</code>元素之前添加<code>img</code>元素。</li>
<li><code>img</code>元素的<code>src</code>属性的值指向<code>https://bit.ly/fcc-relaxing-cat</code></li>
<li>给予<code>img</code>元素的<code>alt</code>属性一个合适的名字：比如“Kitty” (小猫咪的意思)</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li>页面中必须有一个<code>img</code>元素。</li>
<li><code>img</code>元素中的<code>src</code>属性指向一个猫咪的图片地址。</li>
<li><code>img</code>元素中的<code>alt</code>属性值不能为空。</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>如何使用<code>img</code>图片元素</li>
<li>懂得使用<code>src</code>属性</li>
<li>懂得使用<code>alt</code>属性</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508232128378.png" alt="20200508232128378" width="2048" height="672" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="">「第十关」使用锚元素实现链接跳转</h1>
<blockquote>
<p>关卡名：<code>Link to External Pages with Anchor Elements</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>在 HTML 当中，<code>a</code> (锚) 元素是用于跳转页面，可以是内部页面或者是外部页面。（内部指的是本网站内的页面，外部指的是本网站以外的其他网站的页面。）</li>
<li><code>a</code> 元素需要一个网页地址的属性叫<code>href</code>。也需要一个 anchor text（锚文字）：</li>
</ul>
<blockquote>
<p>例如：<br>
<code>&lt;a href="https://freecodecamp.org"&gt;这个链接会跳转到 freecodecamp.org&lt;/a&gt;</code></p>
<ul>
<li>网页地址：<a href="https://freecodecamp.org">https://freecodecamp.org</a></li>
<li>锚文字（其实就是跳转链接的文案）：这个链接会跳转到 freecodecamp.org</li>
</ul>
</blockquote>
<ul>
<li>使用以上例子，在浏览器中就会显示一段文字链接 “这个链接会跳转到 freecodecamp.org”，点击该链接就会跳转到<strong><a href="https://www.freecodecamp.org">https://www.freecodecamp.org</a></strong>这个网址。</li>
</ul>
<blockquote>
<p>额外知识点：<br>
以上例子讲说的是跳转外部链接，如果我想跳转当前网址的子页面呢？(所谓的内部跳转，但是其实还可以做到当前页面的位置跳转，这个下一个关卡就会学到咯！)</p>
<ul>
<li>比如现在我们当前的页面是"www.freecodecamp.org"，我们的链接想跳转到“www.freecodecamp.org/learn”。</li>
<li>这个时候我们的<code>a</code>元素的<code>href</code>属性可以这么写</li>
</ul>
</blockquote>
<pre><code class="language-html">&lt;a href="/learn"&gt;这个链接会跳转到 freecodecamp.org/learn&lt;/a&gt;
</code></pre>
<h5 id="">过关目标</h5>
<ul>
<li>创建一个<code>a</code>元素，链接文案为“cat photos”，并且指定跳转到<code>http://freecatphotoapp.com</code></li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>a</code>元素的链接文案必须含有“cat photos”</li>
<li><code>a</code>元素的跳转地址必须是<code>http://freecatphotoapp.com</code>。</li>
<li><code>a</code>元素必须有结束标签。</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>如何在网页中添加链接</li>
<li>懂得使用<code>href</code>属性</li>
<li>懂得如何添加链接文案</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508232040589.png" alt="20200508232040589" width="2048" height="748" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="">「第十一关」使用锚元素跳转内部页面区域</h1>
<blockquote>
<p>关卡名：<code>Link to Internal Sections of a Page with Anchor Elements</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li><code>a</code>（锚）元素还可以用于跳转页面内部的特定区域。</li>
<li>创建一个内部跳转链接，首先我们需要在<code>href</code>属性的值中绑定一个哈希符号<code>#</code>和一个唯一<code>id</code>属性。</li>
<li><code>id</code>属性是在 HTML 中任何一个元素都可以绑定的唯一标识。<code>id</code>属性可以给予一个元素一个唯一的识别名，让这个元素可以在 HTML 中被选择到。</li>
</ul>
<p>以下是一个内部跳转链接的例子，其中的<code>...</code>代表被省略的一段代码。</p>
<pre><code class="language-html">&lt;a href="#contacts-header"&gt;Contacts&lt;/a&gt;
...
&lt;h2 id="contacts-header"&gt;Contacts&lt;/h2&gt;
</code></pre>
<blockquote>
<p><strong>我们来分析一下这个例子：</strong></p>
<ul>
<li>这里的<code>h2</code>元素被绑定了一个<code>id</code>属性，名字为“contacts-header”。</li>
<li>我们的<code>a</code>元素链接的指定<code>href</code>跳转地址为<code>#contacts-header</code>。</li>
<li>我们可以看到<code>#</code>后面的名字与<code>h2</code>的<code>id</code>值一致，就是这样点击这个链接的时候，页面就会移动到绑定了同一个名字的元素的位置。</li>
<li>我们要注意的是<code>id</code>属性的值，在当前页面中必须是唯一的。</li>
</ul>
</blockquote>
<blockquote>
<p>知识点：<br>
在这个例子里面，我们可以看到<code>a</code>元素多了一个<code>target</code>属性。这个属性在链接中是非常常用的。我们经常用的各大电商平台，我们点击一个商品的链接都会打开一个新窗口，但是有一些链接就不会。这种就是用<code>target</code>属性控制的。</p>
<hr>
<p><code>target</code>属性的常用值有：</p>
<ul>
<li><strong>_blank</strong>：在新窗口中打开被链接文档。</li>
<li><strong>_self</strong>：默认。在相同的框架中打开被链接文档。</li>
<li><strong>_parent</strong>：在父框架集中打开被链接文档。</li>
<li><strong>_top</strong>：在整个窗口中打开被链接文档。</li>
<li><em>framename</em>：在指定的框架中打开被链接文档。</li>
</ul>
</blockquote>
<h5 id="">过关目标</h5>
<ul>
<li>修改我们的外部跳转链接的<code>href</code>属性为<code>#footer</code>，并且把链接的文案“cat photos”改为"Jump to Bottom"。</li>
<li>移除<code>target="_blank"</code>属性，因为这个属性会让我们的链接在全新的窗口打开这个跳转链接。</li>
<li>最后在页面最底部的<code>footer</code>元素中添加<code>id</code>属性，属性值为"<strong>footer</strong>"。</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li>页面中必须含有一个锚元素</li>
<li>页面中只有一个 footer 标签</li>
<li><code>a</code>元素的<code>href</code>属性值必须是<code>#footer</code></li>
<li><code>a</code>元素必须没有<code>target</code>属性</li>
<li><code>a</code>元素的链接文章应该是“Jump to Bottom”</li>
<li><code>footer</code>元素的<code>id</code>属性值必须是"footer"</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>如何在网页中添加内部链接</li>
<li>懂得使用<code>id</code>属性</li>
<li>懂得使用哈希符号链接跳转</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508231953144.png" alt="20200508231953144" width="2048" height="1318" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="">「第十二关」文章中嵌套锚元素</h1>
<blockquote>
<p>关卡名：<code>Nest an Anchor Element within a Paragraph</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>我们可以在文字中添加链接：</li>
</ul>
<pre><code class="language-html">&lt;p&gt;
  Here's a
  &lt;a target="_blank" href="http://freecodecamp.org"&gt;link to freecodecamp.org&lt;/a&gt;
  for you to follow.
&lt;/p&gt;
</code></pre>
<blockquote>
<p><strong>分析一下这个例子的实现原理：</strong></p>
<ul>
<li>首先我们有一个文字段落<code>&lt;p&gt;Here's a ... for you to follow.&lt;/p&gt;</code></li>
<li>在这个文字段落中"<strong>...</strong>"的部分我们加入<code>a</code> (锚) 元素：<code>&lt;a href="http://freecodecamp.org"&gt; ... &lt;/a&gt;</code>，这里我们用<code>a</code>元素包裹了"<strong>...</strong>"这个文字内容，这样这个文字内容就会变成一个链接，并且可点击跳转网页。（记住这里需要我们有开始<code>&lt;a&gt;</code>与结束<code>&lt;/a&gt;</code>标签，这样才能指定这个链接的开始与结束区域）</li>
<li>这里<code>a</code>元素中加入<code>target="_blank"</code>可以让链接在新窗口打开，<code>href</code>属性指定了跳转链接。</li>
<li>最后"..."的内容在这个例子里面就是" link to freecodecamp.org"，也就是链接的文案（锚文字）。</li>
</ul>
</blockquote>
<h5 id="">过关目标</h5>
<ul>
<li>首先在<code>main</code>元素中加入一个新的<code>p</code>元素。</li>
<li><code>p</code>元素中的文案写入"View more cat photos"。</li>
<li>使用我们原来的<code>a</code>元素替换这段文案中的“cat photos”，从而把这段文案中的"cat photos"改为一个链接。</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>a</code>元素的链接需要指定跳转"<a href="http://freecatphotoapp.com">http://freecatphotoapp.com</a>"</li>
<li><code>a</code>元素的链接文案应该是“cat photos”</li>
<li><code>a</code>元素需要被<code>p</code>元素包裹着，然后<code>main</code>元素中需要一共有 3 个<code>p</code>元素</li>
<li><code>a</code>元素需要被新的<code>p</code>元素包裹着，不能是其他的<code>p</code>元素</li>
<li><code>p</code>元素中必须含有“View more ” （more 后面需要含有一个空格）</li>
<li><code>a</code>元素中不能含有“View more”等文字</li>
<li>所有<code>p</code>元素必须有结束标签</li>
<li>所有<code>a</code>元素必须有结束标签</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>在文章段落中添加链接</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508231849358.png" alt="20200508231849358" width="2048" height="786" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="">「第十三关」使用哈希符号创建死链接</h1>
<blockquote>
<p>关卡名：<code>Make Dead Links Using the Hash Symbol</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>有时候我们需要添加一个死链接（顾名思义，就是一个点击后无效的链接，不会触发页面跳转）</li>
<li>这种链接有几个用途，第一种在排版的过程中还不知道需要链接哪里，第二种就是后面这个链接交给 JavaScript 处理。（后面的 JavaScript 关卡中会讲到哦）</li>
</ul>
<p><strong>代码例子：</strong></p>
<pre><code class="language-html">&lt;a href="#"&gt;死链接&lt;/a&gt;
</code></pre>
<h5 id="">过关目标</h5>
<ul>
<li>当前的<code>a</code>元素中的<code>href</code>是指向一个链接地址"<a href="http://freecatphotoapp.com">http://freecatphotoapp.com</a>"</li>
<li>把<code>href</code>属性值改为<code>#</code>，就可以把这个锚元素变成一个死链接</li>
<li>这里还需要把<code>target</code>属性移除掉，要不还是会跳转页面的</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>a</code>元素的<code>href</code>属性值是<code>#</code>，是一个死链接</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>用哈希符号创建死链接</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508231802953.png" alt="20200508231802953" width="2048" height="748" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="">「第十四关」把图片变成链接</h1>
<blockquote>
<p>关卡名：<code>Turn an Image into a Link</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>我们可以通过用<code>a</code>元素包裹一个元素，让这个元素变成一个链接</li>
<li>比较常用的一个例子就是使用<code>a</code>元素包裹一个<code>img</code>元素，这样就可以把一个图片变成一个链接。（也就是说，点击这个图片就可以跳转页面了）</li>
</ul>
<p><strong>代码例子：</strong></p>
<pre><code class="language-html">&lt;a href="#"&gt;
  &lt;img src="https://bit.ly/fcc-running-cats" alt="Three kittens running towards the camera." /&gt;
&lt;/a&gt;
</code></pre>
<blockquote>
<p>这个例子中，我们希望这个图片的链接是一个"死链接"，所以<code>href</code>属性的值需要使用<code>#</code>。</p>
</blockquote>
<h5 id="">过关目标</h5>
<ul>
<li>用<code>a</code>元素包裹页面中的<code>img</code>元素</li>
<li>改变后，我们在最右边的预览区把鼠标放到图片上方，我们可以看到我们的鼠标从一个“<strong>普通鼠标志</strong>”变成一个“<strong>点击手指的标志</strong>”</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>img</code>元素需要包裹在<code>a</code>元素之中</li>
<li>图片的链接必须是一个死链接</li>
<li>所有的<code>a</code>元素必须有结束标签</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>给图片添加链接</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508231725267.png" alt="20200508231725267" width="2048" height="824" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="">「第十五关」创建无序列表</h1>
<blockquote>
<p>关卡名：<code>Create a Bulleted Unordered List</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>HTML 当中有特殊的元素用于创建无序列表。</li>
<li>无序列表需要使用<code>ul</code>元素包裹着多个<code>li</code>元素，开始标签为<code>&lt;ul&gt;</code>，结束标签为<code>&lt;/ul&gt;</code>。</li>
</ul>
<p>*代码例子：**</p>
<pre><code class="language-html">&lt;ul&gt;
  &lt;li&gt;牛奶&lt;/li&gt;
  &lt;li&gt;芝士&lt;/li&gt;
&lt;/ul&gt;
</code></pre>
<p>这段代码就会创建一个无序列表，列表内容有“牛奶”与“芝士”。</p>
<h5 id="">过关目标</h5>
<ul>
<li>移除代码中最后两个<code>p</code>元素。</li>
<li>然后添加一个<strong>无序列表</strong>，列出 3 个喵咪喜爱的东西。</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li>创建一个<code>ul</code>元素</li>
<li><code>ul</code>元素应该包裹着 3 个<code>li</code>元素</li>
<li><code>ul</code>元素必须有结束标签</li>
<li>所有<code>li</code>元素必须有结束标签</li>
<li><code>li</code>元素中必须有内容，也不能是只有空格</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>使用<code>ul</code>元素</li>
<li>使用<code>li</code>元素</li>
<li>创建无序列表</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508231648984.png" alt="20200508231648984" width="1952" height="786" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="">「第十六关」创建有序列表</h1>
<blockquote>
<p>关卡名：<code>Create an Ordered List</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>HTML 当中还有一种叫有序列表（就是前面会按照 1，2，3，4... 以此类推）</li>
<li>需要使用<code>ol</code>元素包裹着多个<code>li</code>元素，开始标签为<code>&lt;ol&gt;</code>，结束标签为<code>&lt;/ol&gt;</code></li>
</ul>
<p><strong>代码例子：</strong></p>
<pre><code class="language-html">&lt;ol&gt;
  &lt;li&gt;肥猪&lt;/li&gt;
  &lt;li&gt;肥牛&lt;/li&gt;
&lt;/ol&gt;
</code></pre>
<p>以上这段代码会创建一个有序列表，有序的列出“肥猪”和“肥牛”。</p>
<h5 id="">过关目标</h5>
<ul>
<li>在“<strong>Top 3 things cat hate:</strong>”的<code>p</code>元素下方加入一个有序列表</li>
<li>有序列表中列出 3 样喵咪讨厌的东西</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li>有一个有序列表列出 3 样喵咪讨厌的东西</li>
<li>有一个无序列表列出 3 样喵咪喜欢的东西</li>
<li>只有一个<code>ul</code>元素</li>
<li>只有一个<code>ol</code>元素</li>
<li><code>ul</code>元素中有 3 个<code>li</code>元素</li>
<li><code>ol</code>元素中有 3 个<code>li</code>元素</li>
<li>所有<code>li</code>元素必须有结束标签</li>
<li>所有<code>li</code>元素的内容不能为空或者只有空格</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>使用<code>ol</code>元素</li>
<li>创建有序列表</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508231613451.png" alt="20200508231613451" width="1952" height="1052" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="">「第十七关」创建文本输入框</h1>
<blockquote>
<p>关卡名：<code>Create a Text Field</code></p>
</blockquote>
<h5 id="">知识点</h5>
<p>接下来的几个关卡，我们一起来创建一个表单。</p>
<blockquote>
<p><strong>什么是表单？</strong></p>
<p>表单就是一个网页端的表格，让用户在其中填写信息提交给我们保存起来。在办理事情的时候，我们经常会需要填写表格，然后提交给工作人员。在网络上填写表格也是一样的。用户在表单中填写表格，然后提交给我们保存起来，工作人员在后台管理系统就可以对这些表格进行处理了。</p>
</blockquote>
<ul>
<li>一个表单就必定会有文字填写的地方，在 HTML 中我们会使用<code>input</code>元素来创建一个文本输入框，给到用户填写文字。</li>
</ul>
<p><strong>代码例子：</strong></p>
<pre><code class="language-html">&lt;input type="text" /&gt;
</code></pre>
<blockquote>
<p>知识点：</p>
<ul>
<li><code>input</code>元素是一个自我关闭型标签，所以不需要结束标签的。</li>
<li><code>input</code>元素中有一个<code>type</code>属性，这个是用来定义这个输入框的类型，这里因为我们需要文本类型，所以就是<code>text</code>。那其他类型有什么呢？其他的类型在后面的关卡中会讲到哦。</li>
<li><code>input</code>元素中的<code>name</code>属性也是非常重要的，后端接受表单的输入框数据时，用的就是<code>name</code>属性值来获取数据的。</li>
</ul>
</blockquote>
<h5 id="">过关目标</h5>
<ul>
<li>在有序列表的<code>ol</code>元素下方创建一个<code>input</code>元素，<code>type</code>元素值使用“<strong>text</strong>”</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li>需要有一个<code>input</code>元素，<code>type</code>属性值为<code>text</code></li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>使用<code>input</code>元素创建文本输入框</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/2020050823152167.png" alt="2020050823152167" width="1952" height="1090" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="">「第十八关」文本输入框中添加占位文本</h1>
<blockquote>
<p>关卡名：<code>Add Placeholder Text to a Text Field</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>占位文本（Placeholder）也叫输入框提示语，这段文字会在用户为输入前在输入框中显示。</li>
</ul>
<p><strong>我们可以用以下方式加入占位文本：</strong></p>
<pre><code class="language-html">&lt;input type="text" placeholder="这个是占位文本/提示语" /&gt;
</code></pre>
<blockquote>
<p>⚠️ 记住：</p>
<p><code>input</code>元素是自我结束型元素，不需要结束标签哦！</p>
</blockquote>
<h5 id="">过关目标</h5>
<ul>
<li>在<code>input</code>元素当中添加<code>placeholder</code>属性，属性值为"cat photo URL"</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>input</code>元素中有<code>placeholder</code>属性</li>
<li><code>placeholder</code>的属性值必须为“<strong>cat photo URL</strong>”</li>
<li><code>input</code>元素不需要有结束标签</li>
<li><code>input</code>元素语法不能有误</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>在<code>input</code>元素中添加<code>placeholder</code>属性</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/2020050823143732.png" alt="2020050823143732" width="1952" height="1090" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="">「第十九关」创建一个表单元素</h1>
<blockquote>
<p>关卡名：<code>Create a Form Element</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>我们知道在现实生活中，提交一个表单/表格，只需要填写好后递交给一个人就可以了。但是在网页中的表单是怎么提交让我们保存起来的呢？</li>
<li>其实也很简单，我们首先创建一个<code>form</code>元素来建立一个表单，然后在<code>form</code>元素中添加一个<code>action</code>属性，并且给他一个提交的地址即可。</li>
</ul>
<blockquote>
<p><strong>小知识：</strong></p>
<p>我们知道现实中我们会把表格提交给工作人员，那在网页中我们提交给谁呢？我们用一个简单接地气的例子来理解一下：</p>
<ul>
<li>首先表格的内容都是电子化数据不是纸质的，那肯定是要提交给一个电子化储存的地方</li>
<li>电子化储存的地方就是服务器，也就是一台电脑</li>
<li>但是总要有一个<code>人</code>这样的东西接收我们的表单吧？是的，操控这个服务器的就是<code>后端</code></li>
<li>所以表单的<code>action</code>顾名思义是一个提交动作，表单需要指定给一个“人”来接收，在网络上就是“服务器地址或者后端地址”</li>
<li>我们再想想现实中，工作人员拿到我们的表格，会存放到文件仓库对吧？那在网络应用中电子表单的数据放哪里呢？</li>
<li>表单数据提交给到后端之后，后端会拿着这个数据储存到<code>数据库</code>中，数据库也就是文件库了</li>
</ul>
<p>通过这个例子大家应该可以能理解表单数据提交和储存的概念了。也更能懂得这个<code>action</code>背后的基本逻辑是什么了。</p>
</blockquote>
<p><strong>代码例子：</strong></p>
<pre><code class="language-html">&lt;form action="/url-where-you-want-to-submit-form-data"&gt;
  ...
&lt;/form&gt;
</code></pre>
<h5 id="">过关目标</h5>
<ul>
<li>把我们的<code>input</code>元素包裹在<code>form</code>元素之中，然后在<code>form</code>元素中加入<code>action</code>属性值“<strong>/submit-cat-photo</strong>”</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li>文本输入框应该包裹在<code>form</code>元素之中</li>
<li><code>form</code>元素需要有<code>action</code>属性值为“/submit-cat-photo”</li>
<li><code>form</code>元素需要有完整的开始与结束标签</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>如何完成使用表单</li>
<li>使用表单<code>form</code>元素</li>
<li>懂得<code>action</code>属性的意义和用法</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508231340182.png" alt="20200508231340182" width="1952" height="1166" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="">「第二十关」添加表单提交按钮</h1>
<blockquote>
<p>关卡名：<code>Add a Submit Button to a Form</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>用户输入了表单中的信息，但是没有一个提交的按钮，这个信息是不会自动提交到服务端的</li>
<li>所以我们需要在表单中加入<code>button</code>元素（按钮元素），并且给它的<code>type</code>属性一个“<code>submit</code>（提交动作）”的类型</li>
<li>用户点击这个按钮就会提交表格中所有输入框内的信息</li>
</ul>
<h5 id="">过关目标</h5>
<ul>
<li>在<code>form</code>元素中的最后添加<code>button</code>元素，类型为<code>submit</code></li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li>表单元素中必须含有一个按钮</li>
<li><code>button</code>元素必须有一个<code>type</code>属性值为<code>submit</code></li>
<li><code>button</code>元素中的文字内容必须是"Submit"</li>
<li><code>button</code>元素必须有结束标签</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>使用<code>button</code>元素</li>
<li>如果添加提交表单按钮</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508231256383.png" alt="20200508231256383" width="1952" height="1204" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="">「第二十一关」设置一个输入框为必填 ​</h1>
<blockquote>
<p>关卡名：<code>Use HTML5 to Require a Field</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>我们可以让表单中某个特定的输入框变成必填，如果用户没有填写是无法提交表单的</li>
<li>举例，现在我们需要一个文本输入框变成必填项，我们只需要在<code>input</code>元素中添加一个<code>require</code>属性</li>
</ul>
<p><strong>代码例子：</strong></p>
<pre><code class="language-html">&lt;input type="text" required /&gt;
</code></pre>
<blockquote>
<p>⚠️ 注意：<code>input</code>元素中的<code>require</code>属性是不需要填写属性值的，只要加入这个属性就起效了。</p>
</blockquote>
<h5 id="">过关目标</h5>
<ul>
<li><code>input</code>元素加入<code>required</code>属性，把输入框变成一个必填项，用户如果没有填写内容将无法提交表单</li>
<li>加入后尝试在输入框中没有填写内容时点击"Submit"按钮，看看 HTML5 时如何提醒我们必填内容未完成的。</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>input</code>元素应该有一个<code>required</code>属性</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>使用<code>input</code>元素中的<code>required</code>属性</li>
<li>给表单加入必填输入框</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508231219256.png" alt="20200508231219256" width="1952" height="1204" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="">「第二十二关」添加一组单选按钮</h1>
<blockquote>
<p>关卡名：<code>Create a Set of Radio Buttons</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>当我们在表单中询问用户一个问题，并且希望用户只给出多选一的答案。这个时候我们就可以使用<em>单选按钮</em>。</li>
<li>单选按钮是<code>input</code>元素中其中一种类型。</li>
<li>要使用单选按钮，我们需要把每一个单选的<code>input</code>元素包裹在一个<code>label</code>元素中。这时<code>label</code>元素就会与<code>input</code>元素绑定上。意思就是<code>label</code>中的任何文字，在点击的时候都可以选中这个选项。</li>
<li>所有相关的单选项需要有同一个<code>name</code>属性值才能把这些单选项组成一组选项。</li>
<li>单选项被列为一组后，才能选择这组其中一个单选项时，才会自动去除选中其他这组里面的选项。</li>
</ul>
<p><strong>单选按钮的例子：</strong></p>
<pre><code class="language-html">&lt;label&gt;
  &lt;input type="radio" name="indoor-outdoor" /&gt;
  内门
&lt;/label&gt;
</code></pre>
<ul>
<li>最佳实践是在<code>label</code>元素上设置一个<code>for</code>属性，其值与输入元素的<code>id</code>属性值相匹配。这允许辅助技术在标签和子<code>input</code>元素之间创建链接关系。例如:</li>
</ul>
<pre><code class="language-html">&lt;label for="indoor"&gt;
  &lt;input id="indoor" type="radio" name="indoor-outdoor" /&gt;
  Indoor
&lt;/label&gt;
</code></pre>
<h5 id="">过关目标</h5>
<ul>
<li>添加一对<code>radio</code>单选按钮到我们的表单中，每个需要有自己的<code>label</code>元素包裹着。</li>
<li>一个选项显示为<code>indoor</code>和另外一个选项显示<code>outdoor</code>。</li>
<li>两个选项的<code>name</code>属性值都必须是<code>indoor-outdoor</code>，从而把它们组成一组。</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li>需要有两个<code>radio</code>元素的单选按钮</li>
<li><code>radio</code>元素的单选按钮都需要有<code>name</code>属性值为<code>indoor-outdoor</code></li>
<li>两个<code>radio</code>元素的单选按钮都需要有自己的<code>label</code>元素包裹着</li>
<li>每个<code>radio</code>元素都有结束标签</li>
<li>一个单选为<code>indoor</code></li>
<li>一个单选为<code>outdoor</code></li>
<li>所有<code>radio</code>元素都必须在<code>form</code>元素之内</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>使用<code>label</code>元素</li>
<li>使用<code>input</code>元素中的<code>radio</code>类型</li>
<li>如何组合一组单选项</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508231133820.png" alt="20200508231133820" width="1952" height="1432" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="">「第二十三关」添加一组复选框</h1>
<blockquote>
<p>关卡名：<code>Create a Set of Checkboxes</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>表单中，通常用<code>checkbox</code>来建立复选框的表单问题。</li>
<li><code>checkbox</code>是<code>input</code>元素的其中一种类型。</li>
<li>要使用复选框，我们需要把每一个复选框的<code>input</code>元素包裹在一个<code>label</code>元素中。这时<code>label</code>元素就会与<code>input</code>元素绑定上。意思就是<code>label</code>中的任何文字，在点击的时候都可以选中这个选项。</li>
<li>所有相关的复选框需要有同一个<code>name</code>属性值才能把这些选项组成一组选项。</li>
<li>与单选的原理相同：最佳实践是在<code>label</code>元素上设置一个<code>for</code>属性，其值与输入元素的<code>id</code>属性值相匹配。这允许辅助技术在标签和子<code>input</code>元素之间创建链接关系</li>
</ul>
<p><strong>复选框例子：</strong></p>
<pre><code class="language-html">&lt;label for="loving"&gt;
  &lt;input id="loving" type="checkbox" name="personality" /&gt;
  Loving
&lt;/label&gt;
</code></pre>
<h5 id="">过关目标</h5>
<ul>
<li>在<code>form</code>元素内添加一组 3 个<code>checkbox</code>类型的复选框。</li>
<li>每一个复选框的<code>input</code>都要有自己的<code>label</code>包裹着。</li>
<li>三个复选框都需要使用同一个<code>name</code>属性值为<code>personality</code>。</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li>需要有 3 个复选框元素。</li>
<li>每个复选框元素必须包裹着在自己的<code>label</code>元素内。</li>
<li>每一个<code>label</code>元素都需要有结束标签。</li>
<li>所有复选框都需要用同一个<code>name</code>属性值为<code>personality</code>。</li>
<li>所有复选框都需要添加在<code>form</code>元素之中。</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>使用<code>input</code>元素中的<code>checkbox</code>类型</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508230712438.png" alt="20200508230712438" width="2014" height="1546" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="value">「第二十四关」复选框与单选框中使用 value</h1>
<blockquote>
<p>关卡名：<code>Delete HTML Elements</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>当一个表单提交时，表单所有的数据会发送到服务端（后端），这里也包括我们选择的选择框数据。</li>
<li><code>checkbox</code>复选框和<code>radio</code>单选框的选中数据也是会一起提交到服务端，那后端怎么判定我们选中了那些呢？</li>
<li>无论是复选还是单选，后端接收到的都是选中的选项输入框<code>value</code>属性的值。</li>
<li>所有我们需要给每一个<code>checkbox</code>或者<code>radio</code>类型的输入框一个<code>value</code>属性。</li>
</ul>
<p><strong>代码例子：</strong></p>
<pre><code class="language-html">&lt;label for="indoor"&gt;
  &lt;input id="indoor" value="indoor" type="radio" name="indoor-outdoor" /&gt;
  Indoor
&lt;/label&gt;
&lt;label for="outdoor"&gt;
  &lt;input id="outdoor" value="outdoor" type="radio" name="indoor-outdoor" /&gt;
  Outdoor
&lt;/label&gt;
</code></pre>
<p>以上例子中，我们有两个<code>radio</code>单选框类型的输入框。假设用户选中了"Outdoor"并且提交了表单，表单数据中会含有<code>indoor-outdoor=outdoor</code>这样的参数。<code>indoor-outdoor</code>这部分来源于这个输入框的<code>name</code>属性，然后<code>outdoor</code>就是用户选中的选项的<code>value</code>属性值。</p>
<p>如果我们没有填写<code>value</code>属性值，用户选中了任何一个选项然后提交表单。后端接收到的数据就是<code>indoor-outdoor=on</code>。这个数据里面只能告诉我们<code>indoor-outdoor</code>这个选项，用户有选中一个值，但是是什么，我们不知道。这样这个表单的数据就没有任何意义了。所以我们一定要给每一个选项<code>input</code>元素加入一个<code>value</code>属性值。</p>
<h5 id="">过关目标</h5>
<ul>
<li>给每一个<code>radio</code>和<code>checkbox</code>输入框类型的元素一个<code>value</code>属性值。</li>
<li>这里<code>value</code>属性值常规来说我们<strong>都是用英文的</strong>，在这个例子中因为我们的选项本身就是英文，所以我们直接用选项名作为<code>value</code>的值即可。</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li>其中一个<code>radio</code>的<code>value</code>属性值需要是”<strong>indoor</strong>“</li>
<li>其中一个<code>radio</code>的<code>value</code>属性值需要是”<strong>outdoor</strong>“</li>
<li>其中一个<code>checkbox</code>的<code>value</code>属性值需要是”<strong>loving</strong>“</li>
<li>其中一个<code>checkbox</code>的<code>value</code>属性值需要是”<strong>lazy</strong>“</li>
<li>其中一个<code>checkbox</code>的<code>value</code>属性值需要是”<strong>energetic</strong>“</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>使用<code>value</code>属性</li>
<li>给<code>radio</code>或者<code>checkbox</code>加上<code>value</code>属性值</li>
<li>多选项或者单选项数据提交的原理</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508230558471.png" alt="20200508230558471" width="2014" height="1394" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="">「第二十五关」默认选中单选框/复选框</h1>
<blockquote>
<p>关卡名：<code>Check Radio Buttons and Checkboxes by Default</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>很多时候，表单当中都会有默认选中值。</li>
<li>如果我们想默认选中单选项中的其中一个，或者是默认选中复选项中的几个怎么实现呢？</li>
<li>想默认选中，我们只需要在<code>radio</code>或者<code>checkbox</code>的<code>input</code>元素中添加<code>checked</code>属性即可（这个也是一个不需要属性值的属性）</li>
</ul>
<p><strong>代码例子：</strong></p>
<pre><code class="language-html">&lt;input type="radio" name="test-name" checked /&gt;
</code></pre>
<h5 id="">过关目标</h5>
<ul>
<li>把<code>radio</code>单选框组合的第一个单选项设置为默认选中。</li>
<li>把<code>checkbox</code>复选框组合的第一个复选项设置为默认选中。</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li>单选框组合的第一个单选项默认被选中</li>
<li>复选框组合的第一个复选项默认被选中</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>给<code>radio</code>单选项或者<code>checkbox</code>复选项添加默认选中属性<code>checked</code></li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508230402201.png" alt="20200508230402201" width="2014" height="1850" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="div">「第二十六关」将许多元素嵌套在单个 div 元素中</h1>
<blockquote>
<p>关卡名：<code>Nest Many Elements within a Single div Element</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li><code>div</code>元素，也称为分割元素，是其他元素的通用容器。</li>
<li><code>div</code>元素也是最常用的 HTML 元素之一。</li>
<li>与其他非自我结束元素一样，可以使用<code>div</code>元素来开始，然后在另一行使用<code>&lt;/div&gt;</code>来结束。</li>
</ul>
<h5 id="">过关目标</h5>
<ul>
<li>嵌套“Things cats love”和“Things cats hate”的两个列表到<code>div</code>元素之中</li>
</ul>
<blockquote>
<p>提示：把<code>&lt;div&gt;</code>开始标签放在"Things cats love"的<code>p</code>元素上方，然后<code>&lt;/div&gt;</code>结束标签在<code>&lt;/ol&gt;</code>的下方。最后整个<code>div</code>元素把所有内容包裹起来。</p>
</blockquote>
<h5 id="">过关条件</h5>
<ul>
<li><code>p</code>元素内容被包裹在<code>div</code>元素之中</li>
<li><code>ul</code>元素内容被包裹在<code>div</code>元素之中</li>
<li><code>ol</code>元素内容被包裹在<code>div</code>元素之中</li>
<li><code>div</code>元素必须有结束标签</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>使用<code>div</code>元素分割内容</li>
<li>使用<code>div</code>元素嵌套多个元素</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508235036344.png" alt="20200508235036344" width="2048" height="1660" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="htmldoctype">「第二十七关」声明 HTML 文档的 Doctype</h1>
<blockquote>
<p>关卡名：<code>Declare the Doctype of an HTML Document</code></p>
</blockquote>
<h5 id="">知识点</h5>
<p>到目前为止，我们闯过的关卡当中包括了特定的 HTML 元素以及使用。但是那些都是一个完成 HTML 页面的其中一部分。其实还有一些元素是每一个 HTML 页面都需要存在的。</p>
<p>在文章的顶部我们需要告诉浏览器，我们需要使用哪一个版本的 HTML。HTML 这个语言一直在持续更新升级。各大浏览器基本都兼容最新的配置与版本（那就是 HTML5）。但是还有一些浏览器只兼容一些历史版本的 HTML（例如旧版本的 IE 浏览器）。</p>
<ul>
<li>要告诉浏览器我们需要使用那个版本的 HTML，我们需要在 HTML 文件的头部添加<code>&lt;!DOCTYPE ...&gt;</code>，这里的<code>...</code>可以写入 HTML 的某个版本。如果是 HTML5 的话，那就是<code>&lt;!DOCTYPE html&gt;</code>即可。</li>
<li>在这个声明的代码中<code>!</code>和<code>DOCTYPE</code>都是非常重要的，而<code>DOCTYPE</code>也是必须大写的。然后<code>html</code>这个就无大小写限制了。</li>
<li>跟着这段文件 HTML 版本声明就是<code>html</code>元素。所有我们网页的代码和元素都必须在<code>html</code>元素内编写。</li>
</ul>
<p><strong>HTML 代码例子：</strong></p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;!-- Your HTML code goes here --&gt;
&lt;/html&gt;
</code></pre>
<h5 id="">过关目标</h5>
<ul>
<li>在代码区域第一行，加入<code>DOCTYPE</code>声明，并且选择使用 HTML5 版本。</li>
<li>声明后加入<code>html</code>元素，并且在<code>html</code>元素内嵌套一个<code>h1</code>标题元素。</li>
<li><code>h1</code>标题元素内必须含有一个标题文案，文案可以随意填写。</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li>代码中必须含有<code>&lt;!DOCTYPE html&gt;</code>标签。</li>
<li>代码中必须含有<code>html</code>元素。</li>
<li><code>html</code>元素必须包裹着一个<code>h1</code>元素。</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>如何声明 HTML 版本</li>
<li>使用<code>html</code>标签</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200509000812981.png" alt="20200509000812981" width="1492" height="482" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="html">「第二十八关」定义 HTML 文档的头部和主体</h1>
<blockquote>
<p>关卡名：<code>Define the Head and Body of an HTML Document</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>在标准的 HTML 文档结构中，我们需要丰富这个基础结构的分区。</li>
<li>所以在<code>html</code>元素中我们会分出<code>head</code>头部元素和<code>body</code>主体元素。</li>
<li>所有<strong>CSS 引用，字体引用，网页标题</strong>等等这些网页定义的内容都是放在<code>head</code>元素之内。</li>
<li>然后所有页面的布局元素都需要放在<code>body</code>元素之内。</li>
</ul>
<blockquote>
<p>小贴士：</p>
<p>我们用一个一个更好的理解方式，让我们更容易记住这个规则的原理。</p>
<ul>
<li>如果我们想一下，所有的知识，思想，印象等等就等同于 HTML 当中的"<strong>CSS 引用，字体引用，网页标题</strong>"，那东西是不是都应该在我们的脑袋里面呢？所以呀“<strong>CSS 引用，字体引用，网页标题</strong>”都应该放在<code>head</code>头部元素中！</li>
<li>我们的骨头和骨架是不是在我们身体内呢？所以剩下所有的页面布局代码就要放在<code>body</code>主体元素中！</li>
</ul>
</blockquote>
<p><strong>HTML 结构代码例子：</strong></p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;!-- metadata elements --&gt;
    &lt;!-- CSS引用，字体引用，网页标题等等元素 --&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;!-- page contents --&gt;
    &lt;!--页面的布局元素 --&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre>
<h5 id="">过关目标</h5>
<ul>
<li>代码区域里面有<code>title</code>页面标题元素，<code>h1</code>文章标题元素和<code>p</code>文章段落元素。</li>
<li>把<code>title</code>元素嵌套到一个<code>head</code>元素中。</li>
<li>剩余的<code>h1</code>和<code>p</code>的内容都嵌套到一个<code>body</code>元素中。</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li>只有一个<code>head</code>元素</li>
<li>只有一个<code>body</code>元素</li>
<li><code>head</code>元素需要被<code>html</code>元素包裹着</li>
<li><code>body</code>元素需要被<code>html</code>元素包裹着</li>
<li><code>title</code>元素需要被<code>head</code>元素包裹着</li>
<li><code>h1</code>和<code>p</code>元素都需要被<code>body</code>元素包裹着</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>建立完成的 HTML 文档结构</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="1920" height="100" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200509002635302.png" alt="20200509002635302" width="2048" height="1052" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="1920" height="250" loading="lazy"></p>
<h1 id="">「终」总结</h1>
<p><img src="https://img-blog.csdnimg.cn/20200509083941200.png" alt="20200509083941200" width="1714" height="658" loading="lazy"></p>
<p>恭喜大家一起闯过 28 关。我们学习到了 HTML 与 HTML5 的基础知识。虽然说这些都是很基础的知识，可以说闯过这 28 关，前端入门级别都还没有到。但是庞大与伟大的事业和建筑物都是从稳固的基础建立起来的。无论是多么简单还是无比困难的任务，我们都需要耐心和细心对待，把每一件小事都做到极致，才能逐步壮大，成功才会在远方等着我们。</p>
<p>下一期，我们开始第二课，深入浅出 CSS 基础。一起继续闯关打怪，打开前端技术大门。敬请期待哦！</p>
<blockquote>
<p>我是<font color="#60AAF8"><b>三钻</b></font>，一个在<font color="#60AAF8"><b>技术银河</b></font>中和你们一起来终身漂泊学习。<br>
想看更多技术知识文章关注个人微信公众号《<strong>技术银河</strong>》！<br>
有问题可以在公众号留言咨询哦！下期再见 👋！</p>
</blockquote>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 44关学习CSS与CSS3基础「一」 ]]>
                </title>
                <description>
                    <![CDATA[ 「前言」 欢迎回来三钻的FCC前端教程，上一篇文章 [https://chinese.freecodecamp.org/news/28-html-html5-challenges/]我们通过 28 关学会了 HTML 与 HTML5 网页开发基础。这一期我们一起攻破前端第二大知识点《CSS 基础入门》。因为这一课一共有 44 关，我把文章分成两期更新。敬请期待！ 「CSS 基础知识」 Cascading Style Sheet缩写为 CSS，顾名思义就是层叠样式表的意思。CSS 是 HTML 中的一个样式表，告诉浏览器网页上的文字和其他内容是如何展示的。 理解 CSS 以上是一个官方的定义。我们用一个更简单的方式理解 CSS 到底是一个什么东东： > 如果 HTML 是骨架，那 CSS 就是装饰这个骨架的一层皮和身上的装饰品。我们可以通过 CSS 控制皮肤的颜色，毛孔的粗细。甚至还可以控制我们装饰品上的特效，动效等等（有 LED 灯的口罩也是一种特效）。 回归 HTML 中的 CSS，我们可以使用 CSS 控制哪些东西呢？  * color：颜色  * fonts：字体   ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/44-css-css3-challenges-1/</link>
                <guid isPermaLink="false">5f1177b9db4be8080eb712a6</guid>
                
                    <category>
                        <![CDATA[ CSS ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 自学编程 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ 三钻 ]]>
                </dc:creator>
                <pubDate>Sat, 18 Jul 2020 10:11:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2020/07/banner2.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <h1 id="">「前言」</h1>
<p>欢迎回来三钻的<code>FCC前端教程</code>，<a href="https://chinese.freecodecamp.org/news/28-html-html5-challenges/">上一篇文章</a>我们通过 28 关学会了 HTML 与 HTML5 网页开发基础。这一期我们一起攻破前端第二大知识点《CSS 基础入门》。因为这一课一共有 44 关，我把文章分成两期更新。敬请期待！</p>
<h1 id="css">「CSS 基础知识」</h1>
<p><code>Cascading Style Sheet</code>缩写为 CSS，顾名思义就是<code>层叠样式表</code>的意思。CSS 是 HTML 中的一个样式表，告诉浏览器网页上的文字和其他内容是如何展示的。</p>
<h2 id="css">理解 CSS</h2>
<p>以上是一个官方的定义。我们用一个更简单的方式理解 CSS 到底是一个什么东东：</p>
<blockquote>
<p>如果 HTML 是骨架，那 CSS 就是装饰这个骨架的一层皮和身上的装饰品。我们可以通过 CSS 控制皮肤的颜色，毛孔的粗细。甚至还可以控制我们装饰品上的特效，动效等等（有 LED 灯的口罩也是一种特效）。</p>
</blockquote>
<p>回归 HTML 中的 CSS，我们可以使用 CSS 控制哪些东西呢？</p>
<ul>
<li><strong>color</strong>：颜色</li>
<li><strong>fonts</strong>：字体</li>
<li><strong>positioning</strong>：定位</li>
<li><strong>spacing</strong>：间隙</li>
<li><strong>sizing</strong>：大小</li>
<li><strong>decoration</strong>：装饰</li>
<li><strong>transition</strong>：过渡/特效/动效</li>
</ul>
<h2 id="">应用方式</h2>
<blockquote>
<p>我们一共有 3 种应用 CSS 样式的方法。</p>
<ol>
<li>我们可以在 HTML 元素行内的<code>style</code>中编写样式；</li>
<li>在 HTML 文档中添加<code>&lt;style&gt;</code>标签，然后在标签内编写 CSS 代码；</li>
<li>把 CSS 样式单独写入一个<code>CSS</code>样式文件，然后在需要使用的 HTML 文档中使用<code>&lt;link&gt;</code>引入。</li>
</ol>
</blockquote>
<p>一般项目中都会选择使用第三种方式，因为比较大型的前端页面，很多样式都是<strong>有重复性的</strong>，应用引入型的 CSS 样式，我们就可以把通用的写在一起然后在所有 HTML 中引入即可，不需要重复编写。并且可以把 CSS<strong>分类存放</strong>，<strong>提高可读性</strong>和<strong>可维护性</strong>。</p>
<h2 id="css">CSS 原理</h2>
<p>CSS 背后的原理是，使用 CSS 选择器选中 DOM（文档对象模型）里面的某个 HTML 元素。然后将各种 CSS 样式和属性应用到该元素中，从而改变元素在页面中的展现方式或者样式。</p>
<blockquote>
<p>在本节中，我们将学会如何应用 CSS 样式到 CatPhotoApp 的元素中，从而将它从简单的文本装修成一个页面。让我们立即开始吧！</p>
</blockquote>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="600" height="400" loading="lazy"></p>
<h1 id="">「第一关」改变文字颜色</h1>
<blockquote>
<p>关卡名：<code>Change the Color of Text</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>我们这一关来尝试改变文本中一些文字的颜色；</li>
<li>我们可以给<code>h2</code>元素添加<code>style</code>属性，然后使用样式属性改变文字颜色；</li>
<li><code>color</code>就是用来定义文字颜色的样式属性；</li>
</ul>
<p>以下例子演示如何给<code>h2</code>应用一个蓝色字体颜色的代码：</p>
<pre><code class="language-html">&lt;h2 style="color: blue;"&gt;CatPhotoApp&lt;/h2&gt;
</code></pre>
<blockquote>
<p><strong>注意：</strong> 在行内样式中，所有样式属性结束后需要加上一个<code>;</code>符号，代表这一个样式属性定义结束。然后后面还可以加入更多的样式属性。</p>
</blockquote>
<h5 id="">过关目标</h5>
<ul>
<li>改变<code>h2</code>的文字颜色为红色(<code>red</code>)；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>h2</code>元素中需要有<code>style</code>属性；</li>
<li><code>h2</code>元素的<code>color</code>样式属性应该赋予<code>red</code>这个值；</li>
<li><code>style</code>属性值里的样式属性应该以<code>;</code>符号结束；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>行内添加<code>style</code>样式属性;</li>
<li>字体颜色样式属性<code>color</code>;</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200514110356406.png" alt="20200514110356406" width="600" height="400" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="600" height="400" loading="lazy"></p>
<h1 id="css">「第二关」使用 CSS 选择器改变元素样式</h1>
<blockquote>
<p>关卡名：<code>Change the Color of Text</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>CSS 有几百种样式属性可应用到一个 HTML 元素中，来改变它在页面中的显示方式。</li>
<li>上一关编写的<code>&lt;h2 style="color: red;"&gt;CatPhotoApp&lt;/h2&gt;</code>，这里我们使用行内样式，使用了文字颜色样式来单独改变<code>h2</code>元素中的文字。</li>
<li>这种应用方式只能单独针对 HTML 中某一个元素进行样式影响，但是更好的方式是使用 CSS 样式表。</li>
</ul>
<p>在代码的最顶端加入<code>style</code>标签：</p>
<pre><code class="language-html">&lt;style&gt;&lt;/style&gt;
</code></pre>
<p>在<code>style</code>中，使用<strong>CSS 选择器</strong>选中所有<code>h2</code>标签，并且给所有<code>h2</code>标签加入字体颜色样式属性<code>color: red</code>：</p>
<pre><code class="language-html">&lt;style&gt;
  h2 {
    color: red;
  }
&lt;/style&gt;
</code></pre>
<blockquote>
<p><strong>注意：</strong> 选择器名中的样式元素必须用两个大括号包裹着 (开始<code>{</code>与结束<code>}</code>)。在样式属性的最后必须加入一个分号<code>;</code>来结束。</p>
</blockquote>
<h5 id="">过关目标</h5>
<ul>
<li>删除<code>h2</code>行内样式;</li>
<li>在代码顶部加入<code>style</code>样式表代码区;</li>
<li>在样式代码区使用 CSS 选择器把所有<code>h2</code>元素内的字体改变为蓝色<code>blue</code>;</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>h2</code>元素中的<code>style</code>属性需要被移除；</li>
<li>需要创建一个<code>style</code>元素；</li>
<li><code>h2</code>元素中的文字应该是蓝色<code>blue</code>的；</li>
<li>样式表中的样式属性都应该遵循规范，有<strong>大括号</strong>和结束时的<strong>分号</strong>；</li>
<li><code>style</code>元素有接受标签；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>使用<code>style</code>元素</li>
<li>CSS 样式元素规范</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/2020051414272899.png" alt="2020051414272899" width="600" height="400" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="600" height="400" loading="lazy"></p>
<h1 id="css">「第三关」使用 CSS 类</h1>
<blockquote>
<p>关卡名：<code>Use a CSS Class to Style an Element</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>CSS 中的类是为了解决服用样式的问题；</li>
</ul>
<p><strong>类声明例子：</strong></p>
<pre><code class="language-html">&lt;style&gt;
  .blue-text {
    color: blue;
  }
&lt;/style&gt;
</code></pre>
<ul>
<li>在<code>style</code>元素中我们编写了一个<code>.blue-text</code>CSS 类（CSS 类需要在我们的名字前加入<code>.</code>符号, 然后 CSS 类的命名规范必须使用<code>-</code>分割）；</li>
<li>接着我们可以把这个类加入 HTML 元素中，比如：<code>&lt;h2 class="blue-text"&gt;CatPhotoApp&lt;/h2&gt;</code>；</li>
<li>只要给我们需要应用字体颜色为蓝色的 HTML 元素上加入<code>class="blue-text"</code>，即可获得该 CSS 类的样式属性。</li>
<li>记住在 HTML 中加入类，是不需要<code>.</code>这个符号在最前面的。</li>
</ul>
<h5 id="">过关目标</h5>
<ul>
<li>在<code>style</code>元素中，把<code>h2</code>CSS 选择器改为<code>.red-text</code>；</li>
<li>并且把颜色值从<code>blue</code>改为<code>red</code>;</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>h2</code>元素的问题应该是红色的；</li>
<li><code>h2</code>元素应该拥有一个<code>red-text</code>的类；</li>
<li><code>style</code>样式表中有定义一个<code>.red-text</code>，并且样式属性<code>color</code>的值为<code>red</code>;</li>
<li>不允许在<code>h2</code>中使用行内<code>style</code>属性来改变元素的字体颜色；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>在 CSS 样式表中定义类；</li>
<li>在 HTML 元素中加入类；</li>
<li>用类改变 HTML 元素的样式；</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200514145149216.png" alt="20200514145149216" width="600" height="400" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="600" height="400" loading="lazy"></p>
<h1 id="css">「第四关」使用 CSS 类改变多个元素样式</h1>
<blockquote>
<p>关卡名：<code>Change the Color of Text</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>一个类可以赋予给多个元素，让所有被赋予同一个类的元素拥有同一套样式；</li>
</ul>
<blockquote>
<p>几年前<code>twitter</code>公司很火的前端框架<code>bootstrap</code>，就是结合很多这种分类好的的类，让我们在 HTML 元素中组合使用就可以快速布局网页。所以合理的分类好不同种类的类，然后给他们一种特定用途，有利于 CSS 开发时提高代码复用性，提高可读性和可维护性。</p>
</blockquote>
<h5 id="">过关目标</h5>
<ul>
<li>给代码中第一个<code>p</code>元素也加入<code>red-text</code>类;</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>h2</code>元素的文字应该是红色；</li>
<li><code>h2</code>元素应该拥有一个<code>red-text</code>类属性；</li>
<li>第一个<code>p</code>元素的内容应该是红色；</li>
<li>第二和第三个<code>p</code>元素的内容颜色应该不是红色；</li>
<li>第一个<code>p</code>元素应该拥有一个<code>red-text</code>类属性；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>用类名对多个 HTML 元素赋予同一个样式；</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200514150120127.png" alt="20200514150120127" width="600" height="400" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="600" height="400" loading="lazy"></p>
<h1 id="">「第五关」改变文字大小</h1>
<blockquote>
<p>关卡名：<code>Change the Color of Text</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>字体大小是<code>font-size</code>样式属性控制的；</li>
</ul>
<pre><code class="language-css">h1 {
  font-size: 30px;
}
</code></pre>
<h5 id="">过关目标</h5>
<ul>
<li>在<code>style</code>元素中，<code>.red-text</code>下方加入<code>p</code>元素选择器；</li>
<li>在<code>p</code>选择器中加入<code>font-size</code>样式属性，并且把值设置为<code>16px</code>（16 像素）；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li>在<code>style</code>元素中为<code>p</code>元素的内容的字体改为<code>16px</code>的大小；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>改变元素字体大小；</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200514153424512.png" alt="20200514153424512" width="600" height="400" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="600" height="400" loading="lazy"></p>
<h1 id="">「第六关」改变元素字体</h1>
<blockquote>
<p>关卡名：<code>Set the Font Family of an Element</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>使用<code>font-family</code>样式属性，我们可以定义一个元素所使用的字体；</li>
<li>举例，如果我们想<code>h2</code>元素使用<code>sans-serif</code>字体，在 CSS 中需要这么些：</li>
</ul>
<pre><code class="language-css">h2 {
  font-family: sans-serif;
}
</code></pre>
<h5 id="">过关目标</h5>
<ul>
<li>让所有<code>p</code>元素使用<code>monospace</code>字体；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li>所有<code>p</code>元素都使用<code>monospace</code>字体；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>使用 CSS 样式属性制定元素使用的字体；</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/2020051415471048.png" alt="2020051415471048" width="600" height="400" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="600" height="400" loading="lazy"></p>
<h1 id="google">「第七关」引入 Google 字体</h1>
<blockquote>
<p>关卡名：<code>Import a Google Font</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>在我们的操作系统中，会有很多通用的字体可以使用。但是除了这些字体之外我们还可以引入自定义字体，也叫<code>web fonts</code>网页字体。</li>
<li>在项目中，有一些设计师会使用一些特殊的字体，主要是为了提高整体页面的美观和协调，这种也是非常常见的。</li>
<li>这个时候我们就需要在 HTML 中引入字体了。</li>
<li>这个关卡我们使用了<code>Google Fonts</code>库（顾名思义，就是使用谷歌公司提供的公开字体库 - 也就是免费使用的）</li>
</ul>
<blockquote>
<p><strong>注意：</strong> 如果我们无法访问谷歌字体的话，这一关是无法过的，只能跳过。但是作为开发人员，我们是有办法的。（你们懂的 😂）</p>
</blockquote>
<ul>
<li>要引入谷歌字体，我们只需要在 HTML 中加入谷歌字体的 URL；</li>
<li>这个关卡中我们需要引入谷歌字体库中的<code>Lobster</code>字体；</li>
<li>我们只需要复制黏贴以下代码，加入到我们代码的顶端即可（如果是在正常的 HTML 文件格式中，就是加入到<code>&lt;meta&gt;&lt;/meta&gt;</code>标签之中）；</li>
</ul>
<pre><code class="language-html">&lt;link href="https://fonts.googleapis.com/css?family=Lobster" rel="stylesheet" type="text/css" /&gt;
</code></pre>
<ul>
<li>现在我们可以在 CSS 中使用<code>font-family: Lobster;</code>, <code>font-family</code>字体属性值的格式是: <code>font-family: FAMILY_NAME, GENERIC_NAME;</code>;</li>
<li>里面的<code>FAMILY_NAME</code>就是指定的字体名，如果这个字体找不到，或者语言不适应的话，就会往后面定义的字体进行应用；</li>
<li>换言之<code>GENERIC_NAME</code>就是后备字体，可以用<code>,</code>分割输入多个，这个也会在下一关详细解说；</li>
<li>如果我们的字体名中含有空格，那我们就需要用<strong>双引号</strong>包裹着，例如：<code>"Open Sans"</code>。因为<code>Lobster</code>这个字体不存在这种情况，所以不需要使用双引号；</li>
</ul>
<h5 id="">过关目标</h5>
<ul>
<li>创建一个<code>font-family</code>CSS 规则，并且使用<code>Lobster</code>字体。必须保证我们的<code>h2</code>元素应用了这个字体定义。</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li>引入了谷歌字体库中的<code>Lobster</code>字体；</li>
<li><code>h2</code>元素中的字体使用了<code>Lobster</code>字体；</li>
<li>使用<code>h2</code>CSS 选择器的来改变字体；</li>
<li>其他<code>p</code>元素应该保持原来的<code>monospace</code>字体；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>引入谷歌字体;</li>
<li>使用谷歌字体;</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200514162145246.png" alt="20200514162145246" width="600" height="400" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="600" height="400" loading="lazy"></p>
<h1 id="">「第八关」定义字体如何往后取用</h1>
<blockquote>
<p>关卡名：<code>Specify How Fonts Should Degrade</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>浏览器中有好几个可用的默认的字体，最普通的字体有：<code>monospace</code>, <code>serif</code> 和 <code>sans-serif</code>；</li>
<li>当一个字体不存在或者无法使用时，我们可以告诉浏览器**“往后取用”**下一个指定的字体；</li>
<li>举例：如果<code>Helvetic</code>作为我们的默认字体，当这个字体无法使用的时候自动往后选择使用<code>sans-serif</code>字体，这种场景我们就需要用以下方式：</li>
</ul>
<pre><code class="language-css">p {
  font-family: Helvetica, sans-serif;
}
</code></pre>
<p><code>Generic font family</code>的字体名是没有大小写限制的，只要名字正确就可以了。并且不需要双引号，因为它们是 CSS 关键词而已。</p>
<h5 id="">过关目标</h5>
<ul>
<li>首先给<code>h2</code>追加<code>monospace</code>字体，让<code>h2</code>元素拥有默认字体为<code>Lobster</code>，备用自己为<code>monospace</code>；</li>
<li>上一关卡，我们使用<code>link</code>标签引入了谷歌字体库中的<code>Lobster</code>字体。这里我们注释掉这个引用，从而<code>Lobster</code>这个字体就变成无法使用了，所以<code>h2</code>元素中就会往后取用<code>monospcae</code>字体；</li>
</ul>
<blockquote>
<p><strong>注意</strong>： 如果我们的电脑中安装了<code>Lobster</code>字体，那这个例子中的<code>Lobster</code>字体是可用的，自然就无法看到浏览器往后取用的效果了。</p>
</blockquote>
<h5 id="">过关条件</h5>
<ul>
<li><code>h2</code>元素使用<code>Lobster</code>字体；</li>
<li>当<code>Lobster</code>字体无法使用时，<code>h2</code>元素应该往后取用<code>monospace</code>字体；</li>
<li>注释掉谷歌字体库的引用，在<code>link</code>标签的签名加入<code>&lt;!--</code>和在结尾加入<code>--&gt;</code>；</li>
<li>注释的结尾必须有<code>--&gt;</code>；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>给 HTML 元素追加后备字体；</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200514174718492.png" alt="20200514174718492" width="600" height="400" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="600" height="400" loading="lazy"></p>
<h1 id="">「第九关」控制图片大小</h1>
<blockquote>
<p>关卡名：<code>Size Your Images</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>CSS 中有一个样式属性叫<code>width</code>（宽度），顾名思义这个元素是用来控制元素的宽度的；</li>
<li>与字体大小一样，我们使用<code>px</code>（像素）为单位来定义图片的宽度</li>
<li>举例：如果我们创建一个 CSS 类<code>larger-image</code>，并且使用这个类来把 HTML 元素的宽度定义为 500 像素，我们就用以下写法：</li>
</ul>
<pre><code class="language-css">&lt;style&gt;
  .larger-image {
    width: 500px;
  }
&lt;/style&gt;
</code></pre>
<h5 id="">过关目标</h5>
<ul>
<li>创建一个<code>smaller-image</code>的 CSS 类，并且用这个类来缩小一个图片的大小为 100 像素宽；</li>
</ul>
<blockquote>
<p><strong>注意</strong>：因为浏览器的设置，有一些用户会默认把网页放大缩小了，不是默认的 100%。如果是的话，请还原 100%伸缩值后才能正常通过此关哦！</p>
</blockquote>
<h5 id="">过关条件</h5>
<ul>
<li><code>img</code>元素需要有<code>smaller-imge</code>类；</li>
<li><code>img</code>元素应该是<code>100px</code>宽，并且浏览器缩放是在 100%；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>控制元素宽度</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200515085031226.png" alt="20200515085031226" width="600" height="400" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="600" height="400" loading="lazy"></p>
<h1 id="">「第十关」添加元素边框</h1>
<blockquote>
<p>关卡名：<code>Add Borders Around Your Elements</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>CSS 边框有这些属性：<code>style</code>, <code>color</code> 和 <code>width</code>；</li>
<li>举例：如果我们想给一个 HTML 元素创建一个红色的，5 像素边框，我们就需要用这样一个 CSS 类来实现；</li>
</ul>
<pre><code class="language-css">&lt;style&gt;
  .thin-red-border {
    border-color: red;
    border-width: 5px;
    border-style: solid;
  }
&lt;/style&gt;
</code></pre>
<p>还有一种更简单快捷的写法：</p>
<pre><code class="language-css">&lt;style&gt;
.thin-red-border {
  border: 5px red solid;
}
&lt;/style&gt;
</code></pre>
<h5 id="">过关目标</h5>
<ul>
<li>创建一个类叫<code>thick-green-border</code>；</li>
<li>这个 CSS 类给 HTML 元素加入一个 10px，实线（solid）和绿色（green）的边框；</li>
<li>给我们的猫咪图片加入这个类；</li>
</ul>
<blockquote>
<p><strong>记住</strong>：我们是可以给 HTML 元素中的<code>class</code>属性添加多个类，只要使用空格分隔即可。如：<br>
<code>&lt;img class="class1 class2"&gt;</code></p>
</blockquote>
<h5 id="">过关条件</h5>
<ul>
<li><code>img</code>元素需要有<code>smaller-imge</code>类；</li>
<li><code>img</code>元素需要有<code>thick-green-border</code>类；</li>
<li>图片应有一个 10px 宽的边框；</li>
<li>图片应有一个实线的边框样式；</li>
<li>图片应有一个绿色的边框样式；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>给元素添加边框；</li>
<li>给边框加入宽度，线的样式和颜色；</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200515103353182.png" alt="20200515103353182" width="600" height="400" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="600" height="400" loading="lazy"></p>
<h1 id="borderradius">「第十一关」使用 border-radius 实现圆边</h1>
<blockquote>
<p>关卡名：<code>Add Rounded Corners with border-radius</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>我们的喵咪图片现在是直角边的；</li>
<li>我们可以使用<code>border-radius</code>把图片的四个角改圆边；</li>
</ul>
<h5 id="">过关目标</h5>
<ul>
<li>我们可以给<code>border-radius</code>一个弧度像素值；</li>
<li>现在给我们的猫咪图片一个<code>10px</code>的<code>border-radius</code>；</li>
</ul>
<blockquote>
<p><strong>注意</strong>：这一关中，是有多个接单方案的：</p>
<ol>
<li>在<code>.thick-green-border</code>中添加<code>border-radius</code>；</li>
<li>在<code>.smaller-image</code>中添加<code>border-radius</code>；</li>
</ol>
</blockquote>
<h5 id="">过关条件</h5>
<ul>
<li><code>img</code>元素需要有<code>thick-green-border</code>类；</li>
<li>图片应有一个 10px 的边框弧度；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>给属性边框弧度；</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200515110109963.png" alt="20200515110109963" width="600" height="400" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="600" height="400" loading="lazy"></p>
<h1 id="">「第十二关」实现圆形图片</h1>
<blockquote>
<p>关卡名：<code>Make Circular Images with a border-radius</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>CSS 的<code>border-radius</code>属性不止可以使用像素为单位，我们还可以使用百分比；</li>
</ul>
<h5 id="">过关目标</h5>
<ul>
<li>给我们的猫咪图片一个<code>50%</code>的<code>border-radius</code>；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li>图片应有一个<code>50%</code>的边框弧度；</li>
<li>图片的边框弧度必须是一个百分比值<code>50%</code>；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>给元素添加百分比弧度值；</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200515110600282.png" alt="20200515110600282" width="600" height="400" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="600" height="400" loading="lazy"></p>
<h1 id="">「第十三关」给元素一个背景颜色</h1>
<blockquote>
<p>关卡名：<code>Give a Background Color to a div Element</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>我们可以使用<code>background-color</code>属性来设置一个元素的背景颜色；</li>
<li>举例：如果我们想给一个元素绿色（<code>green</code>）的背景，我们就要给予这个元素一个<code>background-color</code>属性；</li>
</ul>
<pre><code class="language-css">.green-background {
  background-color: green;
}
</code></pre>
<h5 id="">过关目标</h5>
<p>Create a class called <code>silver-background</code> with the <code>background-color</code> of silver. Assign this class to your <code>div</code> element.</p>
<ul>
<li>创建一个 CSS 类<code>silver-background</code>，其中加入<code>background-color</code>属性和属性值为<code>silver</code>；</li>
<li>然后把这个类加入到<code>div</code>元素的<code>class</code>属性中；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>div</code>元素应有一个<code>silver-background</code>类；</li>
<li><code>div</code>元素应有银色（silver）背景颜色；</li>
<li><code>style</code>标签中应该有一个<code>.silver-background</code>类选择器，并且有<code>background-color</code>属性和属性值为<code>silver</code>；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>给元素添加背景颜色；</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200515111343722.png" alt="20200515111343722" width="600" height="400" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="600" height="400" loading="lazy"></p>
<h1 id="id">「第十四关」给元素 ID 值</h1>
<blockquote>
<p>关卡名：<code>Set the id of an Element</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>除了<code>class</code>CSS 类属性，我们还可以给每一个 HTML 元素一个<code>id</code>属性；</li>
<li><code>id</code>属性是有好几个实用的用途的：我们可以用<code>id</code>选择器来给一个元素 CSS 样式属性，同时也可以让 JavaScript 找到指定<code>id</code>的元素，并且对此进行修改等；</li>
<li>记住，<code>id</code>属性的属性值应该是唯一的；</li>
<li>浏览器不会强制要求<code>id</code>的唯一性，但是在实践中被广大认可<code>id</code>是需要唯一的，所以不要在多个一个元素中赋予同一个<code>id</code>属性；</li>
</ul>
<p>举例：在我们的<code>h2</code>元素中添加一个<code>id</code>属性<code>cat-photo-app</code>：</p>
<pre><code class="language-html">&lt;h2 id="cat-photo-app"&gt;&lt;/h2&gt;
</code></pre>
<h5 id="">过关目标</h5>
<ul>
<li>给<code>form</code>元素添加一个<code>id</code>属性值<code>cat-photo-form</code>；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li>表格元素中需要有个<code>id</code>属性值为<code>cat-photo-form</code>；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>给元素添加<code>id</code>属性；</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200515113512927.png" alt="20200515113512927" width="600" height="400" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="600" height="400" loading="lazy"></p>
<h1 id="id">「第十五关」使用 ID 更改元素样式</h1>
<blockquote>
<p>关卡名：<code>Use an id Attribute to Style an Element</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li><code>id</code>属性与 CSS 类一样可以为他们绑上 CSS 样式；</li>
<li>但是区别是<code>id</code>是无法复用，只能给予一个元素（源自于我们上一关所说的原因）；</li>
<li>在权重之中<code>id</code>在样式表中相对比 CSS 类，它有更好的权重，如果<code>class</code>和<code>id</code>的样式同时给予一个元素，那<code>id</code>的样式会覆盖类的样式；</li>
</ul>
<p>举例：我们现在给一个<code>id</code>属性为<code>cat-photo-element</code>，然后给这个<code>id</code>属性在样式表中绑定一个背景颜色<code>background-color</code>为绿色<code>green</code>。</p>
<pre><code class="language-css">#cat-photo-element {
  background-color: green;
}
</code></pre>
<blockquote>
<p><strong>注意</strong>：在我们的样式表<code>&lt;style&gt;</code>中，我们用<code>. + 类</code>名来声明类的样式，但是如果是<code>id</code>的话我们会用<code># + id名</code>来声明<code>id</code>的样式。</p>
</blockquote>
<h5 id="">过关目标</h5>
<ul>
<li>现在尝试给我们的<code>form</code>元素一个<code>id</code>属性，属性值为<code>cat-photo-form</code>；</li>
<li>并且在样式表中给予这个<code>id</code>一个绿色（<code>green</code>）的背景颜色；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>form</code>元素中应有一个<code>id</code>属性为<code>cat-photo-form</code>；</li>
<li><code>form</code>元素的背景颜色应该是绿色的；</li>
<li><code>form</code>元素应有<code>id</code>属性；</li>
<li><code>form</code>元素中不能有<code>class</code>或者<code>style</code>；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>使用<code>id</code>属性；</li>
<li>在样式表中声明<code>id</code>属性的样式；</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200515141645329.png" alt="20200515141645329" width="600" height="400" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="600" height="400" loading="lazy"></p>
<h1 id="">「第十六关」给元素添加内边距</h1>
<blockquote>
<p>关卡名：<code>Adjust the Padding of an Element</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>我们把 Cat Photo App 放一边，先来学习更多的 HTML 样式；</li>
<li>可能大家都注意到了，HTML 的元素基本上都是一个个像积木一样的正方形盒子组成的；</li>
<li>在排版中最常用的三大属性，它们是用来控制 HTML 元素之间的空隙的：<code>padding</code>（内边距），<code>margin</code>（外边距）和<code>border</code>（ 边框）；</li>
<li>一个元素的<code>padding</code>，控制一个元素内容四边的空间，还有内容与<code>border</code>边框的距离；</li>
<li>在预览区中的蓝色与红色盒子被包裹在一个黄色盒子之中，我们应该注意到，红色盒子的<code>padding</code>比蓝色盒子的边距要宽；</li>
</ul>
<p>如果想更深入的理解内容与<code>margin</code>，<code>padding</code>和<code>border</code>之间距离，我们需要一个更好的图解方式，请看下图：</p>
<p><img src="https://img-blog.csdnimg.cn/20200515153110673.png#pic_center" alt="20200515153110673" width="600" height="400" loading="lazy"></p>
<p>上图中有 3 组颜色，从内到外：<font color="blue">蓝色</font>是<code>content</code>(内容部分)，<font color="green">绿色</font>部分是<code>padding</code>(内边距)，<font color="#FFC300">黄色</font>部分是<code>border</code>(边框)，最外面的<font color="#FF5733">橙色</font>部分是<code>margin</code>(外边距)。通过这个图，我们就能清晰理解这些边距的实际产生的距离的效果。</p>
<ul>
<li>这里我们可以看到，当我们加大蓝色盒子的<code>padding</code>，盒子内容里面的字体与边框的距离就越远；</li>
</ul>
<h5 id="">过关目标</h5>
<p>Change the <code>padding</code> of your blue box to match that of your red box.</p>
<ul>
<li>改变蓝色盒子的<code>padding</code>，从而让蓝色盒子与红色盒子的<code>padding</code>一致；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li>蓝色盒子的<code>padding</code>应改为<code>20px</code>；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>使用<code>padding</code>（内边距），<code>margin</code>（外边距）和<code>border</code>(边框)；</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/2020051516424180.png" alt="2020051516424180" width="600" height="400" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="600" height="400" loading="lazy"></p>
<h1 id="">「第十七关」调整元素外边距</h1>
<blockquote>
<p>关卡名：<code>Adjust the Margin of an Element</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>一个元素的<code>margin</code>(外边距)，控制这个元素与周围元素之间的空间；</li>
<li>所以我们可以看到黄色盒子内的蓝色盒子与红色盒子，红色盒子拥有一个更大的<code>margin</code>，同时让红色盒子看起来更小了；</li>
<li>当我们加大蓝色盒子的<code>margin</code>的时候，也会看到同等的变化。因为蓝色盒子与周边元素的间距会加大，同时蓝色盒子的<code>content</code>内容可以用的空间就需要伸缩适应。最后蓝色盒子就会变小了；</li>
</ul>
<p>为了更好的理解为什么内容区域宽高会变动，我们先来看看红色盒子的空间信息：</p>
<p><img src="https://img-blog.csdnimg.cn/20200515170336559.png#pic_center" alt="20200515170336559" width="600" height="400" loading="lazy"></p>
<p>首先这个例子中，红色盒子的<code>content</code>内容区域是没有给宽高的，所以会根据浏览器窗口大小适应。也就是说，内容区域是一个弹性宽高盒子。这个时候我们给了<code>20px</code>的<code>padding</code>，<code>5px</code>的<code>border</code>，<code>20px</code>的<code>margin</code>。那盒子的总宽高是多少？</p>
<p>这个时候盒子的总宽高 = <code>content宽高</code> + <code>padding</code> + <code>border</code> + <code>margin</code> 对吧？</p>
<p>假设现在浏览器窗口的宽度是<code>1000px</code>，这里我们先假设外层没有一个黄色盒子，这个红色盒子可以填满这个浏览器宽度。这个时候红色盒子的<code>content</code>宽度就是:</p>
<blockquote>
<p>1000 - 20*2 (左右的<code>margin</code>外边距) - 5*2(左右的<code>border</code>边框) - 20*2(左右的<code>padding</code>内边距) = 910px。</p>
</blockquote>
<p>如果现在我把浏览器窗口变成 800px 呢？安装刚刚的公式我们会得出 710px，对内容部分少了 200px。</p>
<p>好了按照我们刚刚的公式，现在浏览器窗口宽度不变，只把<code>margin</code>外边距加大，这个时候内容是不是也会变？因为最终内容区域的大小都是受到<code>margin</code>，<code>border</code>和<code>padding</code>的总额所影响的？所以在上面的例子里面我们发现加大了蓝色盒子的<code>margin</code>后，蓝色盒子显然是变小了。因为我们加大了<code>margin</code>。</p>
<p>同时也是因为我们看到的盒子大小是基于盒子的边框，不是真的在看盒子的<code>content</code>内容部分。</p>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="600" height="400" loading="lazy"></p>
<p>如果我们给盒子一个宽高后，我们加大<code>padding</code>时盒子就会变大。甚至有时候在排版的过程中，使用<code>padding</code>就会发现盒子会超出了父级的元素盒子。这里我们可以深入解说一下<strong>CSS 中的两种<code>盒模型</code></strong>：</p>
<p><strong>盒模型</strong>：<code>标准盒模型</code></p>
<ul>
<li>盒子宽度 = 内容的宽度</li>
<li>盒子高度 = 内容的高度</li>
</ul>
<blockquote>
<p>其他间距都是额外加入的，会影响盒子总体呈现的宽高</p>
</blockquote>
<p><img src="https://img-blog.csdnimg.cn/20200515172457162.png#pic_center" alt="20200515172457162" width="600" height="400" loading="lazy"></p>
<blockquote>
<p>如果不希望使用盒子的<code>padding</code>的时候影响盒子总体大小，我们就要把盒子变成<code>IE盒模型</code></p>
<p>在盒子的 CSS 中添加<code>box-sizing: border-box</code></p>
</blockquote>
<p><strong>盒模型</strong>：<code>IE盒模型</code></p>
<ul>
<li>盒子宽度 = border + padding + 内容的宽度</li>
<li>盒子高度 = border + padding + 内容的高度</li>
</ul>
<blockquote>
<p>盒子的框高包含了边框和内边距，所以整体的盒子高度不受<code>padding</code>和<code>border</code>影响。</p>
</blockquote>
<p><img src="https://img-blog.csdnimg.cn/20200515172930443.png#pic_center" alt="20200515172930443" width="600" height="400" loading="lazy"></p>
<h5 id="">过关目标</h5>
<ul>
<li>改变蓝色盒子的<code>margin</code>，从而让蓝色盒子和红色盒子又一样的展示效果；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>blue-box</code>类应有<code>20px</code>的<code>margin</code>；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li><code>margin</code>的使用；</li>
<li><code>padding</code>对盒子的宽高的影响；</li>
<li><code>标准盒模型</code>和<code>IE盒模型</code>；</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200516212158648.png" alt="20200516212158648" width="600" height="400" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="600" height="400" loading="lazy"></p>
<h1 id="">「第十八关」给元素负外边框</h1>
<blockquote>
<p>关卡名：<code>Add a Negative Margin to an Element</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>一个元素的<code>margin</code>控制它的周边与它的边框之间的空隙；</li>
<li>如果我们给一个元素一个负数的<code>margin</code>，这个元素会变大；</li>
</ul>
<blockquote>
<p>所以给一个元素负<code>margin</code>就会变大？是，也不是！<strong>但是为什么呢？<code>margin</code>是外边框，不应该会对元素的内容产生大小变动呀？</strong></p>
</blockquote>
<p>要回答这个疑问，我们首先来看看改为负<code>margin</code>之前和之后是怎么样的：</p>
<p><img src="https://img-blog.csdnimg.cn/2020051700262255.png#pic_center" alt="2020051700262255" width="600" height="400" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/20200517002916282.png#pic_center" alt="20200517002916282" width="600" height="400" loading="lazy"></p>
<ul>
<li>首先第一最外层的<strong>黄色盒子</strong>没有定义宽高，所以它是<strong>自适应浏览器窗口宽高</strong>；</li>
<li>第二我们没有给<strong>蓝色盒子</strong>定义宽高，所以它的内容宽高也是<strong>跟随着父级宽高</strong>；</li>
<li>蓝色盒子原本的<code>margin</code>是<code>20px</code>，那盒子的宽度就是<code>149 (内容)</code> + <code>20+20 (左右内边距)</code> + <code>5+5 (左右边框)</code> = <code>199px</code>，最后还有左右的<code>20px</code>的<code>margin</code>；</li>
<li>蓝色黑子换成了<code>margin</code>为<code>-15px</code>后，这时宽度就是 <code>219 (内容)</code> + <code>20+20 (左右内边距)</code> + <code>5+5 (左右边框)</code> = <code>269px</code>，最后左右的<code>-15px</code>的<code>margin</code>；</li>
<li>以上就是最后在浏览器的盒子属性的区别，这两个之中哪个的数值变了呢？对内容的宽度变了！为什么呢？</li>
<li><code>219</code> - <code>149</code> = <code>70px</code>，那这 70 像素的增加是从哪里来的呢？</li>
<li>对的！就是<code>-15px</code>和<code>20px</code>的区别。因为蓝色盒子没有定义宽度，所以宽度是自适应的。从左右负 15 来算一共给这个盒子左右各增加了 15 像素的空间。然后原本是 20 像素的边框现在没有了，所以另外再加了左右 20 像素的距离。一共就是<code>15+15+20+20</code> = <code>70</code>。就是这样我们的内容就多了<code>70px</code>的宽度，所以蓝色盒子总体来说是不是宽度扩大了<code>70px</code>呢？懂了！</li>
</ul>
<blockquote>
<p>问题来了，为什么刚刚说给一个元素的<code>margin</code>变化时，<code>会，也不会</code>导致元素放大呢？主要原因是因为我们这个例子中的蓝色盒子没有给宽度。如果给了宽度，盒子正数的<code>margin</code>和负数<code>margin</code>都不会影响这个盒子的宽的。所以<strong>只有当这个盒子的宽度是自适应的时候才会导致盒子变大变小</strong>哦。</p>
</blockquote>
<h5 id="">过关目标</h5>
<ul>
<li>给蓝色盒子一个负<code>margin</code>，让它与红色盒子的呈现样式一样；</li>
<li>把蓝色盒子的<code>margin</code>改为<code>-15px</code>，从而让蓝色盒子与红色盒子一样占了黄色盒子的总宽度；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>blue-gox</code>的类应有一个<code>-15px</code>的<code>margin</code>；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>给元素负<code>margin</code>；</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200517010824638.png" alt="20200517010824638" width="600" height="400" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="600" height="400" loading="lazy"></p>
<h1 id="">「第十九关」给元素每个边缘不同的内边距</h1>
<blockquote>
<p>关卡名：<code>Add Different Padding to Each Side of an Element</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>有时候我们需要自定义一个元素，并且要给一个元素每个边缘一个不同的<code>padding</code>；</li>
<li>CSS 让我们可以控制一个元素 4 个边的内边距，控制的属性分别是：<code>padding-top (上)</code>、<code>padding-right (右)</code>、<code>padding-bottom (下)</code>和<code>padding-left (左)</code>；</li>
</ul>
<h5 id="">过关目标</h5>
<ul>
<li>给予我们蓝色盒子的<strong>顶部</strong>与<strong>左边</strong><code>40px</code>的<code>padding</code>, 然后<strong>底部</strong>和<strong>右边</strong><code>20px</code>；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>blue-box</code>类中应有<code>40px</code>的<code>padding-top</code>；</li>
<li><code>blue-box</code>类中应有<code>20px</code>的<code>padding-right</code>；</li>
<li><code>blue-box</code>类中应有<code>20px</code>的<code>padding-bottom</code>；</li>
<li><code>blue-box</code>类中应有<code>40px</code>的<code>padding-left</code>；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>单独给每一个边缘不同的内边距；</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200517014532808.png" alt="20200517014532808" width="600" height="400" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="600" height="400" loading="lazy"></p>
<h1 id="">「第二十关」给元素每个边缘不同的外边距</h1>
<blockquote>
<p>关卡名：<code>Add Different Margins to Each Side of an Element</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>有时候我们需要自定义一个元素，并且要给一个元素每个边缘一个不同的<code>margin</code>；</li>
<li>CSS 让我们可以控制一个元素 4 个边的外边距，控制的属性分别是：<code>margin-top (上)</code>、<code>margin-right (右)</code>、<code>margin-bottom (下)</code>和<code>margin-left (左)</code>；</li>
</ul>
<h5 id="">过关目标</h5>
<ul>
<li>给予我们蓝色盒子的<strong>顶部</strong>与<strong>左边</strong><code>40px</code>的<code>margin</code>, 然后<strong>底部</strong>和<strong>右边</strong><code>20px</code>；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>blue-box</code>类中应有<code>40px</code>的<code>margin-top</code>；</li>
<li><code>blue-box</code>类中应有<code>20px</code>的<code>margin-right</code>；</li>
<li><code>blue-box</code>类中应有<code>20px</code>的<code>margin-bottom</code>；</li>
<li><code>blue-box</code>类中应有<code>40px</code>的<code>margin-left</code>；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>单独给每一个边缘不同的外边距；</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200517125928189.png#pic_center" alt="20200517125928189" width="600" height="400" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="600" height="400" loading="lazy"></p>
<h1 id="">「第二十一关」使用顺时针语法指定元素内边距</h1>
<blockquote>
<p>关卡名：<code>Use Clockwise Notation to Specify the Padding of an Element</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>除了使用<code>padding-top (上)</code>、<code>padding-right (右)</code>、<code>padding-bottom (下)</code>和<code>padding-left (左)</code>来给一个元素特定的内边距；</li>
<li>我们还可以在一行内写完一个元素的出内边距：<code>padding: 10px 20px 10px 20px;</code>；</li>
<li>这里面的四个数值顺时针的从上到左旋转来分配的：上，右，下，左；</li>
</ul>
<p><strong>其他语法：</strong></p>
<pre><code class="language-css">/* 应用于四个边 */
padding: 1em;

/* 垂直方向| 水平方向*/
padding: 5% 10%;

/* 顶部| 水平方向| 底部*/
padding: 1em 2em 2em;

/* 顶部| 右边| 底部| 左边*/
padding: 2px 1em 0 1em;
</code></pre>
<h5 id="">过关目标</h5>
<ul>
<li>顺时针语法指定<code>.blue-box</code>类的顶部和左边<code>padding</code>为<code>40px</code>，然后底部和右边<code>padding</code>为<code>20px</code>；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>blue-box</code>类中应有<code>40px</code>的顶部<code>padding</code>；</li>
<li><code>blue-box</code>类中应有<code>20px</code>的右边<code>padding</code>；</li>
<li><code>blue-box</code>类中应有<code>20px</code>的底部<code>padding</code>；</li>
<li><code>blue-box</code>类中应有<code>40px</code>的左边<code>padding</code>；</li>
<li>使用顺时针语法来分配<code>padding</code>；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>使用顺时针语法给元素分配内边距；</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/2020051713245681.png" alt="2020051713245681" width="600" height="400" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="600" height="400" loading="lazy"></p>
<h1 id="">「第二十二关」使用顺时针语法指定元素外边距</h1>
<blockquote>
<p>关卡名：<code>Use Clockwise Notation to Specify the Margin of an Element</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>除了<code>padding</code>可以使用顺时针语法，<code>margin</code>也一样可以；</li>
<li>除了使用<code>margin-top (上)</code>、<code>margin-right (右)</code>、<code>margin-bottom (下)</code>和<code>margin-left (左)</code>来给一个元素特定的外边距；</li>
<li>我们还可以在一行内写完一个元素的出外边距：<code>margin: 10px 20px 10px 20px;</code>；</li>
<li>这里面的四个数值顺时针的从上到左旋转来分配的：上，右，下，左；</li>
</ul>
<p><strong>其他语法：</strong></p>
<pre><code class="language-css">margin: 5%; /* 所有的边都是 5% 的边距 */

margin: 10px; /* 所有的边都是 10像素 的边距 */

margin: 1.6em 20px; /* 上和下边是 1.6字距, 左和右是 20像素 边距 */

margin: 10px 3% 1em; /* 上边 10像素, 左和右 3%, 下边 1字距 边距 */

margin: 10px 3px 30px 5px; /* 上边 10像素, 右边 3像素, bottom 30px, left 5px margin */

margin: 1em auto; /* 上和下边 1字距 边距, 该盒子是水平居中的 */

margin: auto; /* 该盒子是水平居中的, 上下边距为0 */
</code></pre>
<blockquote>
<p>在现代浏览器中，如果要把一些东西水平居中，使用 <code>display:flex; justify-content: center;</code> .</p>
<p>然而, 在一些老的浏览器，如 IE8-9, 这些是不可用的. 想要把一个元素在其父元素中居中, 使用 <code>margin: 0 auto;</code></p>
</blockquote>
<h5 id="">过关目标</h5>
<ul>
<li>顺时针语法指定<code>.blue-box</code>类的顶部和左边<code>margin</code>为<code>40px</code>，然后底部和右边<code>margin</code>为<code>20px</code>；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>blue-box</code>类中应有<code>40px</code>的顶部<code>margin</code>；</li>
<li><code>blue-box</code>类中应有<code>20px</code>的右边<code>margin</code>；</li>
<li><code>blue-box</code>类中应有<code>20px</code>的底部<code>margin</code>；</li>
<li><code>blue-box</code>类中应有<code>40px</code>的左边<code>margin</code>；</li>
<li>使用顺时针语法来分配<code>margin</code>；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>使用顺时针语法给元素分配外边距；</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/20200504230328260.png" alt="20200504230328260" width="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200517133101287.png#pic_center" alt="20200517133101287" width="600" height="400" loading="lazy"></p>
<p><img src="https://img-blog.csdnimg.cn/2020050422480843.png" alt="2020050422480843" width="600" height="400" loading="lazy"></p>
<h1 id="">「待续」总结</h1>
<p><img src="https://img-blog.csdnimg.cn/20200517140828852.png" alt="20200517140828852" width="600" height="400" loading="lazy"></p>
<p>这周我们一起闯过了 22 关，下一期我们会一起把剩余的 22 关完成。学习是一种像爬山一样的过程，要经历过漫长的上坡路，一步一个脚印。“<strong>路漫漫其修远兮，吾将上下而求索。</strong>”， 在追寻知识的道路上，前方的道路还很漫长，但我们将百折不挠，不遗余力地，上天下地的去追求和探索。让我们继续坚持学习，终身学习成长。在大前端的时代爬到技术的巅峰，做一个有深度的技术人员。</p>
<blockquote>
<p>我是<font color="#60AAF8"><b>三钻</b></font>，一个在<font color="#60AAF8"><b>技术银河</b></font>中和你们一起来终身漂泊学习。<br>
想看更多技术知识文章关注个人微信公众号《<strong>技术银河</strong>》！<br>
有问题可以在公众号留言咨询哦！下期再见 👋！</p>
</blockquote>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 2020 年 Web 开发者学习路线 ]]>
                </title>
                <description>
                    <![CDATA[ 今天，我最喜欢的老师之一，Brad Traversy，发布了一个视频，主题是在 2020 年，要成为一名 Web 开发者需要学习哪些知识。 Brad 主要强调了一点——也是我经常强调的——那就是：学习的时候不要感到畏惧或者手足无措。 我想提醒读者：freeCodeCamp 的课程涵盖了 Brad 所介绍的大部分工具，已经帮助 40,000 多学员获得开发者工作。如果你犹疑不决，大可以专注在 freeCodeCamp 学习。 Brad 过滤掉你在社交媒体上听过的各种炒作宣传，给出实事求是的建议。他的建议是切实可行的。我赞同他所建议学习的几乎所有知识。 为了方便起见，我在下面总结了他的一些主要见解。同时，我建议你观看他的完整视频，链接地址：https://youtu.be/0pThnRneDjw  。除了本文所总结的内容之外，他还在视频中详述了许多细节。这是一个时长 73 分钟的视频。 我还建议你订阅他的 Traversy Media YouTube 频道。在过去的十年中，Brad 一直是一位非常出色的老师，他发表了近 800 部有关技术的视频。 Brad 的订阅者数量已经快达 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/web-development-in-2020/</link>
                <guid isPermaLink="false">5e04bc64ca1efa04e196aad4</guid>
                
                    <category>
                        <![CDATA[ 自学编程 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 开发者 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ 长河渐落晓星沉 ]]>
                </dc:creator>
                <pubDate>Sun, 03 May 2020 04:39:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2021/04/photo-1576441335949-c4f4a2baf347.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>今天，我最喜欢的老师之一，Brad Traversy，发布了一个视频，主题是在 2020 年，要成为一名 Web 开发者需要学习哪些知识。</p><p>Brad 主要强调了一点——也是我经常强调的——那就是：学习的时候不要感到畏惧或者手足无措。</p><p>我想提醒读者：freeCodeCamp 的课程涵盖了 Brad 所介绍的大部分工具，已经帮助 40,000 多学员获得开发者工作。如果你犹疑不决，大可以专注在 freeCodeCamp 学习。</p><p>Brad 过滤掉你在社交媒体上听过的各种炒作宣传，给出实事求是的建议。他的建议是切实可行的。我赞同他所建议学习的几乎所有知识。</p><p>为了方便起见，我在下面总结了他的一些主要见解。同时，我建议你观看他的完整视频，链接地址：<a href="https://youtu.be/0pThnRneDjw" rel="nofollow">https://youtu.be/0pThnRneDjw</a> 。除了本文所总结的内容之外，他还在视频中详述了许多细节。这是一个时长 73 分钟的视频。</p><p>我还建议你订阅他的 Traversy Media YouTube 频道。在过去的十年中，Brad 一直是一位非常出色的老师，他发表了近 800 部有关技术的视频。</p><p>Brad 的订阅者数量已经快达到一百万。让我们看看是否可以帮助他在新的一年里达到一百万。<a href="https://www.youtube.com/user/TechGuyWeb" rel="nofollow">你可以在这里订阅</a>.</p><h1 id="2020-web-">2020 年的 Web 开发：概述</h1><p>该视频的主要目的是使你熟悉一些可供 Web 开发者使用的更主流的 Web 开发工具。</p><p>“我并不想用海量技术淹没你。这些只是你拥有的选择……目前存在很多技术。当你听到类似 Nuxt 或 Gatsby 的声音时，我想让你知道它是什么。然后你可以选择是否要学习。”</p><p>Brad 首先鼓励人们先问自己想做什么：是在一家产品公司工作，还是担任顾问，还是成为自由职业者，或者是构建自己的产品？</p><p>他关于学习什么的很多建议都归结为你的目标。因此，他提出了许多工具建议。</p><p>首先，他建议学习所谓的“必需品”。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2019/12/download--2-.png" class="kg-image" alt="download--2-" width="1280" height="720" loading="lazy"><figcaption>该幻灯片和所有后续幻灯片均来自 Brad 的视频。下划线表示他个人推荐的工具。</figcaption></figure><p>他指出了一件反直觉的事：你不需要花哨的计算机来进行 Web 开发。“这不像游戏引擎开发之类的东西，因此你可以使用一台中档笔记本或者台式机，有些情况下甚至一台低档计算机就够用了。”</p><p>Brad 使用 MacOS，Windows 10 和 Linux 配置云服务和一些媒体服务。</p><p>他非常喜欢 VS Code 的编辑器，并使用 Chrome 及其内置的 DevTools 进行基于浏览器的调试。另外，他认为 Firefox 也已经很成熟，并且是可行的替代方案。</p><p>他建议从标准 HTML 和 CSS 开始，并学习更新的 CSS 工具，例如 Flexbox 和 Grid。</p><p>他认为在 2020 年学习响应式网页设计是必须的，“你创建的每一个正式项目应该在各种设备上运行良好”。</p><p>他建议你练习构建自己的模块化 CSS 组件，以便在整个项目中重用，而不是依赖于 Bootstrap 之类的 CSS 框架。</p><p>说到这，他认为你在为不同雇主开发项目时可能会遇到选择 CSS 框架的问题。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2019/12/download--4-.png" class="kg-image" alt="download--4-" width="1280" height="720" loading="lazy"><figcaption>Bootstrap 目前仍然是最流行的 CSS 框架，但是也有其他一些被广泛使用的框架。</figcaption></figure><p>他特别提到了 Tailwind，这是我以前从未听说过的。Tailwind 与其他 CSS 框架略有不同。它着重于 "utility classes"，你可以将其组合以完成设计样式。</p><p>意料之中的是，Brad 推荐你掌握 JavaScript。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2019/12/download--5-.png" class="kg-image" alt="download--5-" width="1280" height="720" loading="lazy"><figcaption>这是一些你应该掌握的基础知识。Brad 有这些主题的大部分视频，其中大部分内容也包含在 freeCodeCamp 课程中。</figcaption></figure><h2 id="-">在实践中学习</h2><p>在 Brad 的整个指南中，他反复强调实用性的必要性。</p><p>是的————每件事都有最佳实践。但是在很多情况下，有一种足够好的方法可以帮助你更快地前进并完成更多的工作，而不会陷入工具的泥潭。</p><p>他说过的最有趣（或许也是最和主流观点唱反调的）的一句话是：</p><p>“无需为小型站点学习 DevOps 和 AWS 以及所有这些东西。托管站点或托管主机站点（如 InMotion 或 Hostgator）就可以了。它可以让你直接在浏览器中进行 [部署]。不需要让事情变得太复杂。”</p><p>他认为，即便是在2020年，使用熟悉的工具也是有好处的。</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2019/12/download--6-.png" class="kg-image" alt="download--6-" width="1280" height="720" loading="lazy"></figure><p>对于刚接触 Web 开发的人员，Brad 建议要首先能够成为基本的前端 Web 开发人员。这样你就可以作为自由职业者为本地企业建立网站。</p><p>“潮人会说你绝对需要使用前端框架。我不赞成。如果你想在不使用前端框架的情况下在服务器上渲染模板，我认为这是完全可以的，但是有很多很多的工作要求你具有使用类似 React 或 Vue 框架的技能。”</p><p>但是一旦你准备好应对前端框架，他建议你探索 React，Vue 和 Angular。“尝试所有三个，找出最喜欢的一个。”</p><p>他还认可了 Svelte————它不是一个框架，而是一个编译器。但他表示，这可能太新了，无法在 2020 年尝试实用。</p><p>他讨论了服务器端渲染（SSR）的日益普及。基于文件系统的路由意味着你不必创建复杂的路由文件。相反，你可以将文件放在任何你认为合适的目录中。</p><p>两种流行的服务器端渲染工具是 Next.js（用于 React）和 Nuxt.js（用于 Vue）。</p><p>另一个新兴的趋势是静态网站渲染，他说，你不需要学习，但你应该知道。例如，Gatsby 站点非常快，不需要服务器。</p><h2 id="--1">后端开发工具</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2019/12/download--7-.png" class="kg-image" alt="download--7-" width="1280" height="720" loading="lazy"><figcaption>Brad 演讲的幻灯片，其中包含每种语言最流行的框架。</figcaption></figure><p>对于服务器端开发，Brad 更喜欢 Node.js 的速度，因为它的速度快，并且他可以在前端和后端都使用 JavaScript。</p><p>对于服务器端开发框架，他建议学习 Express，因为它是最流行的，而且“它给了你很多自由，可以按照自己的方式构建东西”。</p><p>他还在一些项目中使用Python，并推荐使用它。</p><p>“Python 有两个很棒的框架。Django 是一个大型的，功能齐全的框架，Flask 更加简约。它提供了你所需的内容，但你可以做出其余的决定。老实说，我对这两个框架没有偏好，我两个都喜欢，将它们用于不同需求。”</p><p>他快速简要地为PHP辩护：</p><p>“很多人都讨厌 PHP，这很不幸，因为 PHP 可以是一门很棒的语言。它很实用，并且可以在任何地方轻松部署。PHP &nbsp;非常适合需要快速出手的自由职业者。如果你打算在一家大公司工作，PHP 可能不是最佳选择，但是如果你要自由职业和构建个人项目，PHP &nbsp;可能是个不错的选择。抨击 PHP 现在是很流行的行为。PHP 是我学到的第一门语言，我仍然非常喜欢它……如果你查看 Laravel &nbsp;代码，它非常优雅。”</p><p>Brad 还快速介绍了一下数据库，并推荐了长期受欢迎的 PostgreSQL。</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2019/12/download--8-.png" class="kg-image" alt="download--8-" width="1280" height="720" loading="lazy"></figure><h2 id="--2">其他可能会持续存在的工具</h2><p>GraphQL 是 REST API 的替代品。在 Brad 的频道和 freeCodeCamp 的频道上都有一些课程介绍 &nbsp;GraphQL。但是他说，“GraphQL 现在还不是你必须学习的东西，但它已经足够流行了，我认为它会一直存在下去。这不仅仅是一种趋势。”</p><p>Brad 还讨论了内容管理系统（CMS）以及它如何演变成新的“无头”CMS，你可以将它用作后端并编写自己的前端。</p><p>“CMS 对于自由职业者来说非常方便，他们的客户希望能够登录并创建他们的博客和类似的东西。很多人抨击 WordPress，但在互联网上有很大比例的网站是由 WordPress 运行的，它仍然很受欢迎。”</p><p>对于 Web 服务器，他更喜欢 NGINX 而不是 Apache，因为“它看起来没那么复杂”。我们在 freeCodeCamp 广泛使用 NGINX，我倾向于同意。</p><p>Brad 还解释了虚拟化的工作原理，并讨论了虚拟化如何通过跨多台计算机标准化环境来简化更复杂的项目。但是他告诫不要尝试虚拟化所有内容：</p><p>“Docker 确实对团队非常有用。我不喜欢别人说你应该始终使用 Docker。这只是首选项。如果你只想运行本地 LAMP 服务器，那没有什么错。对学习类似 Docker 的东西不要感到有压力。”</p><p>他补充道，“我知道很多书呆子只想把事情复杂化，我讨厌这样。我列出了所有这些东西，并不意味着我把它强加给你”。这一点我自己没有足够地强调。</p><p>他还快速简要地指出，大多数大公司都有专门的 DevOps 团队（也称为“站点可靠性工程师”），他们可以为你做很多事情。</p><h2 id="--3">掌握一些更彰显专业度的技能是很棒的事情</h2><p>如果你想尝试移动应用程序的开发，Brad 强烈建议使用 Flutter 框架。它使用 Dart，这是一种比较晦涩的语言。他将 Dart 描述为介于 Java 和 JavaScript 之间的某个地方，并说如果你知道这两种语言中的任何一种，都应该可以使用它。</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2019/12/download--9-.png" class="kg-image" alt="download--9-" width="1280" height="720" loading="lazy"></figure><p>他在移动应用程序开发中的第二个选择是 React Native，如果你已经知道 React，就很容易上手。</p><p>然后 Brad 很好地解释了什么是渐进式 Web 应用（PWA）以及它们的一些好处。这是幻灯片，但我还是强烈建议你们看他的完整视频。</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2019/12/download--10-.png" class="kg-image" alt="download--10-" width="1280" height="720" loading="lazy"></figure><p>然后，他谈到了 Electron，它使你可以使用 JavaScript 构建桌面应用程序。他最初表示怀疑，但提到他最喜欢的一些桌面应用程序（例如 VS Code 和 Discord）现在使用 Electron 构建。</p><p>他提到了 JAMstack（客户端 JavaScript，可重用 API 和预构建标记 Markup）和 serverless 架构。这些都是更高级的主题，他的频道和 freeCodeCamp 的 YouTube 频道都提供了视频教程。</p><p>然后他描述了2020年的大趋势。</p><h2 id="-webassembly">机器学习和 WebAssembly</h2><p>尽管其他所有人都在谈论机器学习，但是这不意味着你应该放弃所有东西来学习它。这是他的整个视频分享的基调。</p><p>是的，你也可以使用 JavaScript 进行机器学习。</p><p>“Python 是机器学习的首选语言。不过，如果你也可以使用 JavaScript 里的 TensorFlow.js 和 Brain.js 来创建神经网络并做一些非常酷的事情。”</p><p>从他谈论 WebAssembly 的方式可以明显看出，他对此感到非常兴奋。</p><p>“WebAssembly 仍处于早期阶段，但我认为我们今年会看到更多。传统上，我们在网页上使用 JavaScript 来操纵 DOM &nbsp;并运行计算。JavaScript 在速度方面有局限性。一种语言就像 C 或 C++ 比 JavaScript &nbsp;快得多。因此，WebAssembly 是一种高效的低级字节代码，可以由浏览器执行，并且速度非常快。它可以由 C，C++ 和 Rust &nbsp;等语言生成。”</p><p>Rust 是 WebAssembly 可以使用的语言之一（除了 C 和 C++）。它比 C 和 C++ 更容易学习和使用。</p><p>但是需要特别注意的是，WebAssembly 不会让你不必学习 JavaScript。</p><p>“你几乎可以将 JavaScript 视为老板，它可以告诉 Web Assembly 该怎么做。因此，它使我们能够在我们的 Web &nbsp;应用程序中使用非常快速的低级语言（例如 C++），这为我们提供了更多功能————例如下一代视频游戏和视频编辑工具，就可以在浏览器中找到，这是 &nbsp;JavaScript 所无法想象的。”</p><p>最后他说：“学到的越多，就更容易学习更多，将所有这些技术融合在一起就越容易。请不要原地踌躇。一次迈出一步，做一些研究，弄清楚你想做什么。”</p><p>再一次，我要感谢 Brad Traversy，是他为我们提供了这段全面的视频介绍。</p><p>人们总是问我“如果我想成为一名web开发人员，我应该学习什么?”我的回答是“把freeCodeCamp作为你的核心课程，然后扩展到其他学习资源。</p><p>我很高兴地说，<a href="https://www.youtube.com/user/TechGuyWeb" rel="nofollow">Brad 的 Traversy Media YouTube 频道</a>是我最推荐的其他资源之一。Brad，如果你正在读这篇文章，恭喜你拥有十年的YouTube视频。期待下个十年！</p><p>原文：<a href="https://www.freecodecamp.org/news/web-development-2020/">https://www.freecodecamp.org/news/web-development-2020/</a>，作者：<a href="https://www.freecodecamp.org/news/author/quincylarson/">Quincy Larson</a></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
