<?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[ Sunny Sun - 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[ Sunny Sun - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/chinese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 23 May 2026 08:28:39 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/chinese/news/author/sunnysun/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ 最常用的 JavaScript 数组方法（含代码示例） ]]>
                </title>
                <description>
                    <![CDATA[ 原文：JavaScript Array Methods Tutorial – The Most Useful Methods Explained with Examples [https://www.freecodecamp.org/news/complete-introduction-to-the-most-useful-javascript-array-methods/] ，作者：Yogesh Chavan [https://www.freecodecamp.org/news/author/yogesh/] 如果你是一个想提升自身编程能力的 JavaScript 开发者，那你应该对最常用的 ES5 和 ES6+ 的数组方法很熟悉。 这些方法能使编程变得更简单，并让你的代码看起来整洁易读。 在这篇文章中，我们将探索一些最受欢迎并被广泛使用的数组方法。让我们开始吧。 Array.forEach 方法 Array.forEach  方法的语法如下： Array.forEach(callback(currentValue [, index [, array]])[, thisAr ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/complete-introduction-to-the-most-useful-javascript-array-methods/</link>
                <guid isPermaLink="false">625e871199ec7406219e6c93</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 数组 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sunny Sun ]]>
                </dc:creator>
                <pubDate>Tue, 19 Apr 2022 09:30:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2022/04/602b49ef0a2838549dcc6285.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>原文：<a href="https://www.freecodecamp.org/news/complete-introduction-to-the-most-useful-javascript-array-methods/">JavaScript Array Methods Tutorial – The Most Useful Methods Explained with Examples</a>，作者：<a href="https://www.freecodecamp.org/news/author/yogesh/">Yogesh Chavan</a></p><!--kg-card-begin: markdown--><p>如果你是一个想提升自身编程能力的 JavaScript 开发者，那你应该对最常用的 ES5 和 ES6+ 的数组方法很熟悉。</p>
<p>这些方法能使编程变得更简单，并让你的代码看起来整洁易读。</p>
<p>在这篇文章中，我们将探索一些最受欢迎并被广泛使用的数组方法。让我们开始吧。</p>
<h2 id="arrayforeach">Array.forEach 方法</h2>
<p><code>Array.forEach</code> 方法的语法如下：</p>
<pre><code class="language-js">Array.forEach(callback(currentValue [, index [, array]])[, thisArg]);
</code></pre>
<p><code>forEach</code> 方法为数组中的每一项执行一次给定的函数。</p>
<p>请看以下代码：</p>
<pre><code class="language-js">const months = ['January', 'February', 'March', 'April'];

months.forEach(function(month) {
  console.log(month);
});

/* output

January
February
March
April

*/
</code></pre>
<p>这里是 <a href="https://codepen.io/myogeshchavan97/pen/bGBqzOw?editors=0012">CodePen 演示</a>。</p>
<p>在这个 <code>forEach</code> 循环的回调函数中，数组中的每一项都自动作为第一个参数传到函数中。</p>
<p>与上面例子的效果相同的 for 循环代码如下：</p>
<pre><code class="language-js">const months = ['January', 'February', 'March', 'April'];

for(let i = 0; i &lt; months.length; i++) {
  console.log(months[i]);
}

/* output

January
February
March
April

*/
</code></pre>
<p>这里是 <a href="https://codepen.io/myogeshchavan97/pen/abBJXMR?editors=0012">CodePen 演示</a>。</p>
<p>要记住的一点是，这个方法不返回任何值。</p>
<p>请看以下代码：</p>
<pre><code class="language-js">const months = ['January', 'February', 'March', 'April'];
const returnedValue = months.forEach(function (month) {
  return month;
});

console.log('returnedValue: ', returnedValue); // undefined
</code></pre>
<p>这里是 <a href="https://codepen.io/myogeshchavan97/pen/PobpxGb?editors=0012">CodePen 演示</a>。</p>
<blockquote>
<p><em>注意</em> <code>_forEach_</code> <em>只用于循环数组，执行操作或者打印日志。它并不返回任何值，即使在回调函数中明确的返回一个值（这意味着上个例子中返回的值是</em> <code>undefined</code> <em>）。</em></p>
</blockquote>
<p>在上面的所有例子中，我们都只使用了回调函数的第一个参数。但回调函数还接收两个额外的参数，它们是：</p>
<ul>
<li>index - 当前迭代元素的索引</li>
<li>array - 当前循环的原始数组</li>
</ul>
<pre><code class="language-js">const months = ['January', 'February', 'March', 'April'];

months.forEach(function(month, index, array) {
  console.log(month, index, array);
});

/* output

January 0 ["January", "February", "March", "April"]
February 1 ["January", "February", "March", "April"]
March 2 ["January", "February", "March", "April"]
April 3 ["January", "February", "March", "April"]

*/
</code></pre>
<p>这里是 <a href="https://codepen.io/myogeshchavan97/pen/OJbpqJR?editors=0012">CodePen 演示</a>。</p>
<p>根据不同的需求，你会发现 <code>index</code> 和<code>array</code> 这两个参数也很有用。</p>
<h3 id="foreachfor">forEach 相比 for 循环的优点</h3>
<ul>
<li>使用 <code>forEach</code> 能让你的代码量更少，且更容易理解</li>
<li>使用 <code>forEach</code> 时，我们不需要记录数组中有多少可用元素，因此可以避免创建一个额外的计数器变量。</li>
<li>使用 <code>forEach</code> 循环更方便调试，因为循环数组没有额外的变量</li>
<li>在数组中所有元素都迭代完，<code>forEach</code> 循环会自动停止。</li>
</ul>
<h3 id="">浏览器支持</h3>
<ul>
<li>IE9 版本及以上和所有现代浏览器</li>
<li>Edge12 版本及以上</li>
</ul>
<h2 id="arraymap">Array.map 方法</h2>
<p>数组的 map 方法是所有其他方法中最有用且使用最广泛的。</p>
<p><code>Array.map</code> 方法的语法如下：</p>
<pre><code class="language-js">Array.map(function callback(currentValue[, index[, array]]) {
    // Return element for new_array
}[, thisArg])
</code></pre>
<p><code>map</code> 方法为数组中的每个元素执行一次给定的函数，并且 <strong>返回一个转换过后的新数组。</strong></p>
<p>请看以下代码：</p>
<pre><code class="language-js">const months = ['January', 'February', 'March', 'April'];
const transformedArray = months.map(function (month) {
  return month.toUpperCase();
});

console.log(transformedArray); // ["JANUARY", "FEBRUARY", "MARCH", "APRIL"]
</code></pre>
<p>这里是 <a href="https://codepen.io/myogeshchavan97/pen/ExNWOyr?editors=0012">CodePen 演示</a>。</p>
<p>在上面的代码中，回调函数将每个元素转化成大写并且返回。</p>
<p>与上面例子的效果相同的 for 循环代码如下：</p>
<pre><code class="language-js">const months = ['January', 'February', 'March', 'April'];
const converted = [];

for(let i = 0; i &lt; months.length; i++) {
 converted.push(months[i].toUpperCase());
};

console.log(converted); // ["JANUARY", "FEBRUARY", "MARCH", "APRIL"]
</code></pre>
<p>这里是 <a href="https://codepen.io/myogeshchavan97/pen/gOLmyQQ?editors=0012">CodePen 演示</a>。</p>
<p>使用 <code>map</code> 可以避免预先创建一个单独的 <code>转换过的</code> 数组来存储转换过的元素。因此使用 <code>map</code> 可以节省储存空间，也能让代码看起来更整洁，如下：</p>
<pre><code class="language-js">const months = ['January', 'February', 'March', 'April'];

console.log(months.map(function (month) {
  return month.toUpperCase();
})); // ["JANUARY", "FEBRUARY", "MARCH", "APRIL"]
</code></pre>
<p>这里是 <a href="https://codepen.io/myogeshchavan97/pen/oNYZVoX?editors=0012">CodePen 演示</a>。</p>
<p>注意 <code>map</code> 方法返回一个与原数组长度一致的新数组。</p>
<p><code>forEach</code> 与 <code>map</code> 方法的区别是 <code>forEach</code> 只用于循环，没有任何返回值。而 <code>map</code> 方法返回一个与原数组长度相同的新数组。</p>
<p>也要注意 <code>map</code> 并不改变原数组而是返回一个新的数组。</p>
<p>请看以下代码：</p>
<pre><code class="language-js">const users = [
  {
    first_name: 'Mike',
    last_name: 'Sheridan'
  },
  {
    first_name: 'Tim',
    last_name: 'Lee'
  },
  {
    first_name: 'John',
    last_name: 'Carte'
  }
];

const usersList = users.map(function (user) {
  return user.first_name + ' ' + user.last_name;
});

console.log(usersList); // ["Mike Sheridan", "Tim Lee", "John Carte"]
</code></pre>
<p>这里是 <a href="https://codepen.io/myogeshchavan97/pen/LYbWaxP?editors=0012">CodePen 演示</a>。</p>
<p>这里通过使用对象数组和 <code>map</code> 方法，我们可以轻松生成一个姓和名组合的一维数组。</p>
<p>上面的代码中，我们使用 <code>+</code> 连接符连接两个值，但通常我们会使用 ES6 的模板字符串语法，如下：</p>
<pre><code class="language-js">const users = [
  {
    first_name: 'Mike',
    last_name: 'Sheridan'
  },
  {
    first_name: 'Tim',
    last_name: 'Lee'
  },
  {
    first_name: 'John',
    last_name: 'Carte'
  }
];

const usersList = users.map(function (user) {
  return `${user.first_name} ${user.last_name}`;
});

console.log(usersList); // ["Mike Sheridan", "Tim Lee", "John Carte"]
</code></pre>
<p>这里是 <a href="https://codepen.io/myogeshchavan97/pen/abBJMqe?editors=0012">CodePen 演示</a>。</p>
<p>如果你想得到数组中特定的数据，数组的 <code>map</code> 方法也是有用的，如下：</p>
<pre><code class="language-js">const users = [
  {
    first_name: 'Mike',
    last_name: 'Sheridan',
    age: 30
  },
  {
    first_name: 'Tim',
    last_name: 'Lee',
    age: 45
  },
  {
    first_name: 'John',
    last_name: 'Carte',
    age: 25
  }
];

const surnames = users.map(function (user) {
  return user.last_name;
});

console.log(surnames); // ["Sheridan", "Lee", "Carte"]
</code></pre>
<p>这里是 <a href="https://codepen.io/myogeshchavan97/pen/rNWyRdR?editors=0012">CodePen 演示</a>。</p>
<p>在上面的代码中，我们只把每个用户的姓提取出来，然后将它们存储在一个数组中。</p>
<p>我们还可以使用 <code>map</code> 生成一个动态内容如下：</p>
<pre><code class="language-js">const users = [
  {
    first_name: 'Mike',
    location: 'London'
  },
  {
    first_name: 'Tim',
    location: 'US'
  },
  {
    first_name: 'John',
    location: 'Australia'
  }
];

const usersList = users.map(function (user) {
  return `${user.first_name} lives in ${user.location}`;
});

console.log(usersList); // ["Mike lives in London", "Tim lives in US", "John lives in Australia"]
</code></pre>
<p>这里是 <a href="https://codepen.io/myogeshchavan97/pen/ExNWMOY?editors=0012">CodePen 演示</a>。</p>
<p>注意在上面的代码中，我们并没有改变原始的 <code>users</code> 数组。我们创建了一个新的动态内容数组，因为 <code>map</code> 总是返回一个新的数组。</p>
<h3 id="map">使用 map 方法的优点</h3>
<ul>
<li>可以在不改变原数组的同时快速生成一个新数组</li>
<li>可以基于每个元素生成一个动态内容的数组</li>
<li>可以快速提取数组中的任意一个元素</li>
<li>它能生成一个与原数组长度相同的数组</li>
</ul>
<p><strong>浏览器支持</strong></p>
<ul>
<li>IE9 版本及以上和所有现代浏览器</li>
<li>Edge12 版本及以上</li>
</ul>
<h2 id="arrayfind">Array.find 方法</h2>
<p><code>Array.find</code> 方法的语法如下：</p>
<pre><code class="language-js">Array.find(callback(element[, index[, array]])[, thisArg])
</code></pre>
<blockquote>
<p><code>_find_</code> <em>方法返回数组中满足给定条件的</em> <code>_第一个元素_</code>的 <code>_值_</code>。</p>
</blockquote>
<p><code>find</code> 方法将 callback 函数作为第一个 argument 对象，并为数组中的每个元素执行 callback 函数。每个数组中的元素值都被作为第一个参数传到 <code>callback</code> 函数中。</p>
<p>设想我们有这样一个应聘者列表：</p>
<pre><code class="language-js">const employees = [
 { name: "David Carlson", age: 30 },
 { name: "John Cena", age: 34 },
 { name: "Mike Sheridan", age: 25 },
 { name: "John Carte", age: 50 }
];
</code></pre>
<p>我们想得到姓名是 <code>John</code> 的应聘者记录，在这种情况下，我们可以使用 <code>find</code> 方法，如下：</p>
<pre><code class="language-js">const employee = employees.find(function (employee) {
  return employee.name.indexOf('John') &gt; -1;
});

console.log(employee); // { name: "John Cena", age: 34 }
</code></pre>
<p>这里是 <a href="https://codepen.io/myogeshchavan97/pen/VwmpVmL?editors=0011">CodePen 演示</a>。</p>
<p>尽管列表中有 <code>"John Carte"</code> ，但 <code>find</code> 方法在第一次匹配后就会停止。因此它不会返回名为 <code>"John Carte"</code> 的这个对象。</p>
<p>与上例相同的 for 循环代码如下：</p>
<pre><code class="language-js">const employees = [
 { name: "David Carlson", age: 30 },
 { name: "John Cena", age: 34 },
 { name: "Mike Sheridan", age: 25 },
 { name: "John Carte", age: 50 }
];

let user;

for(let i = 0; i &lt; employees.length; i++) {
  if(employees[i].name.indexOf('John') &gt; -1) {
    user = employees[i];
    break;
  }
}

console.log(user); // { name: "John Cena", age: 34 }
</code></pre>
<p>这里是 <a href="https://codepen.io/myogeshchavan97/pen/BaQWbeY?editors=0012">CodePen 演示</a>。</p>
<p>可以看到的是，使用普通的 for 循环会使代码量更大并且更难理解。但是使用 <code>find</code> 方法，我们可以通过容易理解的方式写出同样的代码。</p>
<h3 id="find">find 方法的优点</h3>
<ul>
<li>我们可以不用写大量代码就快速找到任意一个元素</li>
<li>找到匹配元素后会立即停止循环，因此不用写额外的 break 语句</li>
</ul>
<p><strong>浏览器支持</strong></p>
<ul>
<li>除 IE 之外的所有现代浏览器</li>
<li>Edge 12 版本及以上</li>
</ul>
<h2 id="arrayfindindex">Array.findIndex 方法</h2>
<p><code>Array.findIndex</code> 方法的语法如下：</p>
<pre><code class="language-js">Array.findIndex(callback(element[, index[, array]])[, thisArg])
</code></pre>
<p><code>findIndex</code> 方法返回数组中 <strong>满足给定测试条件</strong> 的第一个元素的 <strong>索引</strong>。否则返回 <code>-1</code>，表示没有元素通过检测。</p>
<pre><code class="language-js">const employees = [
  { name: 'David Carlson', age: 30 },
  { name: 'John Cena', age: 34 },
  { name: 'Mike Sheridan', age: 25 },
  { name: 'John Carte', age: 50 }
];

const index = employees.findIndex(function (employee) {
  return employee.name.indexOf('John') &gt; -1;
});

console.log(index); // 1
</code></pre>
<p>这里是 <a href="https://codepen.io/myogeshchavan97/pen/JjbWebQ?editors=0012">CodePen 演示</a>。</p>
<p>这里我们得到的输出 <strong>1</strong> 就是名为 <code>John</code> 的第一个对象的索引。注意索引是从0开始的。</p>
<p>与上面例子的效果相同的 for 循环代码如下：</p>
<pre><code class="language-js">const employees = [
  { name: 'David Carlson', age: 30 },
  { name: 'John Cena', age: 34 },
  { name: 'Mike Sheridan', age: 25 },
  { name: 'John Carte', age: 50 }
];

let index = -1;

for(let i = 0; i &lt; employees.length; i++) {
  if(employees[i].name.indexOf('John') &gt; -1) {
    index = i;
    break;
  }
}

console.log(index); // 1
</code></pre>
<p>这里是 <a href="https://codepen.io/myogeshchavan97/pen/oNYZOgY?editors=0012">CodePen 演示</a>。</p>
<h3 id="findindex">使用 findIndex 的优点</h3>
<ul>
<li>能让我们不用写大量代码就快速找到元素的索引</li>
<li>找到匹配元素后会立即停止循环，因此不用写额外的 break 语句</li>
<li>我们也可以用 <code>find</code> 方法来找到索引，但是使用 <code>findIndex</code> 会更简单，且能避免额外创建变量来存储索引</li>
</ul>
<p><strong>浏览器支持</strong></p>
<ul>
<li>除 IE 之外的所有现代浏览器</li>
<li>Edge 12 版本及以上</li>
</ul>
<h2 id="arrayfilter">Array.filter 方法</h2>
<p><code>Array.filter</code> 方法的语法如下：</p>
<pre><code class="language-js">Array.filter(callback(element[, index[, array]])[, thisArg])
</code></pre>
<p><code>filter</code> 方法返回一个符合给定测试条件所有元素组成的 <code>新数组</code> 。</p>
<p><code>filter</code> 方法将 callback 函数作为第一个 argument 对象，并为数组中的每一个元素执行该 callback 函数。数组中的每个元素值被作为第一个参数传递到 callback 函数中。</p>
<pre><code class="language-js">const employees = [
  { name: 'David Carlson', age: 30 },
  { name: 'John Cena', age: 34 },
  { name: 'Mike Sheridan', age: 25 },
  { name: 'John Carte', age: 50 }
];

const employee = employees.filter(function (employee) {
  return employee.name.indexOf('John') &gt; -1;
});

console.log(employee); // [ { name: "John Cena", age: 34 }, { name: "John Carte", age: 50 }]
</code></pre>
<p>这里是 <a href="https://codepen.io/myogeshchavan97/pen/yLVMQgE?editors=0011">CodePen 演示</a>。</p>
<p>从上面的代码里可以看出，使用 <code>filter</code> 方法能找出数组中所有符合特定检测条件的元素。</p>
<p>因此使用 <code>filter</code> ，在找到数组中符合条件的元素时也不会停止搜索其他满足条件的元素，之后会返回所有满足条件的元素。</p>
<blockquote>
<p><code>find</code> 与 <code>filter</code> 的主要区别在于 <code>find</code> 只返回数组中匹配的第一个元素，而 <code>filter</code> 返回数组中所有匹配元素。</p>
</blockquote>
<p>注意 <code>filter</code> 方法返回的是一个数组，如果没有元素通过检测条件，将会返回一个空数组。</p>
<p>与上面例子的效果相同的 for 循环代码如下：</p>
<pre><code class="language-js">const employees = [
  { name: 'David Carlson', age: 30 },
  { name: 'John Cena', age: 34 },
  { name: 'Mike Sheridan', age: 25 },
  { name: 'John Carte', age: 50 }
];

let filtered = [];

for(let i = 0; i &lt; employees.length; i++) {
 if(employees[i].name.indexOf('John') &gt; -1) {
   filtered.push(employees[i]);
 }
}

console.log(filtered); // [ { name: "John Cena", age: 34 }, { name: "John Carte", age: 50 }]
</code></pre>
<p>这里是 <a href="https://codepen.io/myogeshchavan97/pen/qBqrwaq?editors=0011">CodePen 演示</a>。</p>
<h3 id="filter">使用 filter 方法的优点</h3>
<ul>
<li>可以让我们快速找到数组中所有匹配的元素</li>
<li>不管有没有匹配到，都会返回一个数组，因此可以避免写额外的 <code>if</code> 条件</li>
<li>可以避免创建一个额外的变量来存储过滤后的元素</li>
</ul>
<p><strong>浏览器支持</strong></p>
<ul>
<li>IE9 及以上和所有现代浏览器</li>
<li>Edge 12 及以上</li>
</ul>
<h2 id="arrayevery">Array.every 方法</h2>
<p><code>Array.every</code> 方法的语法如下：</p>
<pre><code class="language-js">Array.every(callback(element[, index[, array]])[, thisArg])
</code></pre>
<p><code>every</code> 方法检测数组中的所有元素是否都通过给定的条件，并且返回一个布尔值 <code>true</code> 或者 <code>false</code> 。</p>
<p>假设有一个数字组成的数组，想检测是否数组中的每个元素都是正数，我们可以使用 <code>every</code> 方法来完成。</p>
<pre><code class="language-js">let numbers = [10, -30, 20, 50];

let allPositive = numbers.every(function (number) {
  return number &gt; 0;
});
console.log(allPositive); // false 

numbers = [10, 30, 20, 50];

allPositive = numbers.every(function (number) {
  return number &gt; 0;
});
console.log(allPositive); // true
</code></pre>
<p>假设有一个注册表格，你想在提交前检查是否所有必填项都已输入，就可以使用 <code>every</code> 方法来轻松检查表单的每一项。</p>
<pre><code class="language-js">window.onload = function () {
  const form = document.getElementById('registration_form');
  form.addEventListener('submit', function (event) {
    event.preventDefault();
    const fields = ['first_name', 'last_name', 'email', 'city'];
    const allFieldsEntered = fields.every(function (fieldId) {
      return document.getElementById(fieldId).value.trim() !== '';
    });

    if (allFieldsEntered) {
      console.log('All the fields are entered');
      // All the field values are entered, submit the form
    } else {
      alert('Please, fill out all the field values.');
    }
  });
};
</code></pre>
<p>这里是 <a href="https://codepen.io/myogeshchavan97/pen/rNWyQwo?editors=0011">CodePen 演示</a>。</p>
<p>上面 <code>every</code> 方法的回调函数中，我们检查表单的每一项是否都不为空，并且返回一个布尔值。</p>
<p>在上面的代码中，如果回调函数中，<code>fields</code> 数组中的每一项都返回 <code>true</code> ，那 <code>every</code> 方法就返回 <code>true</code> 。</p>
<p>如果 <code>fields</code> 数组中任意一个回调函数返回 <code>false</code> 值， <code>every</code> 方法就会返回 <code>false</code> 结果。</p>
<h3 id="every">使用 every 方法的优点</h3>
<ul>
<li>能让我们不用写大量代码就快速检测出是否所有元素都满足特定的标准</li>
</ul>
<h3 id="">浏览器支持</h3>
<ul>
<li>IE9 及以上和所有现代浏览器</li>
<li>Edge 12 及以上</li>
</ul>
<h2 id="arraysome">Array.some 方法</h2>
<p><code>Array.some</code> 方法的语法如下：</p>
<pre><code class="language-js"> Array.some(callback(element[, index[, array]])[, thisArg]
</code></pre>
<p><code>some</code> 方法检测数组中是否至少有一个元素通过给定函数的检测条件，并且返回一个 <code>true</code> 或 <code>false</code> 的布尔值。</p>
<p>一旦找到第一个匹配元素，会立即返回 <code>true</code> ，如果没有，则会返回 <code>false</code> 。</p>
<p>假定有一个数字组成的数组，我们想检测数组中是否至少包含一个正数，就可以使用 <code>some</code> 方法来完成。</p>
<pre><code class="language-js">let numbers = [-30, 40, 20, 50];

let containsPositive = numbers.some(function (number) {
  return number &gt; 0;
});
console.log(containsPositive); // true 

numbers = [-10, -30, -20, -50];

containsPositive = numbers.every(function (number) {
  return number &gt; 0;
});
console.log(containsPositive); // false
</code></pre>
<p>这里有一些使用 <code>some</code> 方法的有用场景：</p>
<h3 id="some1"><code>Some</code> 方法示例 1</h3>
<p>假设有一个应聘者的列表，我们想检查某个特定的应聘者是否在这个数组中，如果有的话，同时要得到在数组总的索引位置。</p>
<p>因此我们可以使用 <code>some</code> 方法同时得到这两个值，而不用分别单独使用 <code>find</code> 和 <code>findIndex</code> 方法。</p>
<pre><code class="language-js">const employees = [
  { name: 'David Carlson', age: 30 },
  { name: 'John Cena', age: 34 },
  { name: 'Mike Sheridon', age: 25 },
  { name: 'John Carte', age: 50 }
];

let indexValue = -1;
const employee = employees.some(function (employee, index) {
  const isFound = employee.name.indexOf('John') &gt; -1;
  if (isFound) {
    indexValue = index;
  }
  return isFound;
});

console.log(employee, indexValue); // true 1
</code></pre>
<p>这里是 <a href="https://codepen.io/myogeshchavan97/pen/ExNWOvz?editors=0011">CodePen 演示</a>。</p>
<h3 id="some2"><code>Some</code> 方法示例 2</h3>
<p><code>forEach</code>、<code>map</code> 和 <code>filter</code> 方法会将数组中的所有元素从头到尾执行一次。没有终止循环的方法，除非找到特定的元素。</p>
<p>在这种情况下，我们可以使用数组的 <code>some</code> 方法。 <code>map</code>、<code>forEach</code> 和 <code>some</code> 方法的回调函数传递的参数都相同。</p>
<ul>
<li>第一个参数是当前值</li>
<li>第二个参数是当前索引</li>
<li>第三个参数是原始数组</li>
</ul>
<p>如上面例 1 中看到的，一旦找到特定的匹配值， <code>some</code> 方法就会停止循环。</p>
<h3 id="some">使用 some 方法的优点</h3>
<ul>
<li>能让我们不用写大量代码就快速检测是否有匹配一定标准的元素</li>
<li>能快速终止循环，这是上面其他循环方法没有的</li>
</ul>
<h3 id="">浏览器支持</h3>
<ul>
<li>IE9 及以上和所有现代浏览器</li>
<li>Edge 12 及以上</li>
</ul>
<h2 id="arrayreduce">Array.reduce 方法</h2>
<p><code>Array.reduce</code> 方法的语法如下：</p>
<pre><code class="language-js">Array.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
</code></pre>
<p><code>reduce</code> 方法对数组中的每个元素执行一个由你提供的 <strong>reducer</strong> 函数，将其结果汇总为单个返回值。</p>
<blockquote>
<p>注意 <code>reduce</code> 方法的输出总是一个单一的值。它可以是一个对象、一个数字、一个字符串、一个数组等等，这取决于你想要 <code>reduce</code> 方法输出那种，但它总是一个单一的值。</p>
</blockquote>
<p>如果你想求数组中所有数字的和，可以用 <code>reduce</code> 方法。</p>
<pre><code class="language-js">const numbers = [1, 2, 3, 4, 5];

const sum = numbers.reduce(function(accumulator, number) {
  return accumulator + number; 
}, 0);

console.log(sum); // 15
</code></pre>
<p>这里是<a href="https://codepen.io/myogeshchavan97/pen/ExNWzmo?editors=0012">CodePen 演示</a>。</p>
<p><code>reduce</code> 方法接收一个回调函数，参数为 <code>accumulator</code>, <code>number</code>, <code>index</code> 和 <code>array</code> 。在上面的代码中，我们只使用了 <code>accumulator</code> 和 <code>number</code>。</p>
<p><code>accumulator</code> 包含数组中要用到的 <code>initialValue</code> 。<code>initialValue</code> 决定了 <code>reduce</code> 方法返回的数据类型。</p>
<p><code>number</code> 是回调函数中的第二个参数，包含循环中的每个枚举值。</p>
<p>上面的代码中，我们提供了 <code>0</code> 作为 <code>accumulator</code> 的 <code>initialValue</code> 。因此回调函数第一次执行时，<code>accumulator + number</code> 是 <code>0 + 1 = 1</code> ，返回值是 <code>1</code>。</p>
<p>下一次回调函数运行时，<code>accumulator + number</code> 是 <code>1 + 2 = 3</code> （这里的 <code>1</code> 是上次迭代返回的值，<code>2</code> 是数组中下一个元素）。</p>
<p>下一次运行，<code>accumulator + number</code> 就是 <code>3 + 3 = 6</code>（这里的第一个 <code>3</code> 是上次迭代的返回值，下一个 <code>3</code> 是数组中下一个元素），并且这会持续到数组中的 <code>numbers</code> 不再迭代。</p>
<p>因此 <code>accumulator</code> 会保持上一次操作的值，就像一个静态变量。</p>
<p>上面的代码中，<code>initialValue</code> 的 <code>0</code> 并不是必须的，因为数组中的元素都是整数。</p>
<p>因此下面的代码同样可行：</p>
<pre><code class="language-js">const numbers = [1, 2, 3, 4, 5];

const sum = numbers.reduce(function (accumulator, number) {
  return accumulator + number;
});

console.log(sum); // 15
</code></pre>
<p>这里是 <a href="https://codepen.io/myogeshchavan97/pen/ExNWObz?editors=0012">CodePen 演示</a>。</p>
<p>这里的 <code>accumulator</code> 包含数组中的第一个元素，<code>number</code> 包含数组中的下一个元素（第一次迭代是 <code>1 + 2 = 3</code> ，第二次迭代是 <code>3 + 3 = 6</code> ，以此类推）。</p>
<p>但搞清楚 <code>accumulator</code> 的 <code>initialValue</code> 也是很有用的，因为这能让你更容易理解 <code>reduce</code> 方法的返回类型，并且得到正确类型的返回值。</p>
<p>请看以下代码：</p>
<pre><code class="language-js">const numbers = [1, 2, 3, 4, 5];

const doublesSum = numbers.reduce(function (accumulator, number) {
  return accumulator + number * 2;
}, 10);

console.log(doublesSum); // 40
</code></pre>
<p>这里是 <a href="https://codepen.io/myogeshchavan97/pen/jOVBQYx?editors=0012">CodePen 演示</a>。</p>
<p>这里我们给数组中的每个元素乘以 2。我们给 <code>accumulator</code> 提供了一个 <code>initialValue</code> 为 10，因此 10 被加到总和结果中，如下：</p>
<pre><code class="language-js">[1 * 2, 2 * 2, 3 * 2, 4 * 2, 5 * 2] = [2, 4, 6, 8, 10] = 30 + 10 = 40
</code></pre>
<p>假设一个有 x 和 y 坐标的对象数组，你想得到 x 坐标的和，就可以使用 <code>reduce</code> 方法。</p>
<pre><code class="language-js">const coordinates = [
  { x: 1, y: 2 }, 
  { x: 2, y: 3 }, 
  { x: 3, y: 4 }
];

const sum = coordinates.reduce(function (accumulator, currentValue) {
    return accumulator + currentValue.x;
}, 0);

console.log(sum); // 6
</code></pre>
<p>这里是 <a href="https://codepen.io/myogeshchavan97/pen/OJbpaOg?editors=0012">CodePen 演示</a>。</p>
<h3 id="reduce">使用 reduce 方法的优点</h3>
<ul>
<li>使用 <code>reduce</code> 可以基于数组生成任何简单或者复杂类型的数据</li>
<li>它能记住循环中之前的返回值，因此可以避免创建一个保存历史值的全局变量</li>
</ul>
<h3 id="">浏览器支持</h3>
<ul>
<li>IE9 及以上和所有现代浏览器</li>
<li>Edge 12 及以上</li>
</ul>
<h3 id="">感谢阅读！</h3>
<p>想要详细学习更多包括 <code>let</code> 和 <code>const</code>、promise、数组与对象解构、数组方法、async/await、import/export 等其他 ES6+ 的特性？</p>
<p>点击查看我的书：<a href="https://yogeshchavan1.podia.com/mastering-modern-javascript?coupon=LA1HR55">《掌握现代 JavaScript》</a>。这本书为你学习 React 做准备，并且帮助你更好的掌握 JavaScript 和 React。</p>
<p>也可以通过我的免费课程 <a href="https://yogeshchavan1.podia.com/react-router-introduction">React Router 介绍</a> 来从头学习 React Router。</p>
<p><strong>想要紧跟最新 JavaScript、React、Node.js 的内容？<a href="https://www.linkedin.com/in/yogesh-chavan97/">在 LinkedIn 上关注我</a>。</strong></p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ CSS Flexbox 布局完全指南（含示例） ]]>
                </title>
                <description>
                    <![CDATA[ 本文篇幅较长，如果需要的话，你可以在这里 [https://payhip.com/b/YVGf]下载文章后离线阅读。 理解 Flexbox  最好的方式是什么？学好基础，再大量练习。这正是我们要在这篇文章中做的事情。 要注意的几点  * 这篇文章预设你是一名中级开发者，并且对 Flexbox 有点了解，不过......  * 如果你对 CSS 有些了解，完全不知道 Flexbox，我写了一篇综合指南（免费文章，阅读时间约为 46 分钟）    [https://medium.freecodecamp.org/understanding-flexbox-everything-you-need-to-know-b4013d4dc9af]    。  * 如果你对 CSS 掌握得不是很好，我推荐你阅读 CSS 全面（实用）指南 (74 课时的付费课程) [http://bit.ly/learn_css]。  * 你不需要遵照这里列出的示例顺序。  * Flexbox 只是一种布局的技巧，实际项目中涉及到的东西除了布局还有很多。  * 当你看到例如 div.ohans  ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/the-ultimate-guide-to-flexbox-learning-through-examples/</link>
                <guid isPermaLink="false">5eb22726db4be8080eb70a0d</guid>
                
                    <category>
                        <![CDATA[ CSS ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Flexbox ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sunny Sun ]]>
                </dc:creator>
                <pubDate>Wed, 24 Feb 2021 10:10:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2020/05/1_9vcCT6S_dFJqR6yed6Vmqw.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>本文篇幅较长，如果需要的话，你可以在<a href="https://payhip.com/b/YVGf">这里</a>下载文章后离线阅读。</p>
<p>理解 <strong>Flexbox</strong> 最好的方式是什么？学好基础，再大量练习。这正是我们要在这篇文章中做的事情。</p>
<h3 id="">要注意的几点</h3>
<ul>
<li>这篇文章预设你是一名中级开发者，并且对 Flexbox 有点了解，不过......</li>
<li>如果你对 CSS 有些了解，完全不知道 Flexbox，<a href="https://medium.freecodecamp.org/understanding-flexbox-everything-you-need-to-know-b4013d4dc9af">我写了一篇综合指南（免费文章，阅读时间约为 46 分钟）</a>。</li>
<li>如果你对 CSS 掌握得不是很好，我推荐你阅读 <a href="http://bit.ly/learn_css">CSS 全面（实用）指南 (74 课时的付费课程)</a>。</li>
<li>你不需要遵照这里列出的示例顺序。</li>
<li>Flexbox 只是一种布局的技巧，实际项目中涉及到的东西除了布局还有很多。</li>
<li>当你看到例如 <code>div.ohans</code> 的例子，这代表类名是  <code>ohans</code>的 div</li>
</ul>
<h3 id="1flexbox">例1: 如何用 Flexbox 制作一个影片集</h3>
<p>使用 Flexbox 实现横向纵向排列比大多数人想象的要简单。</p>
<p>例如一个如下的简单标识文本：</p>
<pre><code>&lt;main class="gallery"&gt;  &lt;img src="/sample.jpg"&gt;  &lt;img src="/sample.jpg"&gt;  &lt;img src="/sample.jpg"&gt;  &lt;img src="/sample.jpg"&gt;  &lt;img src="/sample.jpg"&gt;  &lt;img src="/sample.jpg"&gt;  &lt;img src="/sample.jpg"&gt;  &lt;img src="/sample.jpg"&gt;  &lt;img src="/sample.jpg"&gt;  &lt;img src="/sample.jpg"&gt;&lt;/main&gt;
</code></pre>
<p><code>main.gallery</code> 里有十张图片。</p>
<p>假定  <code>main.gallery</code>  覆盖整个可见屏幕。</p>
<pre><code>.gallery {   min-height: 100vh}
</code></pre>
<h4 id="">有关图片的快速标记</h4>
<p>图片默认是一个 inline-block 元素，有宽高，通常排列在同一行（除了图片尺寸有限定，一行排不下的情况）。</p>
<h4 id="">起始点</h4>
<p>把所有图片放在一起，上面的标识文本显示效果如下：</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/s2ntfDqrLewl66sGtavdhgQybTyD2JX520r2" alt="s2ntfDqrLewl66sGtavdhgQybTyD2JX520r2" width="600" height="400" loading="lazy"></p>
<center>10 张图片本身的宽高尺寸保持不变，在需要的时候自动换行，很好;)</center>
<p><br>现在，看下 Flexbox 的效果:</p>
<pre><code>.gallery {    display: flex }
</code></pre>
<p>现在，图片的默认属性已经发生改变。它们从  <code>inline-block</code>  元素变成了  <code>flex-items.</code></p>
<p>由于  <code>.gallery</code>  里的 Flexbox 布局，里面的图片会被压缩排列在一行内，而且它们会被纵向拉伸成这样：</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/sEzCWC3d-xoorKjDGf8TMdq6-ZxtOFMQjIST" alt="sEzCWC3d-xoorKjDGf8TMdq6-ZxtOFMQjIST" width="600" height="400" loading="lazy"></p>
<center>图片都被纵向拉伸，并且挤在一行内，不能更丑 :(</center>
<p><br>这就是由于 Flexbox 布局的默认展示方式:</p>
<p>1.  将所有的子元素压在一行内，不换行。</p>
<p>这并不适用于图片库，因此我们可以这样改变：</p>
<pre><code>.gallery {    flex-wrap: wrap}
</code></pre>
<p>这样所有的元素会在适当的位置换行成多行排列。</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/JGAnqvkIeN-q8vh1beADx0XUrUE6SEZkGQFp" alt="JGAnqvkIeN-q8vh1beADx0XUrUE6SEZkGQFp" width="600" height="400" loading="lazy"></p>
<center>因为 wrap 值的改变，现在图片换行排列</center>
<p><br>2. 现在图片有换行，但是仍然被纵向拉伸。我们当然不想要这样变形的布局。</p>
<p><code>stretch</code>  显示是因为  <code>flex</code>  里默认的  <code>align-items</code>  值。</p>
<pre><code>align-items: stretch
</code></pre>
<p>我们可以改成这样：</p>
<pre><code>.gallery {  ...  align-items: flex-start}
</code></pre>
<p>这样图片不会拉伸，而是保持它们默认的宽和高。</p>
<p>如下所示，它们会在纵向保持首部对齐。</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/02VgeT3SyoxuWFwkqyD1pzEjFzUjMH160mn0" alt="02VgeT3SyoxuWFwkqyD1pzEjFzUjMH160mn0" width="600" height="400" loading="lazy"></p>
<center>现在图片都没有变形。这才是我们在使用 Flexbox 之前想要的效果</center>
<p><br>现在我们就有了使用 Flexbox 的强大图片集。</p>
<h4 id="flexbox">使用 Flexbox 的优点</h4>
<p>此刻 Flexbox 似乎没展现出什么优势，图片还是像使用  <strong>Flexbox</strong>  之前一样。</p>
<p>除了能得到一个免费的响应式图片集外，使用 Flexbox 的另一个优势就是它的对齐选项。</p>
<p>还记得 flex 容器  <code>.gallery</code>  设定的样式 <code>flex-direction: row</code>  <code>justify-content: flex-start</code>  和  <code>align-items: flex-start.</code></p>
<p>如下所示，改变默认值，我们就可以立马改变图片库的布局。</p>
<pre><code>.gallery {   ...   justify-content:center;}
</code></pre>
<p><img src="https://cdn-media-1.freecodecamp.org/images/etSBjIv9EwausQZC8PCe3tdHj0JovaLXkNvs" alt="etSBjIv9EwausQZC8PCe3tdHj0JovaLXkNvs" width="600" height="400" loading="lazy"></p>
<center>图片在水平方向上完美居中</center>
<p><br>如上所示，这会让图片水平居中。</p>
<pre><code>.gallery {   ...   justify-content:center;   align-items: center;}
</code></pre>
<p><img src="https://cdn-media-1.freecodecamp.org/images/jSx35Bma2fYhAISiEg0B3TcZanxoy0hPOb8D" alt="jSx35Bma2fYhAISiEg0B3TcZanxoy0hPOb8D" width="600" height="400" loading="lazy"></p>
<p>再进一步，我们可以让图片完美居中对齐（无论是水平还是垂直）</p>
<p>如上所示，这可以让图片在  <code>.gallery</code> 内水平和垂直都居中。</p>
<p>你可以通过 Flexbox 的布局方式随意选择你想要的对齐选项。</p>
<p>也可以在  <a href="https://codepen.io/ohansemmanuel/full/dzgLLw/">CodePen</a>查看 Flexbox 图片库的实时布局效果。</p>
<h3 id="2flexbox">例 2：如何通过 Flexbox 布局卡片</h3>
<p>卡片在网上很流行，无论是Google, Twitter 还是 Pinterest，每个网站都在使用卡片。</p>
<p>卡片是一种在弹性容器内组合相关信息的页面设计方式，视觉上很像一种玩的卡片。</p>
<p>有很多使用卡片的优秀案例，其中一个常用的就是臭名昭著的价格表。</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/wjb-g2V7hV6IvRbGaDHYmAePhTjwR5ZeekkX" alt="wjb-g2V7hV6IvRbGaDHYmAePhTjwR5ZeekkX" width="600" height="400" loading="lazy"></p>
<center>价格表模型</center>
<p><br>让我们来建一个。</p>
<h4 id="">标识文本</h4>
<p>我们给每个卡片设定一个如下的标识：</p>
<pre><code>&lt;section class="card"&gt;  &lt;header&gt;  &lt;/header&gt;
</code></pre>
<pre><code>  &lt;ul&gt;    &lt;li&gt;&lt;/li&gt;    &lt;li&gt;&lt;/li&gt;    &lt;li&gt;&lt;/li&gt;  &lt;/ul&gt;  &lt;button&gt;&lt;/button&gt;&lt;/section&gt;
</code></pre>
<p>这里有至少 3 个卡片，我们把这些卡片包在  <code>div.cards</code>里</p>
<pre><code>&lt;div class="cards"&gt;&lt;/div&gt;
</code></pre>
<p>现在已经有了一个父元素。在这个例子中，父元素充满整个视图。</p>
<pre><code>.cards {   min-height: 100vh}
</code></pre>
<h4 id="flexbox">建立 Flexbox 布局</h4>
<p>下面的代码块新建了一个在  <code>.cards</code> 里面的 Flexbox 布局样式。</p>
<pre><code>.cards {  display: flex;  flex-wrap: wrap}
</code></pre>
<p>如果你还记得上一个例子，  <code>flex-wrap</code>  可以让  <code>flex-items</code>  元素换行。</p>
<p>由于子元素排列需要更大的宽度，所以子元素不能在父元素内排列时就会换行。</p>
<p>接下来我们给  <code>.card</code>  元素一个初始宽度。</p>
<p>使用 Flexbox 如下布局:</p>
<pre><code>.card {  flex: 0 0 250px}
</code></pre>
<p>这个样式将  <code>flex-grow</code>  和  <code>flex-shrink</code>  的值设为 0，  <code>flex-basis</code>  值为  <code>250px</code>。</p>
<p>这时，卡片会在页面的起始处对齐，并且竖向排列。</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/dkco2Y-Dru2WyMonIq51riqbYtjVr2Zn3E4T" alt="dkco2Y-Dru2WyMonIq51riqbYtjVr2Zn3E4T" width="600" height="400" loading="lazy"></p>
<center>卡片首部对齐</center>
<p><br>这有时可能满足你的使用需求，但大部分情况下，都不行。</p>
<h4 id="flex">Flex 容器的默认值</h4>
<p>上面的布局效果是由于 flex 容器的默认布局设置。</p>
<p>卡片在页面内靠左上角对齐，因为  <code>justify-content</code>  的值默认为  <code>flex-start</code>  。</p>
<p>同时，卡片垂直拉伸充满整个父元素的高度，因为  <code>align-items</code>  的默认值是  <code>stretch</code>  。</p>
<h4 id="">改变默认值</h4>
<p>我们可以通过改变 Flexbox 提供的默认值来达到更好的效果。</p>
<p>看下面几个例子：</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/hq7D1wJINa5-DC77TMt4e517xOAG6C46yKZ3" alt="hq7D1wJINa5-DC77TMt4e517xOAG6C46yKZ3" width="600" height="400" loading="lazy"><br>
align-items: flex-start; justify-content: center</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/R8-ShSWPknA8m7CBl1UNMj4qdbhycAIp1D9r" alt="R8-ShSWPknA8m7CBl1UNMj4qdbhycAIp1D9r" width="600" height="400" loading="lazy"><br>
align-items: flex-end; justify-content: center</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/B9jkLQHZp7Cze2rEPkE8mzUfBDRWuf5nXFYP" alt="B9jkLQHZp7Cze2rEPkE8mzUfBDRWuf5nXFYP" width="600" height="400" loading="lazy"><br>
align-items: center; justify-content: center</p>
<p><br>你可以在<a href="https://codepen.io/ohansemmanuel/full/Ljqdpa/">CodePen</a>看最终的效果。</p>
<h3 id="3flexbox">例 3：如何使用 Flexbox 创建网格布局</h3>
<p>在这个例子中，我们要探讨整体的 CSS 框架概念，这是很重要的一点。</p>
<h4 id="">什么是网格布局？</h4>
<p>网格是用来构建内容的一系列水平垂直相交引导线。</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/06AK1XPmRT2w0zMezFzS2W50a8-xxwmujZEb" alt="06AK1XPmRT2w0zMezFzS2W50a8-xxwmujZEb" width="600" height="400" loading="lazy"></p>
<center>一系列水平垂直相交引导线</center>
<p><br>如果你对 Bootstrap 这样的 CSS 框架比较熟悉，那你之前一定使用过网格布局。</p>
<p>你所掌握的内容可能不一样，但这个例子会涵盖不同的网格布局类型。</p>
<p>我们先来看第一种，<strong>基本网格布局</strong></p>
<h4 id="">基本网格布局</h4>
<p><img src="https://cdn-media-1.freecodecamp.org/images/emC8Q5HRNl1dVcCGxvvheVNZYpQ0Ce05-MMc" alt="emC8Q5HRNl1dVcCGxvvheVNZYpQ0Ce05-MMc" width="600" height="400" loading="lazy"></p>
<center>一组列宽度相同的基础网格</center>
<p><br>这些网格有以下特点：</p>
<ul>
<li>网格单元格平均布局并充满整行。</li>
<li>单元格高度一致。</li>
</ul>
<p>使用 Flexbox 很容易实现这个效果，看下面这个标识文本：</p>
<pre><code>&lt;div class="row"&gt;  &lt;div class="row_cell"&gt;1&lt;/div&gt;&lt;/div&gt;
</code></pre>
<p>每个  <code>.row</code>  都是自己的 flex 容器。</p>
<p><code>.row</code>  里的每个元素也就是 flex 元素，所有的 flex 元素都平均分布在一行中。</p>
<p>根据设计，无论有 3 个子元素</p>
<pre><code>&lt;div class="row"&gt;  &lt;div class="row_cell"&gt;1/3&lt;/div&gt;  &lt;div class="row_cell"&gt;1/3&lt;/div&gt;  &lt;div class="row_cell"&gt;1/3&lt;/div&gt;&lt;/div&gt;
</code></pre>
<p>6 个子元素</p>
<pre><code>&lt;div class="row"&gt;  &lt;div class="row_cell"&gt;1/6&lt;/div&gt;  &lt;div class="row_cell"&gt;1/6&lt;/div&gt;  &lt;div class="row_cell"&gt;1/6&lt;/div&gt;  &lt;div class="row_cell"&gt;1/6&lt;/div&gt;  &lt;div class="row_cell"&gt;1/6&lt;/div&gt;  &lt;div class="row_cell"&gt;1/6&lt;/div&gt;&lt;/div&gt;
</code></pre>
<p>或是 12 个子元素，都是没影响的</p>
<pre><code>&lt;div class="row"&gt;  &lt;div class="row_cell"&gt;1/12&lt;/div&gt;  &lt;div class="row_cell"&gt;1/12&lt;/div&gt;  &lt;div class="row_cell"&gt;1/12&lt;/div&gt;  &lt;div class="row_cell"&gt;1/12&lt;/div&gt;  &lt;div class="row_cell"&gt;1/12&lt;/div&gt;  &lt;div class="row_cell"&gt;1/12&lt;/div&gt;  &lt;div class="row_cell"&gt;1/12&lt;/div&gt;  &lt;div class="row_cell"&gt;1/12&lt;/div&gt;  &lt;div class="row_cell"&gt;1/12&lt;/div&gt;  &lt;div class="row_cell"&gt;1/12&lt;/div&gt;  &lt;div class="row_cell"&gt;1/12&lt;/div&gt;  &lt;div class="row_cell"&gt;1/12&lt;/div&gt;&lt;/div&gt;
</code></pre>
<h4 id="">解决方案</h4>
<p>达到这个效果只需要两步：</p>
<ol>
<li>新建一个 Flexbox 布局文本：</li>
</ol>
<pre><code>.row {   display: flex;}
</code></pre>
<p>2. 扩大每个  <code>flex-item</code>  元素，让它们以相同比例均匀的布满整行：</p>
<pre><code>.row_cell {   flex: 1}
</code></pre>
<p>就是这样</p>
<h4 id="">方案解释</h4>
<pre><code>flex: 1
</code></pre>
<p><code>flex</code>  是  <code>flex-grow</code>  、  <code>flex-shrink</code>  和  <code>flex-basis</code>  三个不同 Flexbox 属性的缩写。</p>
<p><code>flex: 1</code>  只有  <code>1</code>  的值，这个值代表的是<code>flex-grow</code> 属性。</p>
<p>而  <code>flex-shrink</code>  和  <code>flex-basis</code>  则分别设置为 <code>1</code>  和  <code>0</code>。</p>
<pre><code>flex: 1  === flex: 1 1 0
</code></pre>
<h4 id="">有确定大小的网格元素</h4>
<p>有时候你需要的效果并不是同样大小的水平网格布局。</p>
<p>你可能想要一个元素是其他的两倍，或者几分之一。</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/CKD3-ZUoxNAOJ-bp-cUZ0XcxnnMB1OvvA2yX" alt="CKD3-ZUoxNAOJ-bp-cUZ0XcxnnMB1OvvA2yX" width="600" height="400" loading="lazy"></p>
<center>水平网格布局中的元素是其他的两倍或三倍</center>
<p><br>实现方式很简单。</p>
<p>对于这些有确定大小的网格元素，只需要加一个这样的修饰符类：</p>
<pre><code>.row_cell--2 {   flex: 2}
</code></pre>
<p>加上这个类，可以看到第一个  <code>div</code>  子元素代码如下：</p>
<pre><code>&lt;div class="row"&gt;  &lt;div class="row_cell row_cell--2"&gt;2x&lt;/div&gt;  &lt;div class="row_cell"&gt;1/3&lt;/div&gt;  &lt;div class="row_cell"&gt;1/3&lt;/div&gt;&lt;/div&gt;
</code></pre>
<p>加上  <code>.row__cell--2</code>  类名的元素会是其他默认元素的两倍大小。</p>
<p>一个占可用空间 3 倍的元素：</p>
<p><code>.row_cell--3 {</code><br>
<code>flex: 3</code><br>
<code>}</code></p>
<h4 id="">有确定对齐方式的网格元素</h4>
<p>多亏了 Flexbox 布局，我们不需要给每个元素设置特定的对齐值。你可以给任何一个元素设定不同的对齐方式。</p>
<p>通过下面的修饰符类，可以达到这样的效果：</p>
<pre><code>.row_cell--top {  align-self: flex-start}
</code></pre>
<p>这可以让特定的元素在  <code>row</code> 内靠顶部对齐。</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/rSpBVp7JoobnRoc0-Vsb6CjfzyKxO9c5pUwq" alt="rSpBVp7JoobnRoc0-Vsb6CjfzyKxO9c5pUwq" width="600" height="400" loading="lazy"></p>
<center>应用.row\_cell — top 类可以让特定的元素在  `row`  内靠顶部对齐</center>
<p><br>你一定有在标识文本中给特定元素加上这个类。看文本中第一个  <code>div</code>  子元素：</p>
<pre><code>&lt;div class="row"&gt;  &lt;div class="row_cell row_cell--top"&gt;&lt;/div&gt;  &lt;div class="row_cell"&gt;&lt;/div&gt;  &lt;div class="row_cell"&gt;&lt;/div&gt;&lt;/div&gt;
</code></pre>
<p>下面是其他可选的对齐方式：</p>
<pre><code>.row_cell--bottom {  align-self: flex-end}
</code></pre>
<p><img src="https://cdn-media-1.freecodecamp.org/images/V76ETVyzFX4E7HLQ3MLr03LSH6GkYnvjEzNa" alt="V76ETVyzFX4E7HLQ3MLr03LSH6GkYnvjEzNa" width="600" height="400" loading="lazy"></p>
<center>给特定的元素加上.row\_cell — bottom 类会让它在  `row`  内靠底部对齐</center>
<pre><code>.row_cell--center {  align-self: center}
</code></pre>
<p><img src="https://cdn-media-1.freecodecamp.org/images/N-KfRijROiUyGtSj6RTAZmZjNZZ5A3Djf2NA" alt="N-KfRijROiUyGtSj6RTAZmZjNZZ5A3Djf2NA" width="600" height="400" loading="lazy"></p>
<center>给特定的元素加上.row\_cell — center 类会让它在  `row`  内居中对齐</center>
<h4 id="">行内对齐</h4>
<p>像特定的元素可以对齐一样，行内子元素也可以整体对齐。</p>
<p>可以使用下面的修饰符类达到这样的效果：</p>
<pre><code>.row--top {   align-items: flex-start}
</code></pre>
<p><img src="https://cdn-media-1.freecodecamp.org/images/le3bablkysAG-j-JEQQdHyBvvjiCbIfZP2Bs" alt="le3bablkysAG-j-JEQQdHyBvvjiCbIfZP2Bs" width="600" height="400" loading="lazy"></p>
<center>一行上的三个元素都靠顶部对齐</center>
<p><br>需要注意的一个重点是，修饰符类  <code>.row--top</code>  一定要被加在  <code>row</code>  或是父元素  <code>flex-container</code>  上。</p>
<pre><code>&lt;div class="row row--top"&gt;  &lt;div class="row_cell"&gt;&lt;/div&gt;  &lt;div class="row_cell"&gt;&lt;/div&gt;  &lt;div class="row_cell"&gt;&lt;/div&gt;&lt;/div&gt;
</code></pre>
<p>其他的对齐选项见下：</p>
<pre><code>.row--center {   align-items: center}
</code></pre>
<p><img src="https://cdn-media-1.freecodecamp.org/images/NVv3xZxxaIbyPHDJTxp5LdcG-Be0wolyXiCb" alt="NVv3xZxxaIbyPHDJTxp5LdcG-Be0wolyXiCb" width="600" height="400" loading="lazy"></p>
<center>整行的三个元素都居中对齐</center>
<pre><code>.row--bottom {   align-items: flex-end}
</code></pre>
<p><img src="https://cdn-media-1.freecodecamp.org/images/OsI1AJj-F4BMIJQAMN82bY6MXqTxvwmZkw3J" alt="OsI1AJj-F4BMIJQAMN82bY6MXqTxvwmZkw3J" width="600" height="400" loading="lazy"></p>
<center>整行的三个元素都靠底部对齐</center>
<h4 id="">嵌套网格</h4>
<p>只需要简单的设置，rows（行元素）就可以嵌套布局。</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/2eyhYZJlDdZXJkiLuwGYSoB83KKPxnfgfjCg" alt="2eyhYZJlDdZXJkiLuwGYSoB83KKPxnfgfjCg" width="600" height="400" loading="lazy"></p>
<center>一行内有两个元素，其中一个是另一个的两倍大小。一行三个元素居中嵌套排列在较大的元素里</center>
<p><br>你可以在  <a href="https://codepen.io/ohansemmanuel/full/xLBLLG/">created here</a>查看最终的布局效果。</p>
<h4 id="">更多网格布局</h4>
<p>当你可以用 Flexbox 垂直网格甚至更复杂的参数实现好看的网格构造时，就可以把这个很好的工具用于工作。学习，掌握然后使用  <a href="https://medium.com/flexbox-and-grids/how-to-efficiently-master-the-css-grid-in-a-jiffy-585d0c213577">CSS 网格布局</a>，这是 CSS 网格布局的最终解决方案。</p>
<h3 id="4flexbox">例 4：如何使用 Flexbox 构建网站布局</h3>
<p>社区通常不建议整个网站布局都使用 Flexbox。</p>
<p>虽然我赞同这个观点，但是我也认为在特定的情况下你可以不用考虑这么多。</p>
<p>我能给到最重要的一点建议是：</p>
<blockquote>
<p><strong><em>在你需要的时候使用 Flexbox 布局</em></strong></p>
</blockquote>
<p>我会在下面的例子中解释这点。</p>
<h4 id="">圣杯布局</h4>
<p>有什么网站布局方式比“圣杯布局”更经典呢？</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/9HvLwuqluns72rMdkVL4SMf5pyPQMxFb9mSi" alt="9HvLwuqluns72rMdkVL4SMf5pyPQMxFb9mSi" width="600" height="400" loading="lazy"></p>
<center>圣杯布局 — 头部, 页脚和 3 个其他的容器</center>
<p><br>有两种 Flexbox 方式可以实现这种布局。</p>
<p>第一种是用 Flexbox 来实现布局。把  <code>header</code>,  <code>footer</code>,  <code>nav</code>,  <code>article</code>  和  <code>aside</code>  都放在一个  <code>flex-container</code> 容器里。</p>
<p>我们开始吧。</p>
<h4 id="">标识语言</h4>
<p>看下下面这个基本的标识语言：</p>
<pre><code>&lt;body&gt;  &lt;header&gt;Header&lt;/header&gt;  &lt;main&gt;    &lt;article&gt;Article&lt;/article&gt;    &lt;nav&gt;Nav&lt;/nav&gt;    &lt;aside&gt;Aside&lt;/aside&gt;  &lt;/main&gt;  &lt;footer&gt;Footer&lt;/footer&gt;&lt;/body&gt;
</code></pre>
<p>其中，圣杯布局遵循了一个特殊的规则，这个规则启发了上面的标识语言：</p>
<p>中间的那列  <code>article</code>  应该在 <code>nav</code>  和  <code>aside</code> 两个侧边栏之前显示出来。</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/YDZbT2gN-JVcBRbvAkXYasm3Hqo-Q7VtxbU9" alt="YDZbT2gN-JVcBRbvAkXYasm3Hqo-Q7VtxbU9" width="600" height="400" loading="lazy"></p>
<center><article>居中布局且先显示在页面上</article></center>
<p><br>建立一个 Flexbox 格式文本</p>
<pre><code>body {   display: flex}
</code></pre>
<p>因为子元素应该从顶部到底部布局，所以我们要改变 Flexbox 的默认方向。</p>
<pre><code>body { ... flex-direction: column}
</code></pre>
<p><strong>1</strong>. <code>header</code>  和  <code>footer</code>  要有固定的宽度</p>
<pre><code>header,footer {  width: 20vh /*可以使用像素单位，例如200px*/}
</code></pre>
<p><strong>2.</strong><code>main</code>  要填满  <code>flex-container</code>  中剩下的部分。</p>
<pre><code>main {   flex: 1}
</code></pre>
<p>你一定没忘记，  <code>flex: 1</code>  代表  <code>flex-grow: 1</code>  ,  <code>flex-shrink: 1</code>和  <code>flex-basis: 0</code>。</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/eBj3j7v59T5PYdH8sBCadGevCVyOlPfuMIqR" alt="eBj3j7v59T5PYdH8sBCadGevCVyOlPfuMIqR" width="600" height="400" loading="lazy"></p>
<center>这可以让  `main`  “变大” 填满剩下的可用空间</center>
<p><br>此刻，我们要开始考虑  <code>main</code>  中的  <code>article</code>,  <code>nav</code>和  <code>aside</code> 三个部分。</p>
<p>把  <code>main</code>  设成一个  <code>flex-container</code>  ：</p>
<pre><code>main {  display: flex}
</code></pre>
<p>给  <code>nav</code>  和  <code>aside</code>  以固定的宽度：</p>
<pre><code>nav,aside {  width: 20vw}
</code></pre>
<p>然后确保  <code>article</code>  填满剩下的可用空间：</p>
<pre><code>article {   flex: 1}
</code></pre>
<p><img src="https://cdn-media-1.freecodecamp.org/images/3--f-KqkBdvx8jv6n9mhmA354cP7OvgS4Ayz" alt="3--f-KqkBdvx8jv6n9mhmA354cP7OvgS4Ayz" width="600" height="400" loading="lazy"></p>
<center>现在 `"article"`  填满剩下的可用空间</center>
<p><br>现在还需要做一件事。</p>
<p>把  <code>flex-items</code>  重新排序这样  <code>nav</code>  会展示在第一位：</p>
<pre><code>nav {  order: -1}
</code></pre>
<p><img src="https://cdn-media-1.freecodecamp.org/images/rN1l8s8aO44ecL8RBUIG824WpUNHBIyl5iLo" alt="rN1l8s8aO44ecL8RBUIG824WpUNHBIyl5iLo" width="600" height="400" loading="lazy"></p>
<p>最终效果  <a href="https://codepen.io/ohansemmanuel/full/brzJZz/">https://codepen.io/ohansemmanuel/full/brzJZz/</a></p>
<p><br> <code>order</code>  属性用来重新排序  <code>flex-items</code> 的位置。</p>
<p>容器中所有  <code>flex-items</code>  都会以  <strong>增大的</strong> <code>order</code>  值排列， <code>flex-item</code>  中 <code>order</code>  值最小的会排列在最前面。<br>
所有的  <code>flex-items</code>  元素默认  <code>order</code>  值都是  <code>0</code>。</p>
<h4 id="">圣杯布局 (另一种布局方式)</h4>
<p>之前的方式是把  <code>flex-container</code>  作为一个整体的容器。这个布局非常依赖 Flexbox。</p>
<p>我们来了解一种更为“理智”的方法。首先再来看下最终要达到的效果：</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/UIy61i1OzIjdddu2W5i9NvL74JXjY5sclt8i" alt="UIy61i1OzIjdddu2W5i9NvL74JXjY5sclt8i" width="600" height="400" loading="lazy"></p>
<center>圣杯布局</center>
<p><br><code>header</code>  和  <code>footer</code>  可以被当做块状元素。 在没有任何干预的情况下，它们会在从顶部到底部，填满父级元素。</p>
<pre><code>&lt;body&gt;  &lt;header&gt;Header&lt;/header&gt;  &lt;main&gt;    &lt;article&gt;Article&lt;/article&gt;    &lt;nav&gt;Nav&lt;/nav&gt;    &lt;aside&gt;Aside&lt;/aside&gt;  &lt;/main&gt;  &lt;footer&gt;Footer&lt;/footer&gt;&lt;/body&gt;
</code></pre>
<p>使用这种方法，唯一需要作为  <code>flex-container</code>  的就是  <code>main</code> 元素。</p>
<p>使用这个方法有个缺点就是你要自己计算  <code>main</code>  的高度。  <code>main</code>  应该填满除  <code>header</code> 和  <code>footer.</code>外的空间。</p>
<pre><code>main {  height: calc(100vh - 40vh);}
</code></pre>
<p>上面的代码块使用 CSS 中的  <code>calc</code>  来计算  <code>main.</code>的高度。</p>
<p>不管怎样，  <code>main</code>  的高度都要等于  <code>calc(100vh — 头部的高度 — 页脚的高度 ).</code></p>
<p>在之前的解决方案中， <code>header</code>  和  <code>footer</code>  都有一个固定的高度，接下来再通过同样的方法计算  <code>main</code>  的高度。</p>
<p>你可以在  <a href="https://codepen.io/ohansemmanuel/full/brzybZ/">actual results here</a> 中查看最终效果。</p>
<h4 id="">两列网页布局</h4>
<p>两列布局很常见，这也可以用 Flexbox 轻松实现。</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/Mk-G8NgfEsSoMlzbafucKr5IUHOiSAcr4cEp" alt="Mk-G8NgfEsSoMlzbafucKr5IUHOiSAcr4cEp" width="600" height="400" loading="lazy"></p>
<center>包含边栏和主内容的两列布局</center>
<p><b>看下以下标识文本：</b></p><b>
<pre><code>&lt;body&gt;  &lt;aside&gt;sidebar&lt;/aside&gt;  &lt;main&gt;main&lt;/main&gt;&lt;/body&gt;
</code></pre>
<p>先建一个 Flexbox 格式文本：</p>
<pre><code>body {  display: flex;}
</code></pre>
<p>给  <code>aside</code>  一个固定的宽度：</p>
<pre><code>aside {   width: 20vw}
</code></pre>
<p>最后，确保  <code>main</code>  填满剩下的可用空间：</p>
<pre><code>main {  flex: 1}
</code></pre>
<p>这样就差不多可以了。</p>
<h3 id="5flexbox">例5：使用 Flexbox 布局媒体对象</h3>
<p>媒体对象随处可见。从 tweets 到 Facebook 上的发贴, 大部分页面设计似乎都会选择媒体对象。</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/hoOVQQcGFJ-EivoJRCqOTXynRzq88ye3zzE6" alt="hoOVQQcGFJ-EivoJRCqOTXynRzq88ye3zzE6" width="600" height="400" loading="lazy"></p>
<p>Tweet 和 Facebook 上的发帖示例</p>
<p><br>看下下面这个标识文本：</p>
<pre><code>&lt;div class="media"&gt;  &lt;img class="media-object" src="/pic.jpg"&gt;  &lt;div class="media-body"&gt;    &lt;h3 class="media-heading"&gt; Header &lt;/h3&gt;    &lt;p&gt;&lt;/p&gt;  &lt;/div&gt;&lt;/div&gt;
</code></pre>
<p>你应该已经猜到了，  <code>.media</code>  会使用 Flexbox 布局：</p>
<pre><code>.media {   display: flex}
</code></pre>
<p><code>container</code>  中的  <code>flex-items</code> 默认是在  <code>flex-container</code> 中垂直拉伸，填满可用高度。</p>
<p>确保  <code>.media-body</code>  填满剩下的可用空间：</p>
<pre><code>.media-body {   flex: 1}
</code></pre>
<p><img src="https://cdn-media-1.freecodecamp.org/images/zJRJJ8NeVDHI1FNdnsKF5mpeRXjabOb-zVk9" alt="zJRJJ8NeVDHI1FNdnsKF5mpeRXjabOb-zVk9" width="600" height="400" loading="lazy"></p>
<center>左边的盒子拉伸填满可见屏幕，媒体主体在媒体对象（白色部分）内横向填满剩下的空间</center>
<p><br>我们来调整下拉伸的盒子模型。</p>
<pre><code>.media {  ...  align-items: flex-start}
</code></pre>
<p><img src="https://cdn-media-1.freecodecamp.org/images/hkcBJNNimRRArL6iPiDoFN3UdSJSHdRazWlw" alt="hkcBJNNimRRArL6iPiDoFN3UdSJSHdRazWlw" width="600" height="400" loading="lazy"></p>
<p>弹性项目在媒体对象中从起点对齐。现在图片保持默认大小，没有变形拉伸:)</p>
<p><br>就是这样。</p>
<h4 id="">画报媒体对象</h4>
<p><img src="https://cdn-media-1.freecodecamp.org/images/GL7OTu019Ov2HtElcXKhObmhreC86yEDpKK0" alt="GL7OTu019Ov2HtElcXKhObmhreC86yEDpKK0" width="600" height="400" loading="lazy"></p>
<p>画报媒体对象是图片在媒体对象的另一边（右边）</p>
<p><br>创建画报媒体对象不需要改变  <code>html</code>  元素的顺序。</p>
<p>只需要让弹性项目像这样重新排序：</p>
<pre><code>.media-object {   order: 1}
</code></pre>
<p>这样图片就会排列在  <code>.media-body</code>  和  <code>media-heading</code> 之后。</p>
<h4 id="">媒体对象的嵌套</h4>
<p>你甚至可以不改变已有的 CSS 样式来继续用嵌套布局媒体对象。</p>
<pre><code>&lt;div class="media"&gt;  &lt;img class="media-object" src="/pic.jpg"&gt;  &lt;div class="media-body"&gt;    &lt;h3 class="media-heading"&gt; Header &lt;/h3&gt;    &lt;p&gt;&lt;/p&gt;        &lt;!--nested--&gt;    &lt;div class="media"&gt;    &lt;img class="media-object" src="/pic.jpg"&gt;    &lt;div class="media-body"&gt;        &lt;h3 class="media-heading"&gt; Header &lt;/h3&gt;        &lt;p&gt;&lt;/p&gt;    &lt;/div&gt;    &lt;/div&gt;&lt;!--end nested--&gt;  &lt;/div&gt; &lt;/div&gt;
</code></pre>
<p>可以了！</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/cH3o4d2UTkqB1qWCqymnvLjyGpmJ3mmEq-Ro" alt="cH3o4d2UTkqB1qWCqymnvLjyGpmJ3mmEq-Ro" width="600" height="400" loading="lazy"></p>
<p>媒体对象在其中嵌套布局</p>
<h4 id="">字符码媒体对象</h4>
<p>我们不用只拘泥于图片。</p>
<p>在不改变已经写好的 CSS 样式情况下，你可以用字符码来代替图片。</p>
<pre><code>&lt;div class="media"&gt;  &lt;div class="media-object"&gt;?&lt;/div&gt;  &lt;div class="media-body"&gt;    &lt;h3 class="media-heading"&gt; Header &lt;/h3&gt;    &lt;p&gt;&lt;/p&gt;  &lt;/div&gt;&lt;/div&gt;
</code></pre>
<p>我在那里放了一个 emoji 表情。</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/i5nrdZwTbOz3vGgZZUAwyqaG9GZEzWJSmh8i" alt="i5nrdZwTbOz3vGgZZUAwyqaG9GZEzWJSmh8i" width="600" height="400" loading="lazy"></p>
<p>带有 emoji 表情的媒体对象</p>
<p>上面用一个包含适当表情的编码来代替  <code>img</code>  。你可以在<a href="https://emojipedia.org/">这里</a>获取更多的emoji表情。</p>
<h4 id="html">HTML实体媒体对象</h4>
<p>你也可以使用如下的  <a href="https://www.w3schools.com/html/html_entities.asp">html实体</a> 。</p>
<pre><code>&lt;div class="media"&gt;  &lt;div class="media-object"&gt;☎&lt;/div&gt;  &lt;div class="media-body"&gt;    &lt;h3 class="media-heading"&gt; Header &lt;/h3&gt;    &lt;p&gt;&lt;/p&gt;  &lt;/div&gt;&lt;/div&gt;
</code></pre>
<p>这里使用的html实体是  <code>☎</code>  ，效果如下：</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/ssilgIfm3znqoCXzkmUXSnOuvziC5MauRQ0h" alt="ssilgIfm3znqoCXzkmUXSnOuvziC5MauRQ0h" width="600" height="400" loading="lazy"></p>
<p>html实体, ☎</p>
<p><br>你可以在  <a href="https://codepen.io/ohansemmanuel/full/jLJbGL/">CodePen</a>查看这些例子的效果。</p>
<h3 id="6flexbox">例 6：如何使用Flexbox建立表单元素</h3>
<p>现在很难找到没有一两个表单的网站了。</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/h8nCEyfprhm-MuBBUjW-vpd7W2LY6L2tdmYg" alt="h8nCEyfprhm-MuBBUjW-vpd7W2LY6L2tdmYg" width="600" height="400" loading="lazy"></p>
<center>表格输入框，前后加其他元素</center>
<p><br>看下面这段标识文本：</p>
<pre><code>&lt;form class="form"&gt;  &lt;input class="form__field"&gt;  &lt;button class="form__item"&gt;…&lt;/button&gt;&lt;/form&gt;&lt;form class="form"&gt;  &lt;span class="form__item"&gt;…&lt;/span&gt;  &lt;input class="form__field"&gt;&lt;/form&gt;&lt;form class="form"&gt;  &lt;span class="form__item"&gt;…&lt;/span&gt;  &lt;input class="form__field"&gt;  &lt;button class="form__item"&gt;…&lt;/button&gt;&lt;/form&gt;
</code></pre>
<p>这个例子展示了输入框与按钮或是文字的结合，我们仍可以用 Flexbox 轻松解决。</p>
<p>新建一个 Flexbox 格式文本：</p>
<pre><code>.form {  display: flex}
</code></pre>
<p>确保输入框填满可用空间：</p>
<pre><code>.form__field {   flex: 1}
</code></pre>
<p>最后，你可以按照你喜欢的方式在前后放入文字或者按钮。</p>
<pre><code>.form__item {  ... }
</code></pre>
<p>你可以在  <a href="https://codepen.io/ohansemmanuel/full/ZJPmNj/">CodePen</a>里看到这个例子的完整效果。</p>
<h3 id="7flexboxapp">例 7：如何使用 Flexbox 来创建一个手机 App 布局</h3>
<p>在这个例子中，我会带你一起来打造一个如下的手机应用布局：</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/FDxWh9vQBhjQ2L6pSyb2w4QuqJvIjjuXElFF" alt="FDxWh9vQBhjQ2L6pSyb2w4QuqJvIjjuXElFF" width="600" height="400" loading="lazy"></p>
<p>我们将通过 Flexbox 建立的手机应用布局</p>
<p><br>不过这个例子有点不同。</p>
<p>我会解释用代码建立手机布局的过程，你可以尝试完成。</p>
<p>这是一个让你 <strong>熟练</strong> 的方式。</p>
<h4 id="">第一步</h4>
<p>剥离出 iPhone 的页面布局，我们得到下面这个：</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/cH4ifH1HxdWH9M7IpSEphw9dz7op6WJ7KM8v" alt="cH4ifH1HxdWH9M7IpSEphw9dz7op6WJ7KM8v" width="600" height="400" loading="lazy"></p>
<p>骨架屏布局</p>
<h4 id="">第二步</h4>
<p>将主体部分定义成一个  <code>flex-container</code></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/gGlfDGRg8mSHNpD-PqZGNI9JnIzTCQiSOWrb" alt="gGlfDGRg8mSHNpD-PqZGNI9JnIzTCQiSOWrb" width="600" height="400" loading="lazy"></p>
<p>将格式化文本建立成一个弹性容器</p>
<h4 id="">第三步</h4>
<p><code>flex-container</code>  默认的  <code>flex-direction</code>  属性是  <code>row</code>。在这个例子中，我们要把它变成  <code>column</code>  。</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/C1KEFWls3---EMGS2nEiLh8pXnk6a2YOH7x0" alt="C1KEFWls3---EMGS2nEiLh8pXnk6a2YOH7x0" width="600" height="400" loading="lazy"></p>
<p>改变 3 个子元素也就是  <code>flex-items</code> 的默认布局方向</p>
<h4 id="">第四步</h4>
<p>给元素 1 和元素 3 一个固定的高度  <code>height: 50px.</code></p>
<h4 id="">第五步</h4>
<p>元素 2 要有一个填满可用空间的高度。使用<code>flex-grow</code>  或是简写的  <code>flex</code> 写法 <code>flex: 1.</code> 。</p>
<h4 id="">第六步</h4>
<p>最后，像之前的例子一样，把每个块状元素当成一个媒体对象。</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/ZD4lqIbYDidmyyCu-lGXi9QXpKjaX7eOUScN" alt="ZD4lqIbYDidmyyCu-lGXi9QXpKjaX7eOUScN" width="600" height="400" loading="lazy"></p>
<p>把内容块当成媒体对象</p>
<p>按照上面的六个步骤可以成功建立一个手机应用布局。</p>
<h3 id="">想要更专业？</h3>
<p>免费下载我的 CSS 网格布局参考手册，还可以免费获得两节优质的响应式 Flexbox 课程！</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/Hisu3Q2Yz70DyjZSPfJ3Dr0gnZ9eB38g152g" alt="Hisu3Q2Yz70DyjZSPfJ3Dr0gnZ9eB38g152g" width="600" height="400" loading="lazy"></p>
<p><a href="http://eepurl.com/dcNiP1">点击免费获得免费的 CSS 网格布局手册 + 两节优质的课程！</a></p>
<p><a href="http://eepurl.com/dcNiP1">现在去领</a></p>
<p>原文：<a href="https://www.freecodecamp.org/news/the-ultimate-guide-to-flexbox-learning-through-examples-8c90248d4676/">The Ultimate Guide to Flexbox — Learning Through Examples</a>，作者：<a href="https://www.freecodecamp.org/news/author/emmanuel/">Emmanuel Ohans</a></p>
<!--kg-card-end: markdown--></b> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 网站布局和设计指南，零基础也能看懂！ ]]>
                </title>
                <description>
                    <![CDATA[ 如果你想兼职为客户搭建网站，或只是建立自己的作品集，那么你可能面临这样的难题： 在没有任何网站设计技巧的情况下，如何建立一个网站？ 有以下方案可供你选择：  * 你可以雇一个网站设计师——不过设计师或者说好的设计师收费不低。  * 你也可以在 Fiverr，Upwork, 猪八戒等等平台找一个收费低的设计师——但是你也知道这是有风险的。  * 或者你可以直接从网上下载一个免费甚至是高级的主题模板——不过通常这并不能满足你的所有要求 还有个方法是自己学习一些设计和布局网站的技巧，然后打造出自己的前端展现效果。 不过在你成为一名出色的设计师之前，不妨阅读一下这篇文章。当然了，如果你想制作复杂的网站，那还是得找一位专业设计师和你搭档。 但是我也相信你可以学会如何设计简单的网站，这可以应对大部分小企业的网站需求。 这个方法包括：  * 了解网站视觉呈现的基础  * 调查现有网站设计以获得灵感和想法 以上两点正是我用来建立自己网站 [https://coder-coder.com/] 的技巧。当然，这只是一个很简单的设计，不是特别精致。但是通常简单的设计就可以满足你的需求。  ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/how-to-layout-and-design-a-website/</link>
                <guid isPermaLink="false">5da95425ca1efa04e196a162</guid>
                
                <dc:creator>
                    <![CDATA[ Sunny Sun ]]>
                </dc:creator>
                <pubDate>Thu, 16 Apr 2020 06:16:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2019/10/1_Phg_9259Vl8tNHyCh_W3sg.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>如果你想兼职为客户搭建网站，或只是建立自己的作品集，那么你可能面临这样的难题：</p>
<p>在没有任何网站设计技巧的情况下，如何建立一个网站？</p>
<p>有以下方案可供你选择：</p>
<ul>
<li>你可以雇一个网站设计师——不过设计师或者说好的设计师收费不低。</li>
<li>你也可以在 Fiverr，Upwork, 猪八戒等等平台找一个收费低的设计师——但是你也知道这是有风险的。</li>
<li>或者你可以直接从网上下载一个免费甚至是高级的主题模板——不过通常这并不能满足你的所有要求</li>
</ul>
<p>还有个方法是自己学习一些设计和布局网站的技巧，然后打造出自己的前端展现效果。</p>
<p>不过在你成为一名出色的设计师之前，不妨阅读一下这篇文章。当然了，如果你想制作复杂的网站，那还是得找一位专业设计师和你搭档。</p>
<p>但是我也相信你可以学会如何设计简单的网站，这可以应对大部分小企业的网站需求。</p>
<p>这个方法包括：</p>
<ul>
<li>了解网站视觉呈现的基础</li>
<li>调查现有网站设计以获得灵感和想法</li>
</ul>
<p>以上两点正是我用来建立<a href="https://coder-coder.com/">自己网站</a>的技巧。当然，这只是一个很简单的设计，不是特别精致。但是通常简单的设计就可以满足你的需求。</p>
<p>只要你掌握了设计布局网站的基础，就可以建立自己的网站或是兼职给客户定制。</p>
<p>当然，你可以从每一次网站设计过程中积累经验。随着技能的提升，你将可以创造出越来越复杂的设计。</p>
<p>以下是这个过程中的关键步骤：</p>
<ul>
<li>确定网站的基础内容</li>
<li>规划网站布局</li>
<li>整合设计</li>
<li>完成作品</li>
</ul>
<p>每一步都需要调查支撑——浏览其他网站看看他们是怎么做的，然后将其中好的部分复用到你自己的网站中。</p>
<p>需要重点提醒的是：我并不是鼓励你去抄袭别人的样式或者图片。（最重要的是，简单的复制粘贴并不能提升你的技能。）</p>
<p>我的观点是从别人优秀的作品中获得创意灵感，再创造出相似的设计。</p>
<h3 id="">确定网站的基础内容</h3>
<p>在你选择颜色或是字体之前，先回答以下几个关于网站的常见问题：</p>
<p><strong>1. 这个网站是用来推广哪种业务的？</strong></p>
<p>披萨店？摄影工作室？还是书店？网站推广对于任何商业都是有用的，因此你可以任意选择。</p>
<p>我们这次选择推广名叫 Central Coffee 的虚拟咖啡店。因为人们都喜欢喝咖啡，对不对？</p>
<p><strong>2. 这个网站要包含什么样的页面？</strong></p>
<p>网页通用页面包括主页、关于我们、联系我们和有关公司产品的介绍。</p>
<p>确定页面构造最好的方法就是先做一个简单的在线调查。</p>
<h3 id="">调查现有网站</h3>
<p>选择3-4个相似行业的网站，观察网站都包含哪些页面。</p>
<p>注意网站是如何设计的并记录下来：</p>
<ul>
<li>网站包含哪些页面，</li>
<li>网站整体样式是怎样的，</li>
<li>导航和搜索的便捷性，</li>
<li>还有其他你感兴趣的方面。</li>
</ul>
<p><a href="https://themeforest.net/">Theme Forest</a> 是一个寻找示例网站很好的地方，上面有大量免费和高级的网站模板以及主题。如果你有关注最流行的主题，就会知道他们通常是好设计的典范。</p>
<p>下面是一个我找到的咖啡店示例：</p>
<h3 id="the7"><a href="https://the7.io/coffee/">The7</a></h3>
<p><img src="https://cdn-media-1.freecodecamp.org/images/CwDQtWgEDoAuCV2QbGOwk4-2haLo6ShbjfZA" alt="CwDQtWgEDoAuCV2QbGOwk4-2haLo6ShbjfZA" width="600" height="400" loading="lazy"></p>
<p><strong>页面：</strong><br>
单页网站包含以下模块：主页、关于我们、地址、价格、菜单、新闻、媒体报道、博客</p>
<p><strong>样式：</strong><br>
现代简洁，高质图片</p>
<p><strong>导航：</strong><br>
便捷导航</p>
<p>这些是我从“芝加哥的咖啡店” 研究中找到的一些网站：</p>
<h3 id="thewormholecoffee"><a href="http://www.thewormhole.us/">The Wormhole Coffee</a></h3>
<p><img src="https://cdn-media-1.freecodecamp.org/images/KgKQlk0O0aC8CCXbyV8DaLxUBHfDncZ6rO6x" alt="KgKQlk0O0aC8CCXbyV8DaLxUBHfDncZ6rO6x" width="600" height="400" loading="lazy"></p>
<p><strong>页面：</strong><br>
主页、博客、地址/联系方式、工作机会</p>
<p><strong>样式：</strong><br>
偏现代风，店铺照片走复古风</p>
<p><strong>导航：</strong><br>
并不很容易看出这是一家咖啡店，网站导航有点难度</p>
<h3 id="caffestreets"><a href="http://www.caffestreets.com/">Caffe Streets</a></h3>
<p><img src="https://cdn-media-1.freecodecamp.org/images/wJ9dMdP7xxHxtoCB2a9EYDTHUsd0WoaokzgI" alt="wJ9dMdP7xxHxtoCB2a9EYDTHUsd0WoaokzgI" width="600" height="400" loading="lazy"></p>
<p><strong>页面：</strong><br>
单页网站，模块包含：主页、咖啡（关于我们）、菜单、烘焙、时间机器（果汁）以及联系表格</p>
<p><strong>样式：</strong><br>
现代简约风（方格布局）</p>
<p><strong>导航：</strong><br>
我很喜欢固定下拉菜单的设计，点击每个菜单可以看到相应的内容。</p>
<h3 id="buildcoffee"><a href="https://buildcoffee.org/">Build Coffee</a></h3>
<p><img src="https://cdn-media-1.freecodecamp.org/images/HDMc3Ey2CObm46o17kvJHGWhgKjrxdoRgPn-" alt="HDMc3Ey2CObm46o17kvJHGWhgKjrxdoRgPn-" width="600" height="400" loading="lazy"></p>
<p><strong>页面：</strong><br>
单页网站，模块包括：主页、关于我们、营业时间、地址、网上商城、餐饮、活动以及联系方式</p>
<p><strong>样式：</strong><br>
简约风，白底文字中间穿插全幅图片</p>
<p><strong>导航：</strong><br>
很容易导航</p>
<h3 id="sawadacoffee"><a href="http://sawadacoffee.com/">Sawada Coffee</a></h3>
<p><img src="https://cdn-media-1.freecodecamp.org/images/PZRfYxllDpERdb8oB8I3UuG2F-fT2BX73eMZ" alt="PZRfYxllDpERdb8oB8I3UuG2F-fT2BX73eMZ" width="600" height="400" loading="lazy"></p>
<p><strong>页面：</strong><br>
主页、关于我们、食品饮料、媒体报道、联系方式及营业时间、餐厅以及招聘信息</p>
<p><strong>样式：</strong><br>
主要为图片，文字较少</p>
<p><strong>导航：</strong><br>
导航不太容易找-我差点没注意到右边角落的侧边栏</p>
<h3 id="">记录下对自己网站有用的点</h3>
<p>浏览了一些咖啡店网站之后，我们更清楚他们的相似点，心中也大致了解哪些对我们有用哪些用处不大。</p>
<p>基于以上调查，你可以记下对自己网站有用的点。</p>
<p>我认为即将建立的 Central Coffee 网站，是包含以下模块的简约风单页网站：</p>
<ul>
<li>头部导航栏</li>
<li>主页</li>
<li>关于我们</li>
<li>菜单</li>
<li>地址/联系方式</li>
<li>页脚</li>
</ul>
<h3 id="">规划网站布局</h3>
<p>此刻我们已经勾画出这个网站有了的大致框架，接下来就是确定各个页面或者模块需要填充的内容。我们最终确定的布局也可以被称为“线框图”。</p>
<p>现在我们还没给这个线框图具体的设计，也就是字体、颜色或者照片都不确定。我们只需要大致清楚需要填充什么类型的内容，或是他们在页面中的位置。这更像是现阶段的结构图或是蓝图。</p>
<h3 id="">头部导航</h3>
<p>我喜欢 Seven Coffee 和 Caffe Streets 的顶部导航栏。</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/JjSmjbTYDE5Qd9i4cH9W4rpKDxLXk92VTw-s" alt="JjSmjbTYDE5Qd9i4cH9W4rpKDxLXk92VTw-s" width="600" height="400" loading="lazy"></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/hszTPLF2H01n7v--G7mXhzQxyUCxK-5ARteB" alt="hszTPLF2H01n7v--G7mXhzQxyUCxK-5ARteB" width="600" height="400" loading="lazy"></p>
<p>不过这两个网站的 logo 都是居中的，我喜欢设置为靠左，首先是 logo，然后是其他部分。</p>
<p>这是桌面版本，对于平板电脑和手机，可以默认在顶部排列 logo 和侧边栏。</p>
<p>点击侧边栏，从右边展示收缩导航菜单。</p>
<h3 id="">主页</h3>
<p>因为这是单页网站，“主页”就是一进入网站时在屏幕上看到的部分。我喜欢 Seven Coffee 网站店名下的小标签设计。</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/jlAIYSPgnei-1Wt4Ys51MUIBBGDqu7o1dlsU" alt="jlAIYSPgnei-1Wt4Ys51MUIBBGDqu7o1dlsU" width="600" height="400" loading="lazy"></p>
<p>这里可以是一张背景图片（像是 Build Coffee）上面有文字，这样的布局同时适用于电脑和手机端。</p>
<h3 id="">关于我们</h3>
<p>所有的网站的都会有简短的关于我们模块，有些是图片介绍。我准备放一段关于咖啡店的介绍文字以及一些店内环境照片，这样可以吸引用户来店里看看。</p>
<h3 id="">菜单</h3>
<p>每家网站都有不同的菜单：</p>
<ul>
<li>Seven Coffee 的菜单是一个价格表</li>
<li>Caffe Streets 只有商品清单</li>
<li>Build and Sawada 提供的是 PDF 版本菜单的外部链接</li>
</ul>
<p>我个人不喜欢在手机上浏览网站的时候还需要下载个 PDF 文件，因此我准备提供带有图片的简易食品饮料菜单。</p>
<h3 id="">地址/联系方式</h3>
<p>我想把地址、营业时间和联系方式放在页面底部。用户习惯从网站顶部开始滚动到底部，这样把有行动诉求的放在底部，当他们浏览完所有内容想着接下来的行动时，这些内容可以促进他们采取行动，特别是看到咖啡店的路线指引。</p>
<h3 id="">页脚</h3>
<p>页脚部分很小，只有小块的版权信息。</p>
<h3 id="">完整框架</h3>
<p>下面是我用免费在线工具 <a href="https://mockflow.com/">Mockflow</a> 创建的电脑和手机版本的完整网页框架。在这个网站上创建首个项目是免费的，之后如果你还需要创建模板，就需要付费。Mockflow 很好上手，我也很喜欢这种素描风格，挺有趣的。</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/tqWcD2VYl9l0F5NgsJ8FSnP9Cl3eqUrd1dr5" alt="tqWcD2VYl9l0F5NgsJ8FSnP9Cl3eqUrd1dr5" width="600" height="400" loading="lazy"></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/2t6gYI5AIAl1X6q0j9zIU1gn22kejMY7rYJo" alt="2t6gYI5AIAl1X6q0j9zIU1gn22kejMY7rYJo" width="600" height="400" loading="lazy"></p>
<h3 id="">确定基础设计规范</h3>
<p>再提醒一下，我们不是要制作一个很详细很漂亮的网站。不过我们也需要掌握一些基础，像是：</p>
<h3 id=""><strong>色彩方案</strong></h3>
<p>简单来说，色彩方案就是用于网站的不同颜色，就像是绘画、装修自己的家一样。通常你会大面积使用像是灰色白色的中性色调，再结合一两种明亮重点的颜色以突出重要的部分，例如链接和按钮。</p>
<p>如果你需要一些色彩灵感，可以尝试 <a href="https://www.canva.com/learn/brand-color-palette/">sample color palettes</a> 这样的画布。</p>
<p>而对于我们的网站 Central Coffee，我将使用 Canva 链接中的 Fall Collection——这是个基于棕色的暖色调。</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/RxiZDgixwfbfhNyCxovKQML3ven3LRzYNoSJ" alt="RxiZDgixwfbfhNyCxovKQML3ven3LRzYNoSJ" width="600" height="400" loading="lazy"></p>
<p>我试图营造舒适怀旧的咖啡店风格。</p>
<h3 id=""><strong>字体</strong></h3>
<p>回到之前提到的网站，其中大部分网站都使用无衬线字体（这种字体没有衬线，或是像打印出来的文字）。</p>
<p>对于大部分文字内容，我会选择简单的字体，对于标题和提要则使用好看加粗的字体。</p>
<p>你可以通过 <a href="https://fonts.google.com/">Google Fonts</a> 找到适用于你网站的免费字体，但是尽量不要选择太多，因为不同的字体、字重和样式都会增加网站的加载时间。</p>
<h3 id=""><strong>图片/照片</strong></h3>
<p>选择一种适合网站商业类型的样式。对于咖啡店来说，你通常会选择吸引人的照片，像是体现灯光柔和、复古舒适的店内环境以及人们在店内轻松交谈以及店内的食品饮料的图片。</p>
<p>你也可以从免费的设计网站上找到适合你网站的配图和 logo，例如：</p>
<ul>
<li><a href="https://www.canva.com/">Canva</a></li>
<li><a href="https://vectr.com/">Vectr</a></li>
<li><a href="https://snappa.com/">Snappa</a></li>
</ul>
<h3 id="">建立网站</h3>
<p>现在我们已经有了展示各个部分布局的线框图，也有关于前端样式的设计指南。</p>
<p>因为我们没有可以给出详细 PSD 的设计师，所以可以直接对照着之前建造的框架来开始编写我们的网站。</p>
<p>我通常编写网站前端的步骤如下：</p>
<ol>
<li>建立网站文件</li>
<li>构建文件结构</li>
<li>让任务跑起来（我用的是 <a href="https://gulpjs.com/">Gulp</a>）</li>
<li>为每个模板建立单独的 HTML 文件</li>
</ol>
<p>接下来对于每个 HTML 文件进行以下步骤：</p>
<ol>
<li>创建基础 HTML 元素的框架</li>
<li>一个个编写页面元素</li>
<li>为每个元素加入 css 样式，首先要确保每块内容的正确布局</li>
<li>检查页面在浏览器中的展示，并继续修改优化</li>
</ol>
<h3 id="">确保你的网页是响应式的</h3>
<p>在编写网站时，应该确保你的样式在电脑、平板以及手机上展现的样式是差不多的。</p>
<p>你可以在电脑上检查不同浏览器的显示样式，而对于手机端，你也可以使用谷歌浏览器的开发者工具来模拟不同手机设备的显示效果。</p>
<p>要知道模拟工具不会百分百模拟出你实际在手机或是平板上看到的效果，因此最终还是要在真机上检查实际显示效果。</p>
<p>有以下网站可供模拟移动设备调试：</p>
<ul>
<li><a href="http://www.responsinator.com/">Responsinator.com</a>  （免费）</li>
<li><a href="http://quirktools.com/screenfly">Screenfly</a>  by Quirktools （免费）</li>
<li><a href="https://www.browserstack.com/">Browserstack</a>  （收费）——Browserstack 可以让你在真机上调试效果。</li>
</ul>
<h3 id="">作品完成!</h3>
<p>这张是完成后的 Central Coffee 网站截图</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/JycvLFxLnypcvwpARjmHo6F4U-IRSPIbr1hW" alt="JycvLFxLnypcvwpARjmHo6F4U-IRSPIbr1hW" width="600" height="400" loading="lazy"></p>
<p>你也可以通过 <a href="https://thecodercoder.github.io/central-coffee-demo">on my Github.io page</a> 自己检查下网站效果。</p>
<p>以上就是我在没有聘请设计师的情况下自己设计建立的网站。</p>
<p>希望这篇文章对你有用。如果你有任何想法也可以在下方评论区留言。</p>
<h4 id="">想浏览更多内容?</h4>
<p>◾️ 可以在我的博客 <a href="https://coder-coder.com/">Coder-Coder.com.</a>上阅读更多类似这样的对你有帮助的文章。<br>
◾️ 在 <a href="https://www.instagram.com/thecodercoder/">Instagram</a>  和  <a href="https://twitter.com/thecodercoder">Twitter</a> 上关注我!<br>
◾️ 在我的Youtube频道 <a href="https://www.youtube.com/c/codercodertv">my YouTube channel</a> 查看编码指导。</p>
<p>原文：<a href="https://www.freecodecamp.org/news/how-to-layout-and-design-a-website-without-any-design-skills-86d94e40b55a/">https://www.freecodecamp.org/news/how-to-layout-and-design-a-website-without-any-design-skills-86d94e40b55a/</a> ，作者：Jessica Chan</p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
