<?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[ 三钻 - 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[ 三钻 - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/chinese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Tue, 26 May 2026 16:03:44 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/chinese/news/author/tridiamond/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ 使用这些函数更优雅地编写 JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ 如果你刚接触 JavaScript，可能你还没有听说过.map()，.reduce()，.filter() 。或者你听说过，看过别人用过，但是自己在实际项目中没有用过。国内很多开发项目都是需要考虑 IE8 的兼容，为了兼容很多 JavaScript 好用的方法和技巧都被埋没了。 但是，我发现近几年很多开发项目已经完全抛弃了 IE 这个魔鬼了。如果你不需要兼容“石器时代”的 IE 浏览器了，那就要开始熟悉一下这几个方法来处理数组。 > 注意这遍文章说的的 3 个方法其实在很多其他语言都可以使用到，因为这几个方法和使用概念在很多其他语言都是存在的。 .map() 让我用一个简单的例子告诉你如何使用这个方法。假如你现在有多对象的数组数据 - 每一个对象代表着一个员工的信息。现在你想要的最终结果就是取出所有员工的唯一 ID 值。 // 员工数据var employees = [  { id: 20, name: 'Captain Piett' },  { id: 24, name: 'General Veers' },  { id: 56, name: 'Admiral Ozzel' ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/map-reduce-and-filter-in-javascript/</link>
                <guid isPermaLink="false">5f28c2efc8da7105cbc14838</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ 三钻 ]]>
                </dc:creator>
                <pubDate>Wed, 20 Oct 2021 08:00:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2020/08/123.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>如果你刚接触 JavaScript，可能你还没有听说过<code>.map()</code>，<code>.reduce()</code>，<code>.filter()</code>。或者你听说过，看过别人用过，但是自己在实际项目中没有用过。国内很多开发项目都是需要考虑 IE8 的兼容，为了兼容很多 JavaScript 好用的方法和技巧都被埋没了。</p>
<p>但是，我发现近几年很多开发项目已经完全抛弃了 IE 这个魔鬼了。如果你不需要兼容“石器时代”的 IE 浏览器了，那就要开始熟悉一下这几个方法来处理数组。</p>
<blockquote>
<p>注意这遍文章说的的 3 个方法其实在很多其他语言都可以使用到，因为这几个方法和使用概念在很多其他语言都是存在的。</p>
</blockquote>
<h1 id="map">.map()</h1>
<p>让我用一个简单的例子告诉你如何使用这个方法。假如你现在有多对象的数组数据 - 每一个对象代表着一个员工的信息。现在你想要的最终结果就是取出所有员工的唯一 ID 值。</p>
<pre><code>// 员工数据var employees = [  { id: 20, name: 'Captain Piett' },  { id: 24, name: 'General Veers' },  { id: 56, name: 'Admiral Ozzel' },  { id: 88, name: 'Commander Jerjerrod' }];// 你想要的结果[20, 24, 56, 88]
</code></pre>
<p>其实要实现这个结果有很多数组处理方式。传统的处理方法就是先定义一个空数组，然后使用<code>.forEach()</code>，<code>.for(...of)</code>，或者是最简单的<code>.for()</code>来组装 ID 到你定义的数组里面。</p>
<p>我们来对比一下传统的处理方式和<code>.map()</code>的区别。</p>
<p>使用<code>.forEach()</code>：</p>
<pre><code>var employeeIds = [];employees.forEach(function (employee) {  employeeIds.push(officer.id);});
</code></pre>
<p>注意，使用传统的方式，我们必须有一个预定义的空数组变量才行，但是如果是<code>.map()</code>就会更简单了。</p>
<pre><code>var employeeIds = employees.map(function (employee) {  return employee.id});
</code></pre>
<p>甚至我们可以用更简洁的方式，使用箭头方法（但是需要 ES6 支持，Babel，或者 TypeScript）。</p>
<pre><code>const employeeIds = employees.map(employee =&gt; employee.id);
</code></pre>
<p>所以<code>.map()</code>到底是怎么运作的呢？这个方法有两个参数，第一是回调方法，第二是可选内容（会在回调方法中做为<code>this</code>）。数组里的<code>每个数值/对象会被循环进入到回调方法</code>里面，然后<code>返回新的数值/对象</code>到结果数组里面。</p>
<p>注意，结果数组的长度永远都会和被循环的数组的长度一致。</p>
<h1 id="reduce">.reduce()</h1>
<p>与<code>.map()</code>相似，<code>.reduce()</code>也是循环一个回调方法，数组里面的每一个元素都会进入回调方法，区别是回调方法返回的值会被传递到下一个回调方法，如此类推（等同于一个累加器）。</p>
<p><code>.reduce()</code>里的累加值可以是任何属性的值，包括<code>integer</code>，<code>string</code>，<code>object</code>等等。这个累加值会被实例化或者传递到下一个回调方法。</p>
<p>来，上代码，做个简单的例子！假如你有一个飞机师的数组，数组里面有每个飞机师的工龄。</p>
<pre><code>var pilots = [  {    id: 10,    name: "Poe Dameron",    years: 14,  },  {    id: 2,    name: "Temmin 'Snap' Wexley",    years: 30,  },  {    id: 41,    name: "Tallissan Lintra",    years: 16,  },  {    id: 99,    name: "Ello Asty",    years: 22,  }];
</code></pre>
<p>现在我们需要知道所有飞机师累计的总工龄，使用<code>.reduce()</code>就是比吃饭还简单的事情。</p>
<pre><code>var totalYears = pilots.reduce(function (accumulator, pilot) {  return accumulator + pilot.years;}, 0);
</code></pre>
<p>注意，这里第二个参数我传了 0。第二个参数是一个累加值的初始值。当然，如果场景需要，这个初始值也可以传入一个变量或者你需要的值。循环了数组里的每一个元素后，<code>reduce</code>方法会返回最终累加后的值（在我们这个例子中就是<code>82</code>）。</p>
<blockquote>
<p>例子里面的<code>acc</code>和<code>accumulator</code>就是累加值变量。</p>
</blockquote>
<p>如果是使用 ES6 箭头写法，我们可以写得更加优雅简洁，一行就可以搞掂的事情！</p>
<pre><code>const totalYears = pilots.reduce((acc, pilot) =&gt; acc + pilot.years, 0);
</code></pre>
<p>现在，如果我们需要找到哪一位是最有经验的飞机师，这种情况我们一样可以使用<code>.reduce()</code>。</p>
<pre><code>var mostExpPilot = pilots.reduce(function (oldest, pilot) {  return (oldest.years || 0) &gt; pilot.years ? oldest : pilot;}, {});
</code></pre>
<p>这里我把<code>accumulator</code>变量改为<code>oldest</code>，代表飞机师里面的老司机。这时候<code>reduce</code>里面的回调方法对比每一个飞机师，每一次飞机师的值进入这个回调方法，工龄更高的就会覆盖<code>oldest</code>变量。最终循环后得到的<code>oldest</code>就是工龄最高的飞机师。</p>
<p>通过这几个例子，你可以看到使用<code>.reduce()</code>可以简单又优雅地在一个数组里面获取到单个最终值或者对象。</p>
<h1 id="filter">.filter()</h1>
<p>如果你现在的场景是需要在一个数组里面过滤一部分的数据，这个时候<code>.filter()</code>就是你最好的朋友了。</p>
<p>我们用回飞机师的数据，并且加入了所属航空公司的值：</p>
<pre><code>var pilots = [  {    id: 2,    name: "Wedge Antilles",    faction: "Rebels",  },  {    id: 8,    name: "Ciena Ree",    faction: "Empire",  },  {    id: 40,    name: "Iden Versio",    faction: "Empire",  },  {    id: 66,    name: "Thane Kyrell",    faction: "Rebels",  }];
</code></pre>
<p>假如现在我们想分别筛选出<code>Rebels</code>和<code>Empire</code>两个航空公司的飞机师，使用<code>.filter()</code>就是轻而易举的事情！</p>
<pre><code>var rebels = pilots.filter(function (pilot) {  return pilot.faction === "Rebels";});var empire = pilots.filter(function (pilot) {  return pilot.faction === "Empire";});
</code></pre>
<p>就这么简单，如果使用箭头方法（ES6）就更加优雅了：</p>
<pre><code>const rebels = pilots.filter(pilot =&gt; pilot.faction === "Rebels");const empire = pilots.filter(pilot =&gt; pilot.faction === "Empire");
</code></pre>
<p>其实原理很简单，只要你的回调方法返回的是<code>true</code>，这个值或者对象就会在新的数组里面了。如果返回的是<code>false</code>就会被过滤掉了。</p>
<h1 id="mapreducefilter">结合使用 .map()，.reduce()，.filter()</h1>
<p>既然我们刚刚学到的三个函数都是可以用于数组的，并且<code>.map()</code>和<code>.filter()</code>都是返回数组的，那我们可以把它们串联起来使用。不说多了，上代码试试！</p>
<p>我们用一个有趣一点的数据试验一下。假如现在我们有一个<code>星球大战</code>里面的<code>人物</code>的数组，每个字段的定义如下：</p>
<blockquote>
<ul>
<li>
<p><code>Id</code>: 人物唯一ID</p>
</li>
<li>
<p><code>name</code>: 人物名字</p>
</li>
<li>
<p><code>pilotingScore</code>: 飞行能力指数</p>
</li>
<li>
<p><code>shootingScore</code>: 射击能力指数</p>
</li>
<li>
<p><code>isForceUser</code>: 是否拥有隔空操控能力</p>
</li>
</ul>
</blockquote>
<p>我们的目标：获取<code>拥有隔空操控能力的飞行员的总飞行能力指数</code>。我们分开一步一步实现这个目标！</p>
<p>首先我们需要先获取到拥有隔空操控能力的飞行员。</p>
<pre><code>var jediPersonnel = personnel.filter(function (person) {  return person.isForceUser;});// 结果集: [{...}, {...}, {...}] (Luke, Ezra and Caleb)
</code></pre>
<p>通过这段代码，我们获得了 3 个飞行员对象，分别都是拥有隔空操控能力的飞行员。使用这个对象，我们来获取每个飞行员的飞行能力指数值。</p>
<pre><code>var jediScores = jediPersonnel.map(function (jedi) {  return jedi.pilotingScore + jedi.shootingScore;});// 结果: [154, 110, 156]
</code></pre>
<p>获取到每个飞行员的飞行能力指数值后，我们就可以用累加器（<code>.reduce()</code>）来获取总飞行能力指数了。</p>
<pre><code>var totalJediScore = jediScores.reduce(function (acc, score) {  return acc + score;}, 0);// 结果: 420
</code></pre>
<p>这里使用分开实现方式可以达到我们的目标，但是其实我们可以串联起来，可以写得更加简洁又优雅！我们来玩玩更好玩的吧！</p>
<pre><code>var totalJediScore = personnel  .filter(function (person) {    return person.isForceUser;  })  .map(function (jedi) {    return jedi.pilotingScore + jedi.shootingScore;  })  .reduce(function (acc, score) {    return acc + score;  }, 0);
</code></pre>
<p>这样写是不是很优雅！都被这段代码给美到了！❤️</p>
<p>如果我们使用箭头写法 ES6，就更加优雅了！</p>
<pre><code>const totalJediScore = personnel  .filter(person =&gt; person.isForceUser)  .map(jedi =&gt; jedi.pilotingScore + jedi.shootingScore)  .reduce((acc, score) =&gt; acc + score, 0);
</code></pre>
<p>哇！代码原来可以写的那么优雅的么？！想不到吧？</p>
<blockquote>
<p>其实我们只需要使用<code>.reduce()</code>就可以得到我们的目标结果了，以上例子做为教学例子，所以使用了 3 个我们学到的函数。</p>
<p>我们来看看只用<code>.reduce()</code>怎么实现的。</p>
</blockquote>
<pre><code>const totalJediScore = personnel.reduce((acc, person) =&gt; person.isForceUser ? acc + person.pilotingScore + person.shootingScore : acc, 0);
</code></pre>
<p>不敢想象吧？一行就搞定一个功能不是梦！</p>
<h1 id="foreach">为什么抛弃 .forEach()?</h1>
<p>其实我一开始写前端的时候也是一顿撸，来个数组都是撸个 for 循环，解决一切数组处理问题。但是近几年我开始步入前后端开发，API 接口对接。发现数据处理越来越多，如果还是像以前那样什么都用 for 循环来处理数据，那其实数据处理的代码就会越来越臃肿越来越复杂凌乱。所以我开始抛弃了<code>.forEach()</code>，开始做一个优雅的程序员！</p>
<p>为什么使用<code>.map()</code>，<code>.filter()</code>，<code>.reduce()</code>写代码更优雅、更美观呢？我们用一个实战例子来对比一下吧。</p>
<p>假设现在我们对接一个接口，返回的数组里面有两个字段<code>name：人的名称</code>和<code>title：对应的职位</code>。</p>
<pre><code>var data = [  {    name: "Jan Dodonna",    title: "General",  },  {    name: "Gial Ackbar",    title: "Admiral",  },]
</code></pre>
<p>产品经理给到你的需求是只需要展示这些人的职位称呼。</p>
<blockquote>
<p>当然这个时候有一些前端开发者就会说“我只是个小小的前端，让后端给我处理吧”。</p>
<p>但是，这个接口其实是一个通用的接口，就是获取这些员工的资料的，是在多个地方使用的。如果每一个页面因为需要展示的不一样而要写多一个接口给你，你觉得这样好吗？</p>
<p>作为一个优秀的前端工程师🦁️，这种小 case 你自己就可以很优雅地处理好了。而且，在一个优秀的团队里，后端确实是要考虑接口通用性的，这种为了你自己的方便而给他们带来更臃肿的接口是不可接受的。所以前端这个时候就是要重组数据了。</p>
</blockquote>
<p>假设现在产品给你的需求是员工列表中要支持只展示”员工职称“和”员工信息“的两种显示项，这个时候我们就要编写一个数据组装方法来跟进展示要求，来改变数据格式。</p>
<p>因为这个“骚“需求，我们使用<code>.forEach()</code>来重组数据就相对比较麻烦了，而且代码也会变得臃肿。</p>
<p>我们忽略了组装数据的方法，直接就当作我们已经写好了一个组装数据的方法为<code>formatElement</code>。如果我们用<code>forEach</code>，那首先就需要定义一个空数组来接收结果。</p>
<pre><code>var results = [];data.forEach(function (element) {  var formatted = formatElement(element);  results.push(formatted);});
</code></pre>
<p>所以我们需要两个方法才能实现这个数据结果，但是为什么要写得那么臃肿呢？因为<code>forEach</code>并没有返回值，单单就给你跑个循环，还需要自己<code>push</code>值到预定义的变量里面。其实一个方法就可以完成了，而且重点是一行代码就完事了。</p>
<p>来使用我们新学的技巧，用<code>.map()</code>来实现就非常简单优雅了。</p>
<pre><code>var results = data.map(formatElement);
</code></pre>
<h1 id="">总结</h1>
<p>你学会了吗？学会了就去尝试用<code>.map()</code>，<code>.reduce()</code>，<code>.filter()</code>来替换你传统的<code>for</code>循环吧！我保证你的代码会越来越简洁，可读性更高。</p>
<p>坚持做一个优雅的程序员，坚持每天敲代码！</p>
<!--kg-card-end: markdown--> ]]>
                </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="600" height="400" 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="600" height="400" 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="600" height="400" 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="600" height="400" 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="600" height="400" 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="600" height="400" 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="600" height="400" loading="lazy"></p>
<p>最后，最右边的部分是代码被编译后的效果，也就是我们在代码去编写的代码最终会在浏览器呈现出来的效果哦。（这里的效果会在我们编写代码的同时触发变化哦！）</p>
<p><img src="https://img-blog.csdnimg.cn/2020050423175522.png" alt="2020050423175522" width="600" height="400" loading="lazy"></p>
<p>提交代码/测试成功后：</p>
<p><img src="https://img-blog.csdnimg.cn/20200504234802981.png" alt="20200504234802981" 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><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="600" height="400" alt="2020050417151024" loading="lazy"></center>
<p>如果 HTML 加上了 JavaScript（人体中的大脑和肌肉）就可以操控整个人的动作，让一个人活起来了。但是只有骨头和肌肉，这个也太难看了吧？想想都觉得吓人。所以我们会有皮肤来把这些不太好看的东西藏起来，这个时候就需要在 HTML 中使用 CSS（人体的皮肤）。这样子我们有好的皮肤加上衣服和化妆品的打扮，这样才可以貌美如花嘛对吧？</p>
<center><img src="https://img-blog.csdnimg.cn/20200504165855630.png" width="600" height="400" 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="600" height="400" 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="600" height="400" 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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508232647107.png" alt="20200508232647107" 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="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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508232620883.png" alt="20200508232620883" 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>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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508232551519.png" alt="20200508232551519" 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>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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508232456551.png" alt="20200508232456551" 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="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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508232414817.png" alt="20200508232414817" 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="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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508232349471.png" alt="20200508232349471" 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="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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508232309358.png" alt="20200508232309358" 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="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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/2020050823222173.png" alt="2020050823222173" 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 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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508232128378.png" alt="20200508232128378" 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>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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508232040589.png" alt="20200508232040589" 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>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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508231953144.png" alt="20200508231953144" 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>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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508231849358.png" alt="20200508231849358" 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 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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508231802953.png" alt="20200508231802953" 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>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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508231725267.png" alt="20200508231725267" 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>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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508231648984.png" alt="20200508231648984" 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>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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508231613451.png" alt="20200508231613451" 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>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="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 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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/2020050823143732.png" alt="2020050823143732" 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>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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508231340182.png" alt="20200508231340182" 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 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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508231256383.png" alt="20200508231256383" 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 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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508231219256.png" alt="20200508231219256" 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>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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508231133820.png" alt="20200508231133820" 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>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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508230712438.png" alt="20200508230712438" 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="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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508230558471.png" alt="20200508230558471" 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>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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508230402201.png" alt="20200508230402201" 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="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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200508235036344.png" alt="20200508235036344" 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="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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200509000812981.png" alt="20200509000812981" 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="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="600" height="400" loading="lazy"></p>
<h5 id="">答案</h5>
<p><img src="https://img-blog.csdnimg.cn/20200509002635302.png" alt="20200509002635302" 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/20200509083941200.png" alt="20200509083941200" width="600" height="400" 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[ JavaScript 语言通识 ]]>
                </title>
                <description>
                    <![CDATA[ 通过这个系列的文章，我们在过去的知识里面建立一个新的秩序，也就是建立知识体系。在重学 JavaScript 的过程中，我们以 JavaScript 的语法为线索，从细到粗地完整学习一遍 JavaScript 的语言知识。 语言按语法分类 首先这里我们先讲一讲泛用的语言的分类学，在我们平时说话，我们讲的是中文，当我们去国外留学或者旅游，我们都会需要讲英文。不知道大家有没有这种经历，在国外时因为英文不是很好的时候，我们会把关键词凑起来这么一说，然后语法也不对，但是老外也听懂了。比如说 “很久不见”，我们就会说 "long time no see"，然后老外还觉得挺好用的，所有他们也就加语言里面了。 这类的语言有一个特点，就是它的语法没有一个严格的定义，所以我们叫它做 “非形式化语言”，典型的代表就是我们平时说的这些。 在计算机里面，大部分的语言都是 “形式语言” —— 形式语言它的特性是有一个形式化定义，它是非常的严谨严格。 然后在形式语言里面也是分类的，这里给大家讲一下其中一种就是 “乔姆斯基谱系”。 > 乔姆斯基谱系 [https://zh.wikipedia.org/wik ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/javascript-language-analysis/</link>
                <guid isPermaLink="false">5f96af925f583f0565090b9a</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 编程语言 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 前端开发 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ 三钻 ]]>
                </dc:creator>
                <pubDate>Mon, 31 May 2021 11:00:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2020/10/marc-mintel-Q-ioK6NPFos-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>通过这个系列的文章，我们在过去的知识里面建立一个新的秩序，也就是建立知识体系。在重学 JavaScript 的过程中，我们以 JavaScript 的语法为线索，从细到粗地完整学习一遍 JavaScript 的语言知识。</p><!--kg-card-begin: markdown--><h1 id="">语言按语法分类</h1>
<p>首先这里我们先讲一讲泛用的语言的分类学，在我们平时说话，我们讲的是中文，当我们去国外留学或者旅游，我们都会需要讲英文。不知道大家有没有这种经历，在国外时因为英文不是很好的时候，我们会把关键词凑起来这么一说，然后语法也不对，但是老外也听懂了。比如说 “很久不见”，我们就会说 "long time no see"，然后老外还觉得挺好用的，所有他们也就加语言里面了。</p>
<p>这类的语言有一个特点，就是它的语法没有一个严格的定义，所以我们叫它做 “<strong>非形式化语言</strong>”，典型的代表就是我们平时说的这些。</p>
<p>在计算机里面，大部分的语言都是 “<strong>形式语言</strong>” —— 形式语言它的特性是有一个形式化定义，它是非常的严谨严格。</p>
<p>然后在形式语言里面也是分类的，这里给大家讲一下其中一种就是 “<strong>乔姆斯基谱系</strong>”。</p>
<blockquote>
<p><a href="https://zh.wikipedia.org/wiki/%E4%B9%94%E5%A7%86%E6%96%AF%E5%9F%BA%E8%B0%B1%E7%B3%BB">乔姆斯基谱系</a>：是计算机科学中刻画形式文法表达能力的一个分类谱系，是由诺姆·乔姆斯基于 1956 年提出的。它包括四个层次.</p>
<ul>
<li>非形式化语言
<ul>
<li>中文，英文</li>
</ul>
</li>
<li>形式化语言 （乔姆斯基谱系）
<ul>
<li>0-型：无限制文法 —— <em>只要定义清楚了语言是什么样的</em></li>
<li>1-型：上下文相关文法 —— <em>同样的一个词、句的组合，它的上文、下文和内容相关的</em></li>
<li>2-型：上下文无关文法 —— <em>同样一个表达，不管放到哪里都是一样的意思</em></li>
<li>3-型：正则文法 —— <em>能够被正则表达式去描述的一种文法</em></li>
</ul>
</li>
</ul>
<p>在乔姆斯基谱系里面 0123 是一种包含关系，就是说一个上下文相关文法，它一定也属于 0-型，但是反过来就不一定了。</p>
</blockquote>
<h1 id="bnf">什么是产生式？（BNF）</h1>
<blockquote>
<ul>
<li>产生式： 在计算机中指 Tiger 编译器将源程序经过词法分析（Lexical Analysis）和语法分析（Syntax Analysis）后得到的一系列符合文法规则（Backus-Naur Form，BNF）的语句</li>
<li><a href="https://zh.wikipedia.org/wiki/%E5%B7%B4%E7%A7%91%E6%96%AF%E8%8C%83%E5%BC%8F">巴科斯诺尔范式</a>：即巴科斯范式（英语：Backus Normal Form，缩写为 BNF）是一种用于表示上下文无关文法的语言，上下文无关文法描述了一类形式语言。它是由约翰·巴科斯（John Backus）和彼得·诺尔（Peter Naur）首先引入的用来描述计算机语言语法的符号集。</li>
<li>终结符： 最终在代码中出现的字符（ <a href="https://zh.wikipedia.org/wiki/%E7%B5%82%E7%B5%90%E7%AC%A6%E8%88%87%E9%9D%9E%E7%B5%82%E7%B5%90%E7%AC%A6"></a> <a href="https://zh.wikipedia.org/wiki/">zh.wikipedia.org/wiki/</a> 終結符與非終結符)</li>
</ul>
</blockquote>
<ul>
<li>用尖括号（<code>&lt;</code>, <code>&gt;</code>）括起来的名称来表示语法结构名</li>
<li>语法结构分成基础结构和需要用其他语法结构定义的复合结构
<ul>
<li>基础结构称终结符</li>
<li>复合结构称非终结符</li>
</ul>
</li>
<li>引号和中间的字符表示终结符</li>
<li>可以有括号</li>
<li><code>*</code> 表示重复多次</li>
<li><code>|</code> 表示 “或”</li>
<li><code>+</code> 表示至少一次</li>
</ul>
<h2 id="">案例：</h2>
<p>我们来用 BNF 来表述一下大家比较熟悉的四则运算。</p>
<ul>
<li>四则远算是：1 + 2 * 3</li>
<li>这里面的总结符：
<ul>
<li>Number</li>
<li><code>+</code>、<code>-</code>、<code>*</code>、<code>/</code></li>
</ul>
</li>
<li>非终结符
<ul>
<li>MultiplicativeExpression</li>
<li>AdditiveExpression</li>
</ul>
</li>
</ul>
<p>小时候我们学的四则运算是加减乘除，实际上它是有一个优先级的关系的。我们可以理解为一个 <code>1+2x3</code>的连加法当中，可以拆分成一个 <code>1</code>和 <code>2x3</code>组成的。那么 <code>2x3</code> 是它的子结构，然后 <code>2</code> 和 <code>3</code>，就是这个结构中的 <code>Number</code>，然后中间就是运算符 <code>*</code>。</p>
<p>所以用 BNF 去描述这个远算的时候，首先我们会定义一个<code>加法表达式</code>，格式就是：</p>
<ul>
<li><code>乘法表达式的列表</code> 或</li>
<li><code>加法表达式</code> + <code>乘法表达式</code> 或</li>
<li><code>加法表达式</code> - <code>乘法表达式</code></li>
</ul>
<blockquote>
<p>因为 BNF 是可以递归的，所以在定义表达式的时候，可以使用自身的表达式。</p>
</blockquote>
<p>那么乘法也是类似，只不过那加法中乘法的表达式换成了 <code>Number</code> 就可以了：</p>
<ul>
<li><code>Number</code> 或</li>
<li><code>乘法表达式</code> * <code>Number</code> 或</li>
<li><code>乘法表达式</code> / <code>Number</code></li>
</ul>
<p>最后我们看看用代码是怎么写的：</p>
<pre><code>&lt;MultiplicativeExpression&gt;::=&lt;Number&gt; |
    &lt;MultiplicativeExpression&gt; "*" &lt;Number&gt; |
    &lt;MultiplicativeExpression&gt; "/" &lt;Number&gt; |


</code></pre>
<h1 id="">深入了解产生式</h1>
<p>这里我们来尝试通过产生式，来深入理解一下前面讲到的乔姆斯基谱系。</p>
<blockquote>
<p>终结符： 最终在代码中出现的字符<a href="https://zh.wikipedia.org/wiki/%E7%B5%82%E7%B5%90%E7%AC%A6%E8%88%87%E9%9D%9E%E7%B5%82%E7%B5%90%E7%AC%A6">zh.wikipedia.org/wiki/ 終結符與非…</a></p>
</blockquote>
<ul>
<li><strong>0-型：无限制文法</strong>
<ul>
<li>产生式：<code>?</code>::=<code>?</code></li>
<li>在无限制文法当中是可以产生多个非终结符</li>
<li>所以在无限制文法里面是可以随便写</li>
</ul>
</li>
<li><strong>1-型：上下文相关文法</strong>
<ul>
<li>产生式：<code>?</code><a><code>?</code>::=<code>?</code><b><code>?</code></b></a></li><a><b>
<li>对产生的书写做出了一定的限制</li>
<li>可以在左边右边的<code>?</code>中写多个非终结符</li>
<li>但是可变化的只能是前面与后面，并且是有关系的</li>
<li>而中间一定是有一个固定的不变的部分</li>
<li>所以 <code>&lt;A&gt;</code> 前面的 <code>?</code> 就是上文，后面的 <code>?</code> 就是下文</li>
</b></a></ul><a><b>
</b></a></li><a><b>
</b></a><b><li><a><strong>2-型：上下文无关文法</strong>
</a><ul><a>
</a><li><a>产生式：</a><a>::=<code>?</code></a></li><a>
<li>左边的 <code>&lt;A&gt;</code> 一定是一个非终结符</li>
<li>右边的 <code>?</code> 就是可以随便写，可以是一大堆终结符或者混合终结符和非终结符</li>
</a></ul><a>
</a></li><a>
</a><li><a><strong>3-型：正则文法</strong>
</a><ul><a>
</a><li><a>产生式：</a><a>::=</a><a><code>?</code> ✅, </a><a>::=?</a><a> ❌</a></li><a>
<li>正则文法式有要求的</li>
<li>假如说正则文法式递归定义的，那么它不允许你这个定义 A 出现在尾巴上</li>
</a><li><a>如果左边的符号 </a><a> ，那么右边一定要出现在产生式的最开头的</a></li><a>
<li>根据这个规则，所有的正则文法都是可以被正则表达式来表示的</li>
</a></ul><a>
</a></li><a>
</a></b></ul><b><a>
<blockquote>
<p>那 JavaScript 是<strong>上下文相关文法</strong>，<strong>上下文无关文法</strong>还是<strong>正则无关文法</strong>？</p>
</blockquote>
<p>JavaScript 总体上属于上下文无关文法，其中的表达式部分大部分属于正则文法，但是这里面是有两个特例的：</p>
<ol>
<li>JavaScript 的表达式里面有新加一个<code>**</code> 运算符，<code>**</code> 表示乘方
<ul>
<li>乘方运算符其实是右结合的 ，比如说 2 ** 1 ** 2 结果是 2</li>
<li>这里是因为 1 ** 2 是先计算的，1 的 2 次方是 1，然后 2 的 1 次方是2，所以最后结果是 2 而不是 4</li>
<li>所以因为它是右结合的，就不是一个正则文法</li>
<li>如果 if 这些判断加入的话，就更加不是正则文法了</li>
</ul>
</li>
<li>比如说 <code>get</code>
<ul>
<li>如果我们在写成 <code>get a {return 1}</code> 那 get 就类似关键字的东西</li>
<li>但是如果我们在 <code>get</code> 后面加入 <code>:</code>，那 get 本身就是属性名了</li>
</ul>
</li>
</ol>
<p>所以如果我们严格按照乔姆斯基谱系来理解，那么 <strong>JavaScript 是属于上下文相关文法</strong>。在 JavaScript 引擎的实现上，可以理解为众体的编程的结构，都是一个针对上下文无关文法的，一旦遇到像 <code>get</code> 这样的上下文相关的地方，那么就会单独的用代码做一些特例处理。所以一般来说也就不会把 JavaScript 归类为上下文相关文法去处理。</p>
<h2 id="">其他产生式</h2>
<p>除了乔姆斯基谱系可以用 BNF 来定义，其实还有很多的不同的产生式的类型。比如说后来出现的 EBNF、ABNF，都是针对 BNF 的基础上做了语法上的扩张。所以一般来说每一个语言的标准里面，都会自定义一个产生式的书写方式。</p>
<p>比如说 JavaScript 中也是：</p>
<pre><code>AdditiveExpression:
    MultiplicativeExpression
    AdditiveExpression +
MultiplicativeExpression
    AdditiveExpression -
MultiplicativeExpression

</code></pre>
<blockquote>
<p>它的开头是用<strong>缩进</strong>来表示的，就是相当于<strong>产生式左边的非终结符</strong>，非终结符之后跟着一个冒号，之后给了两个空格的缩进。然后在 JavaScript 的标准中，它的非终结符，加号、减号是用加粗的黑字体来表示终结符的。<strong>所以网上的产生式是五花八门的，只学一个 BNF 是无法读懂所有的语言的</strong>。虽然所他们都有不一样的标准和写法，但是它们所表达的意思大致上都是一样的。<strong>所以我们需要理解产生式背后的思路和原理，那么我们是可以忽略表达式上的区别的。</strong></p>
</blockquote>
<h1 id="">现代语言的分类</h1>
<h2 id="">现代语言的特例</h2>
<ul>
<li>
<p><strong>C++</strong> 中，<code>*</code> 可能表达乘号或者指针，具体是哪个，取决于星号前面的标识符是否被声明为类型</p>
</li>
<li>
<p><strong>VB</strong> 中，<code>&lt;</code> 可能是小于号，也可能是 XML 直接量的开始，取决于当前位置是否可以接受XML直接量；</p>
</li>
<li>
<p><strong>Python</strong> 中，行首的 <code>tab</code> 符和空格会根据上一行的行首空白以一定规则被处理成虚拟终结符 indent 或者 dedent；</p>
</li>
<li>
<p><strong>JavaScript</strong> 中，<code>/</code> 可能是除号，也可能是正则表达式开头，处理方式类似于 VB，字符串模版中也需要特殊处理 <code>}</code>，还有自动插入分号规则；</p>
<h2 id="">语言的分类</h2>
</li>
</ul>
<p><strong>形式语言 —— 用途</strong></p>
<ul>
<li>数据描述语言 —— 有些时候我们需要去存储一个纯粹的数据，本身是没有办法进行编程的
<ul>
<li>JSON, HTML, XAML, SQL, CSS</li>
</ul>
</li>
<li>编程语言
<ul>
<li>C, C++, Java, C#, Python, Ruby, Perl, PHP, Go, Perl, Lisp, T-SQL, Clojure, Haskell, JavaScript, CoffeeScriptx</li>
</ul>
</li>
</ul>
<p><strong>形式语言 —— 表达方式</strong></p>
<ul>
<li>声明式语言
<ul>
<li>JSON, HTML, XAML, SQL, CSS, Lisp, Clojure, Haskell</li>
</ul>
</li>
<li>命令型语言
<ul>
<li>C, C++, Java, C#, Python, Ruby, Perl, JavaScript</li>
</ul>
</li>
</ul>
<h1 id="">编程语言的性质</h1>
<h2 id="">图灵完备性</h2>
<ul>
<li>命令式 —— 图灵机
<ul>
<li>goto</li>
<li>if 和 while</li>
</ul>
</li>
<li>声明式 —— lambda
<ul>
<li>递归</li>
</ul>
</li>
</ul>
</a><blockquote><a>
</a><ul><a>
</a><li><a></a><a href="https://zh.wikipedia.org/wiki/%E5%9C%96%E9%9D%88%E5%AE%8C%E5%82%99%E6%80%A7">图灵完备性</a>：在可计算性理论里，如果一系列操作数据的规则（如指令集、编程语言、细胞自动机）可以用来模拟单带图灵机，那么它是图灵完全的。这个词源于引入图灵机概念的数学家艾伦·图灵。虽然图灵机会受到储存能力的物理限制，图灵完全性通常指“具有无限存储能力的通用物理机器或编程语言”。</li>
<li><a href="https://zh.wikipedia.org/wiki/%E5%9B%BE%E7%81%B5%E6%9C%BA">图灵机（Turing machine）</a>：又称确定型图灵机，是英国数学家艾伦·图灵于 1936 年提出的一种将人的计算行为抽象掉的数学逻辑机，其更抽象的意义为一种计算模型，可以看作等价于任何有限逻辑数学过程的终极强大逻辑机器。</li>
</ul>
</blockquote>
<h2 id="">动态与静态</h2>
<ul>
<li>动态：
<ul>
<li>在用户的设备 / 在线服务器上运行</li>
<li>时机：产品实际运用时</li>
<li>术语：Runtime（运行时）</li>
</ul>
</li>
<li>静态：
<ul>
<li>在程序员的设备上运行</li>
<li>时机：产品开发时</li>
<li>术语：Compiletime（编译时）</li>
</ul>
</li>
</ul>
<blockquote>
<p>JavaScript 这种解释执行的语言，它是没有 Compiletime 的。我们现在也会用到 Webpack 去 build 一下我们的代码，但是实际上还是没有 Compiletime 的。所以说，今天的 Runtime 和 Compiletime 的对应已经不准确了，但是我们依然会愿意沿用 Compiletime 的习惯，因为 JavaScript 它也是 “Compiletime（开发时）” 的一个时间，所以也会用 Compiletime 这个词来讲 JavaScript 里面的一些特性。</p>
</blockquote>
<h2 id="">类型系统</h2>
<ul>
<li><strong>动态类型系统</strong> —— 在用户机器上可以找到的类型时
<ul>
<li>JavaScript就是动态类型系统</li>
</ul>
</li>
<li><strong>静态类型系统</strong> —— 只在程序员编写代码的时候可以找到的类型时
<ul>
<li>C++最终编译到目标的机器的代码的时候，所有的类型信息都被丢掉了</li>
</ul>
</li>
<li><strong>半动态半静态类型系统</strong> —— 比如 Java 一类的语言提供了反射机制
<ul>
<li>在编译时主要的类型检查和类型的操作，都已经在编译时被处理掉了</li>
<li>但是如果你想在运行时去获得类型信息，还是可以通过反射去获取的</li>
</ul>
</li>
<li><strong>强类型与弱类型</strong> —— 说明在编程语言里类型转换发生的形式
<ul>
<li>强类型： 无隐式转换（类型转化是不会默认发生的）</li>
<li>弱类型： 有隐式转换（JavaScript 就是典型的弱类型的语言，默认把 Number 转换成 String 类型然后相加后给你得到一个 String 类型，还有 String 和 Boolean 双等运算，会先把 Boolean 转成 Number 然后再跟 String 去做是否相同的对比）</li>
</ul>
</li>
<li><strong>复合类型</strong>
<ul>
<li>结构体</li>
<li>函数签名（包含参数类型和返回值类型两个部分）</li>
</ul>
</li>
<li><strong>子类型</strong> —— 典型的语言就是 C++（在做类型转换的时候，会有一些默认的行为）</li>
<li><strong>范型</strong>
<ul>
<li>协变与逆变：[ <a href="https://jkchao.github.io/typescript-book-chinese/tips/covarianceAndContravariance.html%5D(https://jkchao.github.io/typescript-book-chinese/tips/covarianceAndContravariance.html)">jkchao.github.io/typescript-…</a></li>
<li>协变例子：凡是能用范型数组 <code>Array &lt;Parent&gt;</code> 的地方都能用 <code>Array &lt;Child&gt;</code></li>
<li>逆变例子：凡是能用 <code>Function &lt;Child&gt;</code> 的地方，都能用 <code>Function &lt;Parent&gt;</code></li>
</ul>
</li>
</ul>
<h1 id="">一般命令式编程语言的设计方式</h1>
<p>一般来说我们的命令式语言可能有一些细微的结构上的不一致，但是它总体上来讲会分成5个层级。</p>
<ul>
<li>原子级（Atom）—— 一个语言的最小的组成单位
<ul>
<li>关键字（Identifier）</li>
<li>字符/数字的直接量（Literal）</li>
<li>变量名（Variables）</li>
</ul>
</li>
<li>表达式（Expression）—— 原子级结构通过运算符相连接和辅助符号形成
<ul>
<li>原子单位（Atom）</li>
<li>操作符（Operator）—— 加减乘除，拼接符等等</li>
<li>语法符（Punctuator）</li>
</ul>
</li>
<li>语句（Statement）—— 表达式加上特定的标识符、关键字、符号形成一定的结构
<ul>
<li>表达式（Expression）</li>
<li>关键字（Keyword）</li>
<li>语法符（Punctuator）</li>
</ul>
</li>
<li>结构化（Structure）—— 帮助我们组织、分块、分成不同的复用结构
<ul>
<li>函数（Function）</li>
<li>类（Class）</li>
<li>过程（Process）—— PASCAL 语言就会有 Process 的概念</li>
<li>命名空间（Namespace）—— C++ / PHP 中就会有 Namespace 的概念</li>
</ul>
</li>
<li>程序（Program）—— 管理语言模块和安装
<ul>
<li>程序（Program）—— 实际执行的代码</li>
<li>模块（Module）—— 准备好被复用的模块</li>
<li>包（Package）</li>
<li>库（Library）</li>
</ul>
</li>
</ul>
<p>我们对每一个层级的讲解方式都会有一个，比较固定的结构。对每一个层级来说我们是以语法作为线索，但是实际上除了语法，重点讲的是语义和进行时。</p>
<p>所谓 “语义” 就是在实行上在用户使用的时候是什么样子的。前端工程师最关心的就是，我们写什么样的语法，最后变成用户的电脑上运行时什么样子的，这是我们的变成过程。</p>
<p>而中间连接语法运行时，正是这个语言的语义。我们通过一定的语法表达一定的语义，最后改变了运行时的状态。</p>
<!--kg-card-end: markdown--></b> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 44关学习CSS与CSS3基础「二」 ]]>
                </title>
                <description>
                    <![CDATA[ 「前沿」 我有一段时间没有更新 FCC 前端教程了，这一周就继续写完 CSS 与 CSS3 基础的教程。最近工作和生活都比较繁忙所以文章更新也受到了一定的影响。不过技术文章写作再忙也不会放弃的。我会继续努力坚持着一周一篇文章的进度，继续为大家带来我学习到的知识。让我们一起继续终身学习吧！ 这一篇文章是上一篇《44 关学习 CSS 与 CSS3 基础「一」 [https://chinese.freecodecamp.org/news/44-css-css3-challenges-1/]》的第二部分，一共闯了 44 关。废话少说，让我们一起来闯关吧！ 「第二十三关」使用属性选择器改变元素属性 > 关卡名：Use Attribute Selectors to Style Elements 知识点  * 之前我们使用了id和class属性选择器给特定的元素改变样式；  * 这种方式叫做ID和CLASS选择器；  * 除了这两种 CSS 选择器之外，还有其他选择让我们选择一组自定义的元素来改变样式的；  * 我们把CatPhotoApp拿出来练习其他 CSS 选择器；  * 在这个关 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/44-css-css3-challenges-2/</link>
                <guid isPermaLink="false">5f1179d3db4be8080eb712be</guid>
                
                    <category>
                        <![CDATA[ CSS ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 自学编程 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web开发 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 3D ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ 三钻 ]]>
                </dc:creator>
                <pubDate>Tue, 28 Jul 2020 11:30:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2020/07/banner2-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <h1 id="">「前沿」</h1>
<p>我有一段时间没有更新 FCC 前端教程了，这一周就继续写完 CSS 与 CSS3 基础的教程。最近工作和生活都比较繁忙所以文章更新也受到了一定的影响。不过技术文章写作再忙也不会放弃的。我会继续努力坚持着一周一篇文章的进度，继续为大家带来我学习到的知识。让我们一起继续终身学习吧！</p>
<p>这一篇文章是上一篇《<a href="https://chinese.freecodecamp.org/news/44-css-css3-challenges-1/">44 关学习 CSS 与 CSS3 基础「一」</a>》的第二部分，一共闯了 44 关。废话少说，让我们一起来闯关吧！</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 Attribute Selectors to Style Elements</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>之前我们使用了<code>id</code>和<code>class</code>属性选择器给特定的元素改变样式；</li>
<li>这种方式叫做<code>ID</code>和<code>CLASS</code>选择器；</li>
<li>除了这两种 CSS 选择器之外，还有其他选择让我们选择一组自定义的元素来改变样式的；</li>
<li>我们把<strong>CatPhotoApp</strong>拿出来练习其他 CSS 选择器；</li>
<li>在这个关卡中我们将使用<code>[attr=value]</code>（属性=值）这种属性选择来给我们的 <strong>checkboxes</strong> （复选框）添加样式；</li>
<li>这个选择器匹配特殊的属性值，然后对这个属性做出样式的改变；</li>
</ul>
<p>比如一下例子，所有<code>type</code>属性值为<code>radio</code>的元素加入 <strong>margin</strong>（外边距）做出改变：</p>
<pre><code class="language-css">[type='radio'] {
  margin: 20px 0px 20px 0px;
}
</code></pre>
<h5 id="">过关目标</h5>
<ul>
<li>使用属性选择器，选中所有<code>type</code>属性为复选框的元素；</li>
<li>并且给与这些元素 <strong>10px</strong> 的顶部外边距和 <strong>15px</strong> 的底部外边距；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>type</code>属性选择器必须用来选中所有复选框；</li>
<li>所有复选框的顶部 margin 必须是 10px；</li>
<li>所有复选框的底部 margin 必须是 15px；</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/20200706160100722.png" alt="20200706160100722" 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>Understand Absolute versus Relative Units</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>之前所有的关卡中，我们都是给元素的 margin 和 padding 赋予“<strong>像素（pixels/px）</strong>”单位；</li>
<li>像素是一个浏览器使用的长度单位，这个单位会告诉浏览器给予一个元素多少大小和空间；</li>
<li>在 CSS 当中除了 <code>px</code> 单位之外，还可以使用其他可选的单位；</li>
<li>可用单位主要分为两种 <strong>绝对单位（absolute）</strong> 和 <strong>相对单位（relative）</strong>
<ul>
<li>绝对单位有 <code>in</code>（英寸） 和 <code>mm</code> （厘米），绝对长度单位近似于屏幕上的实际测量值，但是根据屏幕的分辨率会有一些差异；</li>
<li>相对单位有 <code>em</code> 或者 <code>rem</code>, 两者分别都是相对单位，都会根据一个相对的元素转换自己的大小；</li>
</ul>
</li>
</ul>
<p><strong>那么 <code>em</code> 和 <code>rem</code> 有什么区别呢？</strong></p>
<blockquote>
<p>EM 是相对长度，它是相对于当前元素的字体大小，如果当前元素没有设置字体大小就会一直往父级找，然后相对于父级字体大小来转换。</p>
<p><strong>EM 特性：</strong></p>
<ol>
<li>em 的值并不是固定的；</li>
<li>em 会基层父级元素的字体大小；</li>
<li>如果父级也是使用了 em 长度单位，那当前元素的 em 换算就会使用父级 em 换算后的结果进行换算。（比如父级使用了 1.2em，换算后是 12px，那当前元素用的 1em 就是 12px，但是我们想要的是 1em = 10px，这种情况用 em 就会出现大小错误。）</li>
</ol>
</blockquote>
<blockquote>
<p>REM 是 CSS3 新增的一个相对单位，它是 root em 的缩写，顾名思义就是根 em。</p>
<p><strong>REM 特性：</strong></p>
<ol>
<li>它与 EM 不一样的是，因为是"根"em，所以它永远都是相对于 HTML 根元素的字体大小；</li>
<li>与 EM 相同的就是值并不是固定的，都是相对一个元素的字体大小；</li>
<li>因为 REM 的特性是相对于 HTML 根元素，所以只要改变根元素的字体大小，就会对所有 REM 单位的元素发生大小变化；</li>
<li>除了 IE8 及更早版本的浏览器内核，所有浏览器均支持 REM；</li>
<li>对于不支持的浏览器来说，我们就需要加入一个 px 单位的 font-size 属性，如果浏览器发现无法使用 rem 即会使用 px 单位的 font-size 值；</li>
<li>这个单位可谓集合相对和绝对单位的优点与一身，所以此单位引起了广泛的使用，特别是在做移动端网页时，用于响应不同手机屏幕大小和分辨率大小；</li>
</ol>
</blockquote>
<p>这些相对单位的使用会在《响应式页面开发》的关卡中详细介绍使用场景。</p>
<h5 id="">过关目标</h5>
<ul>
<li>给拥有<code>red-box</code>类的元素加入 <code>padding</code> 属性，值为 <code>1.5em</code>；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>red-box</code>类元素必须含有 <code>padding</code> 属性；</li>
<li><code>red-box</code>类元素的<code>padding</code>属性值必须为<code>1.5em</code>；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>认识“像素（px）”以外的大小单位；</li>
<li>认识什么是绝对与相对大小单位，并且分别拥有那些单位可以使用；</li>
<li>如何使用<code>em</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/202007061718366.png" alt="202007061718366" 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="html">「第二十五关」HTML 主体属性样式</h1>
<blockquote>
<p>关卡名：<code>Style the HTML Body Element</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>这一关开始，我们重新开始一个页面，并且一起来学习<strong>CSS 继承</strong>；</li>
<li>首先每一个 HTML 页面都会有一个<code>body</code>元素；</li>
<li>这一关我们用<code>background-color</code>属性给<code>body</code>元素一个背景颜色为<code>black</code>；</li>
<li>如果这时页面变成了黑色，证明我们页面中是有<code>body</code>元素的；</li>
</ul>
<p>以下例子演示如何给<code>body</code>应用一个黑色背景的代码：</p>
<pre><code class="language-css">body {
  background-color: black;
}
</code></pre>
<h5 id="">过关目标</h5>
<ul>
<li>用 CSS 把页面中<code>body</code>元素的背景色变成黑色；</li>
<li>从而证明我们页面中拥有一个<code>body</code>元素；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>body</code>元素必须拥有<code>background-color</code>属性，并且值为<code>black</code>；</li>
<li>CSS 的格式必须合格并且遵循规范写法；</li>
<li>CSS 的规则写法必须用分号结束；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>使用背景颜色；</li>
<li>证明了页面中必定会有一个<code>body</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/20200706173011551.png" alt="20200706173011551" 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>Inherit Styles from the Body Element</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>上一关我们证明了每一个 HTML 页面中都必定会有<code>body</code>元素；</li>
<li>而且<code>body</code>元素也是可以使用 CSS 给它定制样式的；</li>
</ul>
<blockquote>
<p><strong>记住：</strong><code>body</code>元素与其他 HTML 中的元素一样，都是可以使用 CSS 给予样式控制的。不同的就是，<code>body</code>元素中的样式会被 HTML 中其他元素默认继承。意思就是说，任何在 body 中的样式都会携带到其他元素中，如果 body 中给予了背景颜色是黑色，那我们加入一个<code>div</code>元素，默认也是黑色背景。</p>
</blockquote>
<h5 id="">过关目标</h5>
<ul>
<li>首先，创建一个<code>h1</code>元素，内容填入文字 “<strong>Hello World</strong>”；</li>
<li>接下来我们让这个页面下所有元素的文字颜色都改为绿色，要达到这样的效果只需要在<code>body</code>元素中加入<code>color: green</code>即可；</li>
<li>最后给<code>body</code>元素定义字体为<code>monospace</code>，我们只需要在<code>body</code>样式中加入<code>font-family: monospace</code>属性值即可；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li>创建一个<code>h1</code>元素；</li>
<li><code>h1</code>元素内容是 Hello World；</li>
<li><code>h1</code>元素有关闭标签；</li>
<li><code>body</code>元素应该有<code>color</code>属性，并且值为<code>green</code>；</li>
<li><code>body</code>元素应该有<code>font-family</code>属性，并且值为<code>monospace</code>；</li>
<li><code>h1</code>元素的字体应该继承<code>body</code>元素的字体定义；</li>
<li><code>h1</code>元素的字体颜色应该继承<code>body</code>元素的字体颜色；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>学会继承主体（body）元素的样式；</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/20200706174603899.png" alt="20200706174603899" 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>Prioritize One Style Over Another</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>有些时候 HTML 元素会同时存在多个样式，并且产生冲突的可能性；</li>
<li>举例，我们的<code>h1</code>元素无法同时拥有绿色和粉红色字体颜色的属性；</li>
<li>让我们来看看，如果我们给一个元素一个类名，并且赋予这个类红粉色的字体颜色；</li>
<li>这个时候会不会覆盖<code>body</code>元素中的<code>color: green</code>CSS 属性；</li>
</ul>
<h5 id="">过关目标</h5>
<ul>
<li>创建一个 CSS 类，名为<code>pink-text</code>；</li>
<li>然后给<code>pink-text</code>加入字体颜色<code>color: pink</code>；</li>
<li>把<code>pink-text</code>类赋予<code>h1</code>元素；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>h1</code>元素必须拥有<code>pink-text</code>类；</li>
<li><code>&lt;style&gt;</code>标签中必须含有<code>pink-text</code>类样式，并且含有改变字体颜色的属性；</li>
<li><code>h1</code>元素的字体应该是粉红色（pink）；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>如何在 CSS 样式继承中覆盖<code>body</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/20200706235606934.png" alt="20200706235606934" 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>Override Styles in Subsequent CSS</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>上一关我们用<code>pink-text</code>类覆盖了<code>body</code>元素的 CSS 样式；</li>
<li>这里证明了 CSS 类会覆盖<code>body</code>元素的 CSS；</li>
<li>所以下一个问题就是，我们是否可以覆盖<code>pink-text</code>类的样式呢？</li>
<li>一个 HTML 元素是可以叠加多个 CSS 类的，给一个元素多个 CSS 类只需要在多个类名之间加入空格即可；</li>
</ul>
<pre><code class="language-css">&lt;div class="class1 class2"&gt;&lt;/div&gt;
</code></pre>
<blockquote>
<p><strong>注意</strong>：元素中多个 CSS 类的摆放顺序是不会影响 CSS 样式的权重的。真正决定 CSS 样式的权重的是在 CSS 样式表中的顺序，CSS 样式表的样式规则会从上往下写，越是在后面的权重越高。因为<code>.blue-text</code>的样式在<code>.pink-text</code>的后面，所以最后<code>.blue-text</code>的样式会覆盖<code>.pink-text</code>。</p>
</blockquote>
<h5 id="">过关目标</h5>
<ul>
<li>创建一个新的 CSS 类名为<code>blue-text</code>，然后赋予这个类蓝色字体样式；</li>
<li><code>blue-text</code>类在样式表中必须放在<code>pink-text</code>之后；</li>
<li>在拥有<code>pink-text</code>类的<code>h1</code>元素上叠加<code>blue-text</code>类；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>h1</code>元素中需要有<code>pink-text</code>类；</li>
<li><code>h1</code>元素中需要有<code>blue-text</code>类；</li>
<li><code>blue-text</code>和<code>pink-text</code>都需要赋予给<code>h1</code>元素；</li>
<li><code>h1</code>元素中的字体应该是蓝色的；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>如何覆盖 CSS 样式，和使用 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/20200707130528922.png" alt="20200707130528922" 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>Override Class Declarations by Styling ID Attributes</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>上一关我们知道了 CSS 样式表是从上到下阅读的，越是后面的权重就越高，就会覆盖前面声明的样式属性；</li>
<li>所以就算我们在<code>h1</code>元素中，把<code>pink-text</code>放在<code>blue-text</code>的前面，<code>blue-text</code>类中的 CSS 属性权重也是更大，会覆盖<code>pink-text</code>的 CSS 属性；</li>
<li>但是 CSS 属性权重并不止于此，还有比这个权重更高的；</li>
<li>这一关我们给<code>h1</code>元素添加一个<code>ID</code>名为<code>orange-text</code>，然后在 CSS 样式表中给这个 ID 橙色字体颜色的样式，从而覆盖掉<code>blue-text</code>类和<code>pink-text</code>类的样式；</li>
</ul>
<p>给一个元素加入 ID 属性需要使用以下写法：</p>
<pre><code class="language-html">&lt;h1 id="orange-text"&gt;&lt;/h1&gt;
</code></pre>
<p>在 CSS 样式表中定义 ID 属性需要使用以下写法：</p>
<pre><code class="language-css">#brown-text {
  color: brown;
}
</code></pre>
<h5 id="">过关目标</h5>
<ul>
<li>给<code>h1</code>元素一个 ID 属性，值为<code>orange-text</code>；</li>
<li>保留<code>blue-text</code>类和<code>pink-text</code>类在<code>h1</code>元素中；</li>
<li>创建<code>orange-text</code>的 CSS 声明，并且给予<code>color: orange</code>的属性；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>h1</code>元素需要有一个<code>pink-text</code>类；</li>
<li><code>h1</code>元素需要有一个<code>blue-text</code>类；</li>
<li><code>h1</code>元素需要有一个<code>orange-text</code>ID；</li>
<li>必须只有一个<code>h1</code>元素；</li>
<li><code>orange-text</code>ID 需要声明好 CSS 的属性；</li>
<li><code>h1</code>元素不应该有任何<code>style</code>属性；</li>
<li><code>h1</code>元素中的字体应该是橙色的；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>使用 ID 属性的样式来覆盖类样式；</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/20200707195618978.png" alt="20200707195618978" 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>Override Class Declarations with Inline Styles</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>上一关我们见证了 ID 属性的样式声明在权重中是高于类属性的样式声明；</li>
<li>就算在 CSS 样式表中是写在最上面的，也会比其他类属性声明的 CSS 属性要大；</li>
<li>但是还有一个大佬是被所有这些都权重更高的，还记得行内样式吗？就是在元素中定义的<code>style</code>属性；</li>
</ul>
<p>不记得行内样式的写法的同学，可以看看以下例子：</p>
<pre><code class="language-html">&lt;h1 style="color: green"&gt;&lt;/h1&gt;
</code></pre>
<h5 id="">过关目标</h5>
<ul>
<li>使用行内样式，让<code>h1</code>元素中的字体变成白色（<code>color: white</code>）；</li>
<li>保留<code>h1</code>元素中的<code>blue-text</code>类，<code>pink-text</code>类和<code>orange-text</code>ID 属性；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>h1</code>元素需要有一个<code>pink-text</code>类；</li>
<li><code>h1</code>元素需要有一个<code>blue-text</code>类；</li>
<li><code>h1</code>元素需要有一个<code>orange-text</code>ID；</li>
<li><code>h1</code>元素需要有一个<code>style</code>属性；</li>
<li><code>h1</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/20200707201825875.png" alt="20200707201825875" 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="important">「第三十一关」用 Important 覆盖所有样式</h1>
<blockquote>
<p>关卡名：<code>Override All Other Styles by using Important</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>在上一个关卡中发现，行内样式是会覆盖所有类型的样式声明；</li>
<li>但是行内样式并不是最大的，还有最后一个比行内样式权重还要高的；</li>
<li>对那就是使用<code>!important</code>，顾名思义就是“重要”的意识，也是表达着这个样式有最高优先级；</li>
<li>在我们使用它之前，先来了解一下为什么我们需要强制覆盖 CSS 样式；</li>
</ul>
<blockquote>
<p><strong>为何要强制覆盖 CSS 样式？又有什么时候需要我们这么做呢？</strong></p>
<p>在很多情况下，我们需要使用到 CSS 库，甚至是某 UI 框架。因为是使用别的开发者写好的样式，自然就有可能我们些的样式是被原有库或则框架的样式所覆盖了。所以当我们需要保证我们编写的 CSS 拥有最高优先级，并且绝对有效，这个时候我们就可以使用 <code>!important</code>。</p>
</blockquote>
<ul>
<li>让我们回到最初的<code>pink-text</code>类样式声明，一开始我们使用了写在后面的<code>blue-text</code>类覆盖了它的样式；</li>
<li>接下来是使用了<code>orange-text</code>ID 属性覆盖它；</li>
<li>最后使用了行内样式覆盖；</li>
</ul>
<p><strong>所以样式声明的优先级顺序就是：</strong></p>
<blockquote>
<p><strong>CSS 类声明顺序</strong> &lt; <strong>ID 属性样式</strong> &lt; <strong>行内样式</strong></p>
</blockquote>
<h5 id="">过关目标</h5>
<ul>
<li>让我们在<code>pink-text</code>类的颜色声明后面加入<code>!important</code>；</li>
<li>用这个给<code>pink-text</code>类的样式声明得到最大优先级；</li>
</ul>
<p>!important 的使用例子：</p>
<pre><code class="language-css">.brown-text {
  color: brown !important;
}
</code></pre>
<h5 id="">过关条件</h5>
<ul>
<li><code>h1</code>元素需要有一个<code>pink-text</code>类；</li>
<li><code>h1</code>元素需要有一个<code>blue-text</code>类；</li>
<li><code>h1</code>元素需要有一个<code>orange-text</code>ID；</li>
<li><code>h1</code>元素中应该有行内属性为<code>color: white</code>；</li>
<li><code>pink-text</code>类样式声明中应该有 <code>!important</code>结尾；</li>
<li><code>h1</code>元素中的字体应该是粉红色；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>如何使用最高优先级的<code>!important</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/20200707223115633.png" alt="20200707223115633" 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="hex">「第三十二关」使用 Hex 代码指定特定颜色</h1>
<blockquote>
<p>关卡名：<code>Use Hex Code for Specific Colors</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>你们知道在 CSS 中还有其他方式可以用来指定颜色的吗？</li>
<li>其中一种方式就是使用 十六进制（Hexadecimal）或者叫 Hex 颜色代码；</li>
</ul>
<blockquote>
<p><strong>什么是十六进制？</strong></p>
<p>学过计算机的同学应该都知道，通常用小数，或者以 10 为底的数，那就是用数字 0 到 9。十六进制，顾名思义就是用 16 为底的数。也就是说需要使用 16 个不同的符号。符号 0 到 9 用来代表数字中的零到久，然后 A，B，C，D，E，F 就是第十到十五的符号。从 0 到 9，A 到 F 一共就有 16 个符号组成十六进制的代码。</p>
</blockquote>
<ul>
<li>在 CSS 中，我们可以使用 6 个十六进制的数值来代表颜色；</li>
<li>每两个都是代表着<code>红（R）</code>，<code>绿（G）</code>，<code>蓝（B）</code>三种色系。</li>
<li>拿<code>#000000</code>的黑色作为例子，如果红，绿，蓝都调到最低，自然就是没有颜色，那就是黑色了；</li>
<li>可以把这三种颜色当成三个颜色的灯泡，然后十六进制是用来控制他们的亮度，数值越高就越亮，0 为最低，也就是灯会关掉，所以所有<code>#000000</code>就等同于三盏灯都关掉，自然是黑色了。如果三盏灯都调到最亮，那就会是白色了，也就是我们用的<code>#FFFFFF</code>；</li>
</ul>
<p>颜色码使用例子如下：</p>
<pre><code class="language-css">body {
  color: #000000;
}
</code></pre>
<h5 id="">过关目标</h5>
<ul>
<li>替换<code>body</code>元素中的<code>black</code>属性值为<code>#000000</code>；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>body</code>元素的背景颜色应该是黑色；</li>
<li>需要替换<code>black</code>，并且使用 Hex 颜色码；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>什么是 Hex 颜色码；</li>
<li>什么是十六进制；</li>
<li>如何使用 Hex 颜色码；</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/20200709203341902.png" alt="20200709203341902" 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 Hex Code to Mix Colors</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>我们来回顾一下上一关的知识，Hex 颜色代码中有 6 位十六进制的数值，每两位都是分别代表着<code>红（R）</code>，<code>绿（G）</code>，<code>蓝（B）</code>三种色系；</li>
<li>我们可以随意调配这三种纯颜色的亮度来混合出超过 1600 万种颜色；</li>
<li>比如说橙色，就是纯红色，加一点绿色，然后没有蓝色，对应 Hex 颜色码就是<code>#FFA500</code>；</li>
<li>数值<code>0</code>在 Hex 码中是最低的数值，等同于把这个颜色调到没有为止；</li>
<li>数值<code>F</code>就是 Hex 码中最大值，等同于把这个颜色调到最亮值；</li>
</ul>
<h5 id="">过关目标</h5>
<ul>
<li>转换一下颜色成 Hex 颜色码：</li>
</ul>
<table>
<thead>
<tr>
<th>颜色</th>
<th>Hex 码</th>
</tr>
</thead>
<tbody>
<tr>
<td>Dodger Blue</td>
<td>#1E90FF</td>
</tr>
<tr>
<td>Green</td>
<td>#00FF00</td>
</tr>
<tr>
<td>Orange</td>
<td>#FFA500</td>
</tr>
<tr>
<td>Red</td>
<td>#FF0000</td>
</tr>
</tbody>
</table>
<h5 id="">过关条件</h5>
<ul>
<li><code>h1</code>元素的字体<code>I am red!</code>需要是红色；</li>
<li>红色（Red）字体颜色属性应该使用<code>hex 码</code>替换颜色值<code>red</code>;</li>
<li><code>h1</code>元素的字体<code>I am green!</code>需要是绿色；</li>
<li>绿色（Green）字体颜色属性应该使用<code>hex 码</code>替换颜色值<code>green</code>;</li>
<li><code>h1</code>元素的字体<code>I am dodger blue!</code>需要是宝蓝色；</li>
<li>宝蓝色（Dodger Blue）字体颜色属性应该使用<code>hex 码</code>替换颜色值<code>dodgerblue</code>;</li>
<li><code>h1</code>元素的字体<code>I am orange!</code>需要是橙色；</li>
<li>橙色（Orange）字体颜色属性应该使用<code>hex 码</code>替换颜色值<code>orange</code>;</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>使用 Hex 颜色码替换颜色名词的属性值；</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/20200709211924778.png" alt="20200709211924778" 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="hex">「第三十四关」使用 Hex 颜色码缩写</h1>
<blockquote>
<p>关卡名：<code>Use Abbreviated Hex Code</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>超过 1600 万种颜色码的可能性，让许多人感到不知所措；</li>
<li>而且很难记住十六进制代码，幸运的是你可以用他们的缩写版；</li>
<li>比如红色的 Hex 颜色码为 <code>#FF0000</code> 可以被缩写为 <code>#F00</code>，这个缩写版只给红色一个数值，绿色一个数值和蓝色一个数值；</li>
<li>但是这样的缩写版，就会让我们的颜色总可能数讲到 4000 种；</li>
<li>就算使用这种缩写版，浏览器会设别 <code>#F00</code> 和 <code>#FF0000</code> 为同一个颜色；</li>
</ul>
<h5 id="">过关目标</h5>
<ul>
<li>用以下缩写版的 Hex 颜色码来更换对应的 CSS 类中的颜色值：</li>
</ul>
<table>
<thead>
<tr>
<th>颜色</th>
<th>缩写 Hex 码</th>
</tr>
</thead>
<tbody>
<tr>
<td>Cyan</td>
<td>#0FF</td>
</tr>
<tr>
<td>Green</td>
<td>#0F0</td>
</tr>
<tr>
<td>Red</td>
<td>#F00</td>
</tr>
<tr>
<td>Fuchsia</td>
<td>#F0F</td>
</tr>
</tbody>
</table>
<h5 id="">过关条件</h5>
<ul>
<li><code>h1</code>元素的字体<code>I am red!</code>需要是红色；</li>
<li>红色（Red）字体颜色属性应该使用缩写<code>hex 码</code>替换颜色值<code>#FF0000</code>;</li>
<li><code>h1</code>元素的字体<code>I am green!</code>需要是绿色；</li>
<li>绿色（Green）字体颜色属性应该使用缩写<code>hex 码</code>替换颜色值<code>#00FF00</code>;</li>
<li><code>h1</code>元素的字体<code>I am cyan!</code>需要是宝青色；</li>
<li>青色（Cyan）字体颜色属性应该使用缩写<code>hex 码</code>替换颜色值<code>#00FFFF</code>;</li>
<li><code>h1</code>元素的字体<code>I am fuchsia!</code>需要是樱红色；</li>
<li>樱红色（Fuchsia）字体颜色属性应该使用缩写<code>hex 码</code>替换颜色值<code>#FF00FF</code>;</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>使用缩写版的 Hex 颜色码；</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/2020071010464869.png" alt="2020071010464869" 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="rgb">「第三十五关」使用 RGB 值改变元素颜色</h1>
<blockquote>
<p>关卡名：<code>Use RGB values to Color Elements</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>除了 Hex 颜色码，还有其他方法可以用来给元素赋予颜色，那就是使用<code>RGB</code>值；</li>
<li>黑色的 RGB 值是：<code>rgb(0, 0, 0)</code>；</li>
<li>白色的 RGB 值是：<code>rgb(255, 255, 255)</code>；</li>
<li>与十六进制一样的原理，都是使用调整<code>红（R）</code>，<code>绿（G）</code>，<code>蓝（B）</code>三种色系的亮度来混合出 1600 万种颜色；</li>
<li>十六进制使用的是 0-9 和 A-F，而<code>RGB</code>使用的是 0 到 255，如果我们计算一下，其实 16 x 16 就是 256，而计算机都是从 0 开始，所以 $256-1=255$ ；</li>
<li>所以<code>RGB</code>和十六进制都是拥有一样的颜色种数，并且都是调整三种色系来变换颜色的；</li>
</ul>
<p>以下是把背景颜色换成橙色的 CSS 代码：</p>
<pre><code class="language-css">body {
  background-color: rgb(255, 165, 0);
}
</code></pre>
<h5 id="">过关目标</h5>
<ul>
<li>把<code>body</code>元素的背景颜色换成<code>RGB</code>中的黑色值：<code>rgb(0, 0, 0)</code>；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>h1</code>元素的字体<code>I am red!</code>需要是红色；</li>
<li>红色（Red）字体颜色属性应该使用<code>RGB</code>值替换 Hex 颜色值;</li>
<li><code>h1</code>元素的字体<code>I am orchid!</code>需要是淡紫色；</li>
<li>淡紫色（Orchid）字体颜色属性应该使用<code>RGB</code>值替换 Hex 颜色值;</li>
<li><code>h1</code>元素的字体<code>I am blue!</code>需要是蓝色；</li>
<li>蓝色（Blue）字体颜色属性应该使用<code>RGB</code>替换 Hex 颜色值;</li>
<li><code>h1</code>元素的字体<code>I am sienna!</code>需要是赭色；</li>
<li>赭色（Sienna）字体颜色属性应该使用<code>RGB</code>替换 Hex 颜色值;</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>使用 RGB 值改变元素颜色；</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/20200710124638981.png" alt="20200710124638981" 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="rgb">「第三十六关」用 RGB 来混合颜色</h1>
<blockquote>
<p>关卡名：<code>Change the Color of Text</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>与 Hex 颜色代码一样，我们可以用不同的<code>RGB</code>值来混合出各种颜色；</li>
</ul>
<h5 id="">过关目标</h5>
<ul>
<li>使用以下<code>RGB</code>值来替换 CSS 中的 Hex 颜色代码：</li>
</ul>
<table>
<thead>
<tr>
<th>颜色</th>
<th>RGB 值</th>
</tr>
</thead>
<tbody>
<tr>
<td>Blue</td>
<td>rgba(0, 0, 255)</td>
</tr>
<tr>
<td>Red</td>
<td>rgb(255, 0 , 0)</td>
</tr>
<tr>
<td>Orchid</td>
<td>rgb(218, 112, 214)</td>
</tr>
<tr>
<td>Sienna</td>
<td>rgb(160, 82, 45)</td>
</tr>
</tbody>
</table>
<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>RGB</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/20200710160701552.png" alt="20200710160701552" 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 CSS Variables to change several elements at once</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>CSS 变量是一种通过只改变一个值来一次性改变多个 CSS 样式属性的强大方法；</li>
<li>遵循下面的目标，看看仅改变三个值来改变多个元素的样式；</li>
</ul>
<h5 id="">过关目标</h5>
<ul>
<li>在<code>penguin</code>类中，改变一下内容：
<ol>
<li>改变<code>--penguin-skin</code>的<code>black</code>为<code>gray</code>；</li>
<li>改变<code>--penguin-belly</code>的<code>gray</code>为<code>white</code>；</li>
<li>改变<code>--penguin-beak</code>的<code>yellow</code>为<code>orange</code>；</li>
</ol>
</li>
<li>必须在<code>/* Only change code below this line */</code> 和 <code>/* Only change code above this line */</code> 这两个备注之间修改代码；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>penguin</code>类中的<code>--penguin-skin</code>CSS 变量的值改为<code>gray</code>；</li>
<li><code>penguin</code>类中的<code>--penguin-belly</code>CSS 变量的值改为<code>white</code>；</li>
<li><code>penguin</code>类中的<code>--penguin-beak</code>CSS 变量的值改为<code>orange</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/20200710163203200.png" alt="20200710163203200" 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>Create a custom CSS Variable</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>创建一个 CSS 变量，我们只需要在变量名前面加上两个“横杠（<code>-</code>）”即可；</li>
<li>编写语法如下：</li>
</ul>
<pre><code class="language-css">--penguin-skin： gray;
</code></pre>
<ul>
<li>以上代码会创建一个变量，名为<code>--penguin-skin</code>，并且赋予了这个变量的值为<code>gray</code>；</li>
<li>现在我们就可以在 CSS 样式表中任何的地方使用这个变量；</li>
</ul>
<h5 id="">过关目标</h5>
<ul>
<li>在<code>penguin</code>类中，创建一个变量名<code>--penguin-skin</code>；</li>
<li>并且给予这个变量一个值为<code>gray</code>；</li>
<li>必须在<code>/* Only change code below this line */</code> 和 <code>/* Only change code above this line */</code> 这两个备注之间编写代码；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>penguin</code>类中需要含有一个<code>--penguin-skin</code>变量，并且变量值为<code>gray</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/20200710164128315.png" alt="20200710164128315" 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 custom CSS Variable</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>上一关我们创建了一个自定义的 CSS 变量，这一关我们来看看是怎么使用的；</li>
<li>创建了一个 CSS 变量后，这个变量的名字可以在 CSS 样式属性中使用，只要我们关联这个变量名即可；</li>
<li>在代码中的关联写法如下：</li>
</ul>
<pre><code class="language-css">background： var(--penguin-skin);
</code></pre>
<ul>
<li>以上代码改变了<code>background</code>属性的值，这个值我们用了 CSS 变量；</li>
<li>CSS 的变量的值，就是我们上一关定义的<code>gray</code>，这个值会被关联过来；</li>
</ul>
<blockquote>
<p><strong>注意</strong>：使用的变量名字必须是和定义的变量名<strong>完全一致</strong>，要不就不会生效！</p>
</blockquote>
<h5 id="">过关目标</h5>
<ul>
<li>把一下几个 CSS 类中的<code>background</code>属性的值都替换成<code>--penguin-skin</code>CSS 变量：
<ol>
<li>penguin-top;</li>
<li>penguin-bottom;</li>
<li>right-hand;</li>
<li>left-hand;</li>
</ol>
</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>penguin-top</code>CSS 类中的<code>background</code>属性值需要改为使用<code>--penguin-skin</code>CSS 变量；</li>
<li><code>penguin-bottom</code>CSS 类中的<code>background</code>属性值需要改为使用<code>--penguin-skin</code>CSS 变量；</li>
<li><code>right-hand</code>CSS 类中的<code>background</code>属性值需要改为使用<code>--penguin-skin</code>CSS 变量；</li>
<li><code>left-hand</code>CSS 类中的<code>background</code>属性值需要改为使用<code>--penguin-skin</code>CSS 变量；</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/20200710165358878.png" alt="20200710165358878" 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>Attach a Fallback value to a CSS Variable</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>当我们使用 CSS 变量做为属性的值，我们可以赋予这个变量一个回退值；</li>
<li>所谓的回退值，就是当这个变量无效或者无法取得值是，就会使用回退的值；</li>
</ul>
<blockquote>
<p><strong>注意</strong>：这个回退值并不是用来提高浏览器兼容的，在 IE 浏览器下回退值也不会生效的。所以这个回退值只是用于当变量无法获取到值时，浏览器有一个可回退的值可用，并且可以保证有效显示。</p>
</blockquote>
<p>如下是如何设置回退值的例子：</p>
<pre><code class="language-css">background: var(--penguin-skin, black);
</code></pre>
<ul>
<li>上面的例子中，如果<code>--penguin-skin</code>变量无法获取到值，就会自动回退使用<code>black</code>做为背景颜色属性的值；</li>
</ul>
<h5 id="">过关目标</h5>
<ul>
<li>同学们应该都注意到，右边的企鹅的身体部分的颜色不见了；</li>
<li>这个是因为<code>.penguin-top</code>类和<code>.penguin-bottom</code>类中的背景颜色属性的值中的变量名拼写错误了，所以导致变量无法取到变量所定义的值；</li>
<li>在不修正这个变量名拼写错误的情况下，我们给<code>.penguin-top</code>类和<code>.penguin-bottom</code>类中的<code>background</code>属性的变量值加上回退颜色：<code>black</code>；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li>在<code>penguin-top</code>类中的<code>background</code>属性的变量值加入回退值<code>black</code>；</li>
<li>在<code>penguin-bottom</code>类中的<code>background</code>属性的变量值加入回退值<code>black</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/20200710192259591.png" alt="20200710192259591" 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>Improve Compatibility with Browser Fallbacks</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>当我们使用 CSS 时，很有可能我们会遇到浏览器兼容问题；</li>
<li>如果遇到需要兼容不支持 CSS 变量的浏览器时，我们要提供一个回退的属性给浏览器读取；</li>
<li>当浏览器解析页面上的 CSS 时，它会忽略无法识别的 CSS 属性；</li>
<li>比如此时我们有一个背景颜色属性值使用了 CSS 变量，Internet Explore（简称 IE）会忽略这个 IE 不支持的背景颜色，因为 IE 不支持使用 CSS 变量。这种情况下 IE 浏览器只会寻找其他它认识的背景属性，如果它找不到就会回退到浏览器默认的背景颜色，当然这样不是我们想要的，并且可能默认的颜色和我们理想的效果有很大的出入；</li>
<li>按照以上的逻辑，如果我们需要给某一个属性一个兼容的回退值，我们只需要在不兼容的属性上面添加一个可兼容的属性即可；</li>
<li>这样当浏览器遇到一个属性它无法识别，就会往上找可用的属性，这样就可以做到浏览器兼容了；</li>
</ul>
<h5 id="">过关目标</h5>
<ul>
<li>在代码中我们可以看到，在<code>.red-box</code>类样式中的<code>background</code>属性值使用了<code>--red-color</code>CSS 变量；</li>
<li>我们在这个属性的上方加入<code>background: red</code>，从而兼容其他不支持 CSS 变量的浏览器；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>.red-box</code>类中的<code>background</code>属性上面添加一个<code>background: red</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/20200711101311833.png" alt="20200711101311833" 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>Inherit CSS Variables</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>当我们创建一个 CSS 变量，我们是可以在创建的 CSS 选择器中使用；</li>
<li>如果我现在把<code>--penguin-skin</code>变量下载<code>.penguin</code>类选择器中，那就能<code>.penguin</code>中可以调用这个 CSS 变量；</li>
<li>同时也可以在<code>.penguin</code>的所有子节点中使用，除外都是无法调用的；</li>
</ul>
<blockquote>
<p><strong>那些才是子节点呢？</strong></p>
<p>比如现在我们有一段这样的 HTML：<br>
<code>&lt;div class="foo"&gt;&lt;span class="bar"/&gt;&lt;/div&gt;</code></p>
<p>这段 HTML 中<code>bar</code>就是<code>foo</code>的子节点，他们彼此有继承关系。</p>
</blockquote>
<ul>
<li>为了可以良好利用继承关系，CSS 变量一般都会放入<code>:root</code>元素；</li>
<li><code>:root</code>是一个伪类（pseudo-class）选择器，它会直接匹配 HTML 文档（document）中的根元素，那就是<code>html</code>元素；</li>
<li>在<code>:root</code>伪类中添加我们的 CSS 变量，遵循继承关系这些变量全局都可以使用了；</li>
</ul>
<h5 id="">过关目标</h5>
<ul>
<li>在<code>:root</code>伪类选择器中声明一个<code>--penguin-belly</code>变量，并且给予<code>pink</code>属性值；</li>
<li>然后我们就可以看到所有使用到这个变量的地方，都会可以继承并且生效；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>--penguin-belly</code>变量需要在<code>:root</code>伪类选择器中声明，并且属性值是<code>pink</code>；</li>
</ul>
<h5 id="">学会了什么？</h5>
<p>这关卡主要教会我们：</p>
<ol>
<li>如何使用 CSS 继承关系来使用 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/20200711133923383.png" alt="20200711133923383" 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 a variable for a specific area</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>当我们在<code>:root</code>伪类选择器中定义 CSS 变量，整个页面使用到这个变量的地方都会被影响；</li>
<li>但是如果我们想再某一元素中重新定义这个变量，我们只需要在这个选择器中重新定义即可；</li>
</ul>
<h5 id="">过关目标</h5>
<ul>
<li>在<code>penguin</code>类中改变<code>--penguin-belly</code>属性值为<code>white</code>；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>penguin</code>类中加入<code>--penguin-belly</code>属性，并且值赋予<code>white</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/20200711144035565.png" alt="20200711144035565" 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 a media query to change a variable</code></p>
</blockquote>
<h5 id="">知识点</h5>
<ul>
<li>CSS 变量可以简化媒体查询的使用方式；</li>
<li>比如当我们屏幕小于或大于媒体查询的范围时，我们可以改变 CSS 变量的值；</li>
<li>这时候所有使用了这个变量的属性就会跟着改变；</li>
</ul>
<h5 id="">过关目标</h5>
<ul>
<li>在<code>:root</code>选择器中的<code>media query</code>内，重新定义<code>--penguin-size</code>的值为<code>200px</code>；</li>
<li>同时也重新定义<code>--penguin-skin</code>变量的值为<code>black</code>;</li>
<li>最后改变预览区域的宽度，看看又什么变化；</li>
</ul>
<h5 id="">过关条件</h5>
<ul>
<li><code>:root</code>中需要重新定义<code>--penguin-size</code>的值为<code>200px</code>；</li>
<li><code>:root</code>中需要重新定义<code>--penguin-skin</code>的值为<code>black</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/20200711145852830.png" alt="20200711145852830" 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/20200711150059950.png" alt="20200711150059950" width="600" height="400" loading="lazy"></p>
<p>这一期我们终于完成了 CSS 与 CSS3 基础的所有关卡，个人觉得这个 FCC 集训营的关卡中的 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>
        
    </channel>
</rss>
