<?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[ Flexbox - 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[ Flexbox - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/chinese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Thu, 14 May 2026 19:59:02 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/chinese/news/tag/flexbox/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ CSS Flexbox 手册——附带实用示例的完整指南 ]]>
                </title>
                <description>
                    <![CDATA[ Flexbox 是一个有用的工具，用于为网页创建美观且响应式的布局。在本指南中，你将学习像专业人士一样开始使用 CSS Flexbox 所需的一切知识。我们还将学习大量练习示例。 如果你是初学者 web 开发人员，本指南对你来说是一份完美的资源。如果你是经验丰富的开发人员，想要提高响应式网页设计技能，它也会很有用。 目录  * 什么是 Flexbox  * 使用 Flexbox 有什么好处  * 主轴和交叉轴  * Flex 容器和 Flex 项  * 了解 Flex 和 Inline-flex  * display: flex  * display: inline-flex  * Flex 容器属性  * flex-direction 属性  ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/the-css-flexbox-handbook/</link>
                <guid isPermaLink="false">6604e2b96f02f80413b53aa1</guid>
                
                    <category>
                        <![CDATA[ Flexbox ]]>
                    </category>
                
                    <category>
                        <![CDATA[ CSS ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ huqi ]]>
                </dc:creator>
                <pubDate>Thu, 28 Mar 2024 04:53:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2024/03/The-CSS-Flexbox-Handbook-Cover.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/the-css-flexbox-handbook/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">The CSS Flexbox Handbook – Complete Guide with Practical Examples</a>
      </p><!--kg-card-begin: markdown--><p>Flexbox 是一个有用的工具，用于为网页创建美观且响应式的布局。在本指南中，你将学习像专业人士一样开始使用 CSS Flexbox 所需的一切知识。我们还将学习大量练习示例。</p>
<p>如果你是初学者 web 开发人员，本指南对你来说是一份完美的资源。如果你是经验丰富的开发人员，想要提高响应式网页设计技能，它也会很有用。</p>
<h2 id="">目录</h2>
<ul>
<li><a href="#what-is-flexbox">什么是 Flexbox</a></li>
<li><a href="#what-are-the-benefits-of-using-flexbox">使用 Flexbox 有什么好处</a></li>
<li><a href="#the-main-axis-and-the-cross-axis">主轴和交叉轴</a></li>
<li><a href="#flex-containers-and-flex-items">Flex 容器和 Flex 项</a></li>
<li><a href="#understanding-flex-and-inline-flex">了解 <code>Flex</code> 和 <code>Inline-flex</code></a></li>
<li><a href="#display-flex">display: flex</a></li>
<li><a href="#display-inline-flex">display: inline-flex</a></li>
<li><a href="#the-flex-container-properties">Flex 容器属性</a></li>
<li><a href="#the-flex-direction-property"><code>flex-direction</code> 属性</a></li>
<li><a href="#the-flex-wrap-property"><code>flex-wrap</code> 属性</a></li>
<li><a href="#the-flex-flow-shorthand-property"><code>flex-flow</code> 缩写属性</a></li>
<li><a href="#the-justify-content-property"><code>justify-content</code> 属性</a></li>
<li><a href="#the-align-items-property">T<code>align-items</code> 属性</a></li>
<li><a href="#the-align-content-property"><code>align-content</code> 属性</a></li>
<li><a href="#the-place-content-property"><code>place-content</code> 属性</a></li>
<li><a href="#the-flex-items-properties">Flex 项属性</a></li>
<li><a href="#the-order-property"><code>order</code> 属性</a></li>
<li><a href="#the-align-self-property"><code>align-self</code> 属性</a></li>
<li><a href="#the-flex-grow-property"><code>flex-grow</code> 属性</a></li>
<li><a href="#the-flex-shrink-property"><code>flex-shrink</code> 属性</a></li>
<li><a href="#the-flex-basis-property"><code>flex-basis</code> 属性</a></li>
<li><a href="#the-flex-shorthand-property"><code>flex</code> 缩写属性</a></li>
<li><a href="#flexbox-gaps">Flexbox 间隙</a></li>
<li><a href="#how-to-center-an-element-with-flexbox">如何使用 Flexbox 将元素居中</a></li>
<li><a href="#practice-with-flexbox-games">通过 Flexbox 游戏练习</a></li>
<li><a href="#are-there-bugs-in-css-flexbox">CSS Flexbox 中有 Bug 吗</a></li>
<li><a href="#conclusion">总结</a></li>
</ul>
<h2 id="what-is-flexbox">什么是 Flexbox</h2>
<p>Flexbox 是“Flexible Box Layout”的缩写。它是一个 CSS 布局模型，可以简化复杂布局的创建。它提供了一种灵活的方式来对齐元素并在容器元素内分配空间。</p>
<p>Flexbox 布局模型是双向的。这意味着你可以按行、列或两者排列元素。稍后会详细介绍。</p>
<h3 id="what-are-the-benefits-of-using-flexbox">使用 Flexbox 有什么好处</h3>
<p>在 Flexbox 出现之前，创建复杂的布局和响应式网页非常艰难。你需要 CSS 浮动和位置属性的组合。这需要许多变通方法和技巧。</p>
<p>但使用 Flexbox，你现在可以面对更少的困难，使用更少的代码行数来实现以下操作：</p>
<ul>
<li>使用<code>justify-content</code> 和 <code>align-items</code> 等属性对齐和居中元素。</li>
<li>无需编写大量媒体查询即可开发响应式布局。</li>
<li>在不改变 HTML 结构的情况下重新排序元素。</li>
<li>创建相同高度的列，无需任何额外的 HTML 元素或背景图片。</li>
</ul>
<p>现在，你了解了 Flexbox 是什么，以及可以使用它做的一些事情。让我们看看你如何使用它。</p>
<h3 id="the-main-axis-and-the-cross-axis">主轴和交叉轴</h3>
<p>关于 Flexbox，你首先需要了解的是轴的概念。每个 Flex 容器（ <code>display</code> 属性设置为 <code>flex</code> 或 <code>inline-flex</code> 的元素）都有一个主轴和一个交叉轴。</p>
<p>主轴是水平的还是垂直的，具体取决于 <code>flex-direction</code> 的值。如果你不熟悉 <code>flex-direction</code> , 不用担心。你即将学会它。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/44.-main---cross-axis.png" alt="The main axis and the cross axis when the " width="600" height="400" loading="lazy"></p>
<p><em><code>flex-direction</code> 为 <code>row</code> 时的交叉轴和主轴</em></p>
<p>在这个示例中，主轴是水平的，交叉轴是垂直的。</p>
<p>以下是主轴垂直且交叉轴水平的示例。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/45.-cross---main-axis.png" alt="45.-cross---main-axis" width="600" height="400" loading="lazy"></p>
<p><em><code>flex-direction</code> 为 <code>column</code> 时的主轴和交叉轴</em></p>
<h2 id="flex-containers-and-flex-items">Flex 容器和 Flex 项</h2>
<p>要使用 Flexbox 的所有属性，你需要将元素的 <code>display</code> 属性设置为 <code>flex</code> 或 <code>inline-flex</code>。</p>
<p>这会将元素变成 flex 容器，并且该元素的子元素变成 flex 项。</p>
<p>举个例子:</p>
<pre><code class="language-HTML">&lt;section class="container"&gt;  
	&lt;div&gt;Flex Item 1&lt;/div&gt;  
    &lt;div&gt;Flex Item 2&lt;/div&gt;  
    &lt;div&gt;    
    	&lt;p&gt;This paragraph is not a flex item&lt;/p&gt;  
    &lt;/div&gt;
&lt;/section&gt;
</code></pre>
<pre><code class="language-CSS">.container {  
  display: flex;
}
</code></pre>
<p><code>.container</code> 元素现在是一个 Flex 容器。这三个 <code>div</code> 元素是 <code>.container</code> 元素的直接子元素，这使得它们成为 Flex 项。</p>
<p>但第三个 div 内的段落元素不是 Flex 项。这是因为它不是 <code>.container</code> 元素的直接子元素。</p>
<h2 id="understanding-flex-and-inline-flex">了解 <code>Flex</code> 和 <code>Inline-flex</code></h2>
<p>你可以使用 <code>flex</code> 和 <code>inline-flex</code> 使元素成为 Flex 容器。不同之处在于它们与周围元素的交互方式。</p>
<h3 id="display-flex"><code>display: flex</code></h3>
<p>这使得 Flex 容器的行为类似块级元素。Flex 容器占据其父元素的整个可用宽度。它会在新的一行开始，并且其后的元素也会在新的一行开始。</p>
<p>例如:</p>
<pre><code class="language-HTML">&lt;button&gt;Button One&lt;/button&gt;

/* Flex Container */
&lt;section class="container"&gt;  
	&lt;div id="red"&gt;&lt;/div&gt;  
	&lt;div id="gold"&gt;&lt;/div&gt;  
	&lt;div id="green"&gt;&lt;/div&gt;
&lt;/section&gt;

&lt;button&gt;Button Two&lt;/button&gt;
</code></pre>
<pre><code class="language-CSS">.container {
	display: flex;
}
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/46.-display-flex.png" alt="46.-display-flex" width="600" height="400" loading="lazy"></p>
<p><em>当你使用 <code>display: flex</code> 时，Flex 容器的行为类似于块元素`</em></p>
<p><code>.container</code> 元素占据了主体（其父元素）的整个可用宽度。</p>
<h3 id="display-inline-flex"><code>display: inline-flex</code></h3>
<p>这使得 Flex 容器的行为就像一个内联元素。这允许其他内联元素（如按钮）与其并排。使用前面的示例，这就是当你将 <code>display</code> 从 <code>flex</code> 更改为 <code>inline-flex</code> 时元素的排列方式。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/47.-display-inline-flex.png" alt="47.-display-inline-flex" width="600" height="400" loading="lazy"></p>
<p><em>当你使用 <code>display: inline-flex</code> 时，Flex 容器的行为类似于 <code>inline-elements</code>。</em></p>
<p>Flex 容器不占据其父容器的整个宽度。它仅使用其内容所需的水平空间。</p>
<p><strong>在 StackBlitz 上</strong> <a href="https://stackblitz.com/edit/js-ug2zkz?file=style.css"><strong>练习使用 flex 和 inline-flex</strong></a></p>
<h2 id="the-flex-container-properties">Flex 容器属性</h2>
<p>Flex 容器属性允许你控制 Flex 容器内 Flex 项的布局和对齐方式。</p>
<p><strong>注意:</strong> 你可以将这些属性应用于 Flex 容器，而不是 Flex 项。</p>
<p>以下是 Flex 容器属性:</p>
<ul>
<li><code>flex-direction</code></li>
<li><code>flex-wrap</code></li>
<li><code>flex-flow</code></li>
<li><code>justify-content</code></li>
<li><code>align-items</code></li>
<li><code>align-content</code></li>
<li><code>place-content</code></li>
</ul>
<h3 id="the-flex-direction-property"><code>flex-direction</code> 属性</h3>
<p><code>flex-direction</code> 属性定义了 Flex 项的显示方向。它设置了 Flex 容器的主轴。该属性可以采用以下四个值中的任意一个：</p>
<ul>
<li><code>row</code> (默认值)</li>
<li><code>column</code></li>
<li><code>row-reverse</code></li>
<li><code>column-reverse</code></li>
</ul>
<p>现在，让我们看一些示例，看看它是如何工作的。</p>
<p>在下面的代码片段中，我们有一个名为 <code>names-container</code> 的容器，其中包含四个名字：</p>
<pre><code class="language-HTML">&lt;div class="names-container"&gt;  
	&lt;p id="jill"&gt;1. JILL&lt;/p&gt;  
	&lt;p id="john"&gt;2. JOHN&lt;/p&gt;  
	&lt;p id="jane"&gt;3. JANE&lt;/p&gt;  
	&lt;p id="jack"&gt;4. JACK&lt;/p&gt;
&lt;/div&gt;
</code></pre>
<p>让我们看看使用 <code>flex-direction</code> 属性来排列这些名字的不同方式。</p>
<h4 id="flexdirectionrow"><code>flex-direction: row</code></h4>
<p>这会从左到右水平显示 Flex 项。</p>
<pre><code class="language-CSS">.names-container {  
	display: flex;  
    flex-direction: row;  
    /* Other styles here... */
}
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/1.-flex-direction-row.png" alt="1.-flex-direction-row" width="600" height="400" loading="lazy"></p>
<p><em>示例：<code>flex-direction: row</code></em></p>
<h4 id="flexdirectioncolumn"><code>flex-direction: column</code></h4>
<p>这会从上到下垂直显示 Flex 项。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/2.-flex-direction-column.png" alt="2.-flex-direction-column" width="600" height="400" loading="lazy"></p>
<p><em>示例：<code>flex-direction: column</code></em></p>
<h4 id="flexdirectionrowreverse"><code>flex-direction: row-reverse</code></h4>
<p>这与 row 值相反。它从右到左显示 Flex 项。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/3.-flex-direction-row-reverse.png" alt="3.-flex-direction-row-reverse" width="600" height="400" loading="lazy"></p>
<p><em>示例：<code>flex-direction: row-reverse</code></em></p>
<h4 id="flexdirectioncolumnreverse"><code>flex-direction: column-reverse</code></h4>
<p>这与 column 值相反。它从下到上显示 Flex 项。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/4.-flex-direction-column-reverse.png" alt="4.-flex-direction-column-reverse" width="600" height="400" loading="lazy"></p>
<p><em>示例：<code>flex-direction: column-reverse</code></em></p>
<p><strong>在 StackBlitz 上</strong> <a href="https://stackblitz.com/edit/js-aaerav?file=style.css"><strong>练习使用 flex-direction</strong></a></p>
<h4 id="">关于反向值和无障碍的注意事项</h4>
<p>当你使用 <code>row-reverse</code> 和 <code>column-reverse</code> 时，有些事情你需要记住。正如你已经看到的，这两个值会影响屏幕上元素的视觉顺序。</p>
<p>但是这些元素在 HTML 中的顺序保持不变，而这些元素在 HTML 中的顺序就是屏幕阅读器和键盘导航控件使用的顺序。</p>
<p>在示例中，当你使用 <code>row-reverse</code> 时，你首先在屏幕上看到 Jack 的名字，然后是 Jane、John 和 Jill。</p>
<p>但是对于使用屏幕阅读器的人来说，他们将会按照 HTML 中的出现顺序而不是屏幕上的顺序来听到这些名字。在这种情况下，他们将首先听到 Jill 的名字，然后是 John、Jane 和 Jack。</p>
<h3 id="the-flex-wrap-property"><code>flex-wrap</code> 属性</h3>
<p>有时，Flex 容器内的空间不足以容纳 Flex 项。</p>
<p>在这种情况下，你可以使用 <code>flex-wrap</code> 属性来选择是让 Flex 项溢出还是另起一行。</p>
<p><code>flex-wrap</code> 属性接受以下任何值：</p>
<ul>
<li><code>nowrap</code> (默认值)</li>
<li><code>wrap</code></li>
<li><code>wrap-reverse</code></li>
</ul>
<p>要看到 <code>flex-wrap</code> 的效果，让我们向 <code>names-container</code> 添加超过四个的名字：</p>
<pre><code class="language-HTML">&lt;div class="names-container"&gt;  
	&lt;p id="jill"&gt;1. JILL&lt;/p&gt;  
	&lt;p id="john"&gt;2. JOHN&lt;/p&gt;  
	&lt;p id="jane"&gt;3. JANE&lt;/p&gt;  
	&lt;p id="jack"&gt;4. JACK&lt;/p&gt;  
	&lt;p id="sara"&gt;5. SARA&lt;/p&gt;  
	&lt;p id="seth"&gt;6. SETH&lt;/p&gt;  
	&lt;p id="seal"&gt;7. SEAL&lt;/p&gt;
&lt;/div&gt;
</code></pre>
<h4 id="flexwrapnowrap"><code>flex-wrap: nowrap</code></h4>
<p>这会使所有的 Flex 项都保持在单行中，无论是在行还是列中。如果在 Flex 容器中没有足够的空间，它允许 Flex 项溢出。请看下面的示例：</p>
<pre><code class="language-CSS">.names-container {  
	display: flex;  
	flex-direction: row;  
	flex-wrap: nowrap;  
	/* Other styles here... */
}
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/5.-flex-wrap-nowrap.png" alt="5.-flex-wrap-nowrap" width="600" height="400" loading="lazy"></p>
<p><em>因为 <code>flex-wrap</code> 被设置为 <code>nowrap</code>，所以 Flex 项溢出</em></p>
<p>在这个例子中，由于空间不足，三个名字溢出容器。</p>
<h4 id="flexwrapwrap"><code>flex-wrap: wrap</code></h4>
<p>当空间不足时，这会将 Flex 项换行或推到下一行。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/6.-flex-wrap-wrap.png" alt="6.-flex-wrap-wrap" width="600" height="400" loading="lazy"></p>
<p><em>当 <code>flex-wrap</code> 设置为 <code>wrap</code> 时，Flex 项会换行或移动到下一行</em></p>
<h4 id="flexwrapwrapreverse"><code>flex-wrap: wrap-reverse</code></h4>
<p>这与 <code>wrap</code> 相反。它将溢出的项目移动到下一行，但方向相反。</p>
<p>例如，在名字容器上使用 <code>wrap-reverse</code> 将溢出项移动到下一个顶行，而不是下面的下一行。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/7.-flex-wrap-wrap-reverse.png" alt="7.-flex-wrap-wrap-reverse" width="600" height="400" loading="lazy"></p>
<p><em>示例： <code>flex-wrap: wrap-reverse</code></em></p>
<p><strong>在 StackBlitz 上</strong> <a href="https://stackblitz.com/edit/js-cbmfgr?file=style.css"><strong>练习使用 flex-wrap</strong></a></p>
<h3 id="the-flex-flow-shorthand-property"><code>flex-flow</code> 缩写属性</h3>
<p><code>flex-flow</code> 属性是 <code>flex-direction</code> 和 <code>flex-wrap</code> 属性的缩写。这意味着当你使用 <code>flex-flow</code> 时，只需要一行代码即可同时应用这两个属性。</p>
<p>请参阅下面使用名字容器的示例。你可以为容器指定 <code>flex-direction</code> 和 <code>flex-wrap</code> 属性。</p>
<pre><code class="language-CSS">.names-container {  
	display: flex;  
	flex-direction: column;  
    flex-wrap: wrap;
}
</code></pre>
<p>或者你可以使用 <code>flex-flow</code> 缩写来获得相同的结果。</p>
<pre><code class="language-CSS">.names-container {  
	display: flex;  
	flex-flow: column wrap;
}
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/8.-flex-flow.png" alt="8.-flex-flow" width="600" height="400" loading="lazy"></p>
<p><em>示例： <code>flex-flow: column wrap</code></em></p>
<p><strong>在 StackBlitz 上</strong> <a href="https://stackblitz.com/edit/js-xuv4bx?file=style.css"><strong>练习使用 flex-flow</strong></a></p>
<h3 id="the-justify-content-property"><code>justify-content</code> 属性</h3>
<p><code>justify-content</code> 属性处理 Flex 容器主轴上 Flex 项的对齐方式。</p>
<p>你可以使用它来处理主轴上空间的分配方式。该属性可以取以下任何值：</p>
<ul>
<li><code>flex-start</code> (默认值)</li>
<li><code>flex-end</code></li>
<li><code>center</code></li>
<li><code>space-between</code></li>
<li><code>space-around</code></li>
<li><code>space-evenly</code></li>
</ul>
<h4 id="justifycontentflexstart"><code>justify-content: flex-start</code></h4>
<p>这将把 Flex 项放置在 <code>flex-direction</code> 的起始位置。这将把 Flex 项放置在 <code>flex-direction</code> 的起始位置。如果主轴是水平的，并且 <code>flex-direction</code> 的属性值是 <code>row</code>（就像下面的示例），它会将 Flex 项对齐到左侧。如果主轴是垂直的（<code>flex-direction</code> 的属性值是 <code>column</code>），它会将 Flex 项对齐到顶部。</p>
<p>在<code>names-container</code>的例子中，<code>justify-content: flex-start</code> 的效果如下：</p>
<pre><code class="language-CSS">.names-container {  
	display: flex;  
	justify-content: flex-start;  
	/* Other styles here... */
}
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/9.-justify-content-flex-start.png" alt="9.-justify-content-flex-start" width="600" height="400" loading="lazy"></p>
<p><em>示例：<code>justify-content: flex-start</code></em></p>
<h4 id="justifycontentflexend"><code>justify-content: flex-end</code></h4>
<p>这会将 Flex 项放置在主轴的 flex-direction 的末尾。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/10.-justify-content-flex-end.png" alt="10.-justify-content-flex-end" width="600" height="400" loading="lazy"></p>
<p><em>示例：<code>justify-content: flex-end</code></em></p>
<h4 id="justifycontentcenter"><code>justify-content: center</code></h4>
<p>这会将 Flex 项目放置在 Flex 容器主轴的中心。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/11.-justify-content-center-.png" alt="11.-justify-content-center-" width="600" height="400" loading="lazy"></p>
<p><em>示例：<code>justify-content: center</code></em></p>
<h4 id="justifycontentspacebetween"><code>justify-content: space-between</code></h4>
<p>这会将第一个 Flex 项放置在主轴的起始位置，并将最后一个项放置在主轴的末尾。然后，主轴上的空间在这些元素之间均匀分布。（校对者注：<code>space-between</code>并不改变元素本身大小，它的作用只是将元素之间的间距均匀划分了）</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/12.-justify-content-space-between.png" alt="12.-justify-content-space-between" width="600" height="400" loading="lazy"></p>
<p><em>示例：<code>justify-content: space-between</code></em></p>
<h4 id="justifycontentspaceevenly"><code>justify-content: space-evenly</code></h4>
<p>这会在 Flex 项之间均匀分配空间。这意味着每项前后的空间都相同。（校对者注：<code>space-between</code>模式中，首项和末项在没有其他CSS设置的前提下，与Flex容器的左外边距/右外边距为0，即在Flex容器中与最左端和最右端“顶格”。而<code>space-evenly</code>则是保证每一个Flex项左侧和右侧的边距均是相等的，即Flex项之间的间距和Flex项与Flex容器边界的间距都相等，该模式下Flex项与Flex容器的左右边界也存在间距。）</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/13.-justify-content-space-evenly.png" alt="13.-justify-content-space-evenly" width="600" height="400" loading="lazy"></p>
<p><em>示例：<code>justify-content: space-evenly</code></em></p>
<h4 id="justifycontentspacearound"><code>justify-content: space-around</code></h4>
<p>这也会在 Flex 项之间均匀分配空间。这里的关键区别在于，第一个项之前和最后一个项之后的空间是 Flex 项之间空间的一半。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/14.-justify-content-space-around.png" alt="14.-justify-content-space-around" width="600" height="400" loading="lazy"></p>
<p><em>示例：<code>justify-content: space-around</code></em></p>
<p><strong>在 StackBlitz 上</strong> <a href="https://stackblitz.com/edit/js-zpcbxv?file=style.css"><strong>练习使用 justify-content</strong></a></p>
<h3 id="the-align-items-property"><code>align-items</code> 属性</h3>
<p><code>align-items</code> 属性处理 Flex 项在 Flex 容器交叉轴上的对齐方式。它可以采用以下任意值：</p>
<ul>
<li><code>stretch</code> (默认值)</li>
<li><code>flex-start</code></li>
<li><code>flex-end</code></li>
<li><code>center</code></li>
<li><code>baseline</code></li>
</ul>
<h4 id="alignitemsstretch"><code>align-items: stretch</code></h4>
<p>这会拉伸 Flex 项以填充 Flex 容器内的空间。</p>
<p>看下面的示例，使用一个新的名字容器（<code>names-container</code>），其中包含不同大小的名字卡片：</p>
<pre><code class="language-CSS">.names-container {  
	display: flex;  
    align-items: stretch;  
    /* Other styles here... */
}
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/15.-align-items-stretch.png" alt="15.-align-items-stretch" width="600" height="400" loading="lazy"></p>
<p><em>示例：<code>align-items: stretch</code></em></p>
<h4 id="alignitemsflexstart"><code>align-items: flex-start</code></h4>
<p>这会将 Flex 项放置在 Flex 容器的交叉轴的起始位置。如果交叉轴是垂直的，如下例所示， <code>align-items: flex-start</code> 会将项放置在顶部。</p>
<pre><code class="language-CSS">.names-container {  
	display: flex;  
	align-items: flex-start;  
	/* Other styles here... */
}
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/16.-align-items-flex-start.png" alt="16.-align-items-flex-start" width="600" height="400" loading="lazy"></p>
<p><em>示例：<code>align-items: flex-start</code></em></p>
<h4 id="alignitemsflexend"><code>align-items: flex-end</code></h4>
<p>这会将 Flex 项放置在 Flex 容器的交叉轴的末尾位置。如果交叉轴是垂直的，如下例所示， <code>align-items: flex-end</code> 会将项放置在底部。</p>
<pre><code class="language-CSS">.names-container {  
	display: flex;  
    align-items: flex-end;  
    /* Other styles here... */
}
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/17.-align-items-flex-end.png" alt="17.-align-items-flex-end" width="600" height="400" loading="lazy"></p>
<p>示例：<code>align-items: flex-end</code></p>
<h4 id="alignitemscenter"><code>align-items: center</code></h4>
<p>这会将 Flex 项在 Flex 容器的交叉轴的中心对齐。</p>
<pre><code class="language-CSS">.names-container {  
	display: flex;  
	align-items: center;  
	/* Other styles here... */
}
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/18.-align-items-center.png" alt="18.-align-items-center" width="600" height="400" loading="lazy"></p>
<p><em>示例：<code>align-items: center</code></em></p>
<h4 id="alignitemsbaseline"><code>align-items: baseline</code></h4>
<p>当你使用 <code>baseline</code> 值时，Flex 项目的排列方式是使它们的基线对齐。请参阅下面的示例：</p>
<pre><code class="language-CSS">.names-container {  
	display: flex;  
	align-items: baseline;  
	/* Other styles here... */
}
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/Untitled-design-1.png" alt="Untitled-design-1" width="600" height="400" loading="lazy"></p>
<p><em>基线用白色虚线表示</em></p>
<p><strong>在 StackBlitz 上</strong> <a href="https://stackblitz.com/edit/js-jydywf?file=style.css"><strong>练习使用 align-items</strong></a></p>
<h3 id="the-align-content-property"><code>align-content</code> 属性</h3>
<p>当你有一个带有换行（或多个 Flex 行）的 Flex 容器时，你可能需要对这些行进行对齐以根据需要分配空间。这时你可以使用 <code>align-content</code> 。该属性可以取以下任何值：</p>
<ul>
<li><code>stretch</code> (默认值)</li>
<li><code>flex-start</code></li>
<li><code>flex-end</code></li>
<li><code>center</code></li>
<li><code>space-between</code></li>
<li><code>space-evenly</code></li>
<li><code>space-around</code></li>
</ul>
<p>在下面的示例中，<code>names-container</code>中有 11 个名字，并且<code>names-container</code>的 <code>flex-wrap</code> 值为 <code>wrap</code>。这意味着你可以应用 <code>align-content</code> 属性来改变 Flex 行的对齐方式。</p>
<h4 id="aligncontentstretch"><code>align-content: stretch</code></h4>
<p>这会拉伸 Flex 行以填充 Flex 容器交叉轴内的空间。</p>
<pre><code class="language-CSS">.names-container {  
	display: flex;  
	flex-wrap: wrap;  
	align-items: stretch;  
	/* Other styles here... */
}
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/20.-align-content-stretch.png" alt="20.-align-content-stretch" width="600" height="400" loading="lazy"></p>
<p><em>示例：<code>align-content: stretch</code></em></p>
<h4 id="aligncontentflexstart"><code>align-content: flex-start</code></h4>
<p>这将把 Flex 行放置在容器的交叉轴起始位置。例如，如果交叉轴像 <code>names-container</code> 一样是垂直的，它就会将 Flex 行放置在顶部。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/21.-align-content-flex-start.png" alt="21.-align-content-flex-start" width="600" height="400" loading="lazy"></p>
<p><em>示例：<code>align-content: flex-start</code></em></p>
<h4 id="aligncontentflexend"><code>align-content: flex-end</code></h4>
<p>这会将 Flex 行放置在容器的交叉轴末尾位置。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/22.-align-content-flex-end.png" alt="22.-align-content-flex-end" width="600" height="400" loading="lazy"></p>
<p><em>示例：<code>align-content: flex-end</code></em></p>
<h4 id="aligncontentcenter"><code>align-content: center</code></h4>
<p>这会将 Flex 行放置在容器的交叉轴中心位置。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/23.-align-content-center.png" alt="23.-align-content-center" width="600" height="400" loading="lazy"></p>
<p><em>示例：<code>align-content: center</code></em></p>
<h4 id="aligncontentspacebetween"><code>align-content: space-between</code></h4>
<p>这会将第一行放置在交叉轴的起始位置。它还会将最后一行放置在交叉轴的末尾位置。然后，交叉轴上的空间会均匀分配给这些行。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/24.-align-content-space-between.png" alt="24.-align-content-space-between" width="600" height="400" loading="lazy"></p>
<p><em>示例：<code>align-content: space-between</code></em></p>
<h4 id="aligncontentspaceevenly"><code>align-content: space-evenly</code></h4>
<p>这会在 Flex 行之间均匀分配空间。这意味着每行前后的空间都是相同的。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/25.-align-content-space-evenly.png" alt="25.-align-content-space-evenly" width="600" height="400" loading="lazy"></p>
<p><em>示例：<code>align-content: space-evenly</code></em></p>
<h4 id="aligncontentspacearound"><code>align-content: space-around</code></h4>
<p>这也会在 Flex 行之间均匀分配空间。这里的主要区别在于，第一行之前和最后一行之后的空间是 Flex 行之间空间的一半。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/26.-align-content-space-around.png" alt="26.-align-content-space-around" width="600" height="400" loading="lazy"></p>
<p><em>示例：<code>align-content: space-around</code></em></p>
<p><strong>在 StackBlitz 上</strong> <a href="https://stackblitz.com/edit/js-fukvgd?file=style.css"><strong>练习使用 align-content</strong></a></p>
<h3 id="the-place-content-property"><code>place-content</code> 属性</h3>
<p>如果你需要同时使用 <code>justify-content</code> 和 <code>align-content</code> 属性，你可以使用 <code>place-content</code> 缩写属性。</p>
<p>它可以接受一个或两个值。当你给它一个单一值时，浏览器会为 <code>justify-content</code> 和 <code>align-content</code> 应用相同的值。</p>
<p>当你为 <code>place-content</code> 提供两个值时，第一个值将用于 <code>align-content</code> ，第二个值将用于 <code>justify-content</code>。</p>
<p>让我们看一个示例:</p>
<p>无需这样写:</p>
<pre><code class="language-CSS">.names-container {  
	display: flex;  
	flex-wrap: wrap;  
	align-content: flex-end;  
	justify-content: flex-start;  
	/* Other content */
}
</code></pre>
<p>你可以改为写下面的代码，效果相同：</p>
<pre><code class="language-CSS">.names-container {  
	display: flex;  
	flex-wrap: wrap;  
	place-content: flex-end flex-start;  
	/* Other content */
}
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/43.-place-content.png" alt="43.-place-content" width="600" height="400" loading="lazy"></p>
<p><em>示例：使用 <code>place-content</code> 缩写</em></p>
<p><strong>在 StackBlitz 上</strong> <a href="https://stackblitz.com/edit/js-ytdywl?file=style.css"><strong>练习使用 place-content</strong></a></p>
<h2 id="the-flex-items-properties">Flex 项属性</h2>
<p>Flex 容器的每个直接子元素都是 Flex 项。到目前为止，你已经学习了 Flex 容器的属性。</p>
<p>Flexbox 还有一些属性，你可以应用到单个 Flex 项上。它们包括以下内容：</p>
<ul>
<li><code>order</code></li>
<li><code>align-self</code></li>
<li><code>flex-grow</code></li>
<li><code>flex-shrink</code></li>
<li><code>flex-basis</code></li>
<li><code>flex</code></li>
</ul>
<h3 id="the-order-property"><code>order</code> 属性</h3>
<p><code>order</code> 属性确定 Flex 项的出现顺序。</p>
<p>你给这个属性的赋值必须是一个数字。一个数字较小的 Flex 项将出现在数字较大的 Flex 项之前。</p>
<p>在 HTML 代码中，四个名字的顺序如下:</p>
<ol>
<li>Jill</li>
<li>John</li>
<li>Jane</li>
<li>Jack</li>
</ol>
<pre><code class="language-CSS">&lt;div class="names-container"&gt;
	&lt;p id="jill"&gt;1. JILL&lt;/p&gt;
	&lt;p id="john"&gt;2. JOHN&lt;/p&gt;
	&lt;p id="jane"&gt;3. JANE&lt;/p&gt;
	&lt;p id="jack"&gt;4. JACK&lt;/p&gt;
&lt;/div&gt;
</code></pre>
<p>你可以使用 <code>order</code> 属性改变屏幕上的出现顺序。请参阅下面的示例。</p>
<p>以下是没有 <code>order</code> 属性时它们的显示方式:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/27.-no-order-property.png" alt="27.-no-order-property" width="600" height="400" loading="lazy"></p>
<p><em>添加 <code>order</code> 属性之前的名字卡片</em></p>
<p>现在，当你添加以下 <code>order</code> 属性时，它们的显示方式如下所示：</p>
<pre><code class="language-CSS">.names-container {  
	display: flex;
}

#jill {  
	order: 2;  
    background-color: #fe4f46;
}

#john {  
	order: 4;  
    background-color: #fcd65c;
}

#jane {  
	order: 1;  
    background-color: 
    #00bab4;
}

#jack {  
	order: 3;  
    background-color: #003f54;
}
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/28.-with-order-property.png" alt="28.-with-order-property" width="600" height="400" loading="lazy"></p>
<p><em><code>order</code> 属性改变了出现顺序</em></p>
<p><strong>在 StackBlitz 上</strong> <a href="https://stackblitz.com/edit/js-c5mf8q?file=style.css"><strong>练习使用 order 属性</strong></a></p>
<p><strong>警告:</strong> 尽管屏幕上的出现顺序改变了，但 HTML 中的顺序保持不变。而屏幕阅读器使用的是 HTML 中的顺序。如果可能，最佳实践是在 HTML 中改变顺序，而不是使用 Flexbox 进行更改。</p>
<h3 id="the-align-self-property"><code>align-self</code> 属性</h3>
<p>你可以使用 <code>align-self</code> 属性为一个 Flex 项单独设置不同的对齐方式。</p>
<p>它的工作方式与 <code>align-items</code> 属性相同。不同之处在于， <code>align-items</code> 适用于所有 Flex 项，而 <code>align-self</code> 属性仅适用于特定项。</p>
<p>例如:</p>
<pre><code class="language-CSS">.names-container {  
	display: flex;  
    align-items: center;  
    /* Other styles */    
}

#jill {
	align-self: flex-start;
}
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/37.-align-self.png" alt="37.-align-self" width="600" height="400" loading="lazy"></p>
<p><em>示例：<code>align-self</code> 带有 <code>flex-start</code> 值</em></p>
<p>在这个示例中，<code>names-container</code> 的 <code>align-items</code> 属性设置为 <code>center</code>，这会使所有名字都居中对齐。</p>
<p>但是使用 <code>align-self</code> 属性，你可以用 <code>flex-start</code> 将 Jill 的名字卡片对齐到顶部。</p>
<p><strong>在 StackBlitz 上</strong> <a href="https://stackblitz.com/edit/js-e9ctpu?file=style.css"><strong>练习使用 align-self 属性</strong></a></p>
<h3 id="the-flex-grow-property"><code>flex-grow</code> 属性</h3>
<p>当你将容器的 <code>display</code> 设置为 <code>flex</code> 时，通常会在排列项之后有一些额外的空间。请参阅下面的示例：</p>
<pre><code class="language-CSS">.names-container {  
	display: flex;  
    justify-content: 
    flex-start;  
 	/* Other styles */
 }
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/29.-flex-grow-extra-space.png" alt="29.-flex-grow-extra-space" width="600" height="400" loading="lazy"></p>
<p><em>Flex 容器有足够的空间容纳 Flex 项</em></p>
<p>浏览器会将多余的空间视为 <code>1</code> 的值。这意味着当你为其中一个 Flex 项的 <code>flex-grow</code> 设置为 <code>0.5</code> 时，浏览器会将剩余空间的一半添加到该项的大小中。</p>
<pre><code class="language-CSS">#jill {
	flex-grow: 0.5;
}
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/30.-flex-grow-0.5.png" alt="30.-flex-grow-0.5" width="600" height="400" loading="lazy"></p>
<p><em><code>flex-grow</code> 属性使 Jill 的大小大于其初始大小</em></p>
<p>如果你给 <strong>仅一个 Flex 项</strong> 设置了 <code>flex-grow</code> 值为 <code>1</code> ，浏览器将把所有额外的空间都分配给该项。</p>
<p><strong>注意：</strong> 如果容器中只有一个项具有 <code>flex-grow</code> 值，则任何值为 1 或更大的值都会使其占据所有额外空间。</p>
<p>例如，下面两个代码片段对 Jill 的卡片具有相同的效果：</p>
<pre><code class="language-CSS">#jill {  
	flex-grow: 1;
}
</code></pre>
<pre><code class="language-CSS">#jill {  
	flex-grow: 99;
}
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/31.-flex-grow-1-or-more.png" alt="31.-flex-grow-1-or-more" width="600" height="400" loading="lazy"></p>
<p><em>当容器中只有一个卡片的 <code>flex-grow</code> 为 <code>1</code> 或以上时</em></p>
<p>当你为多个元素添加 <code>flex-grow</code> 值会发生什么？</p>
<p>浏览器将按比例为它们共享额外的空间。</p>
<p>例如，当你给 Jane 设置 <code>flex-grow</code> 为 <code>3</code>，给 Jack 设置 <code>flex-grow</code> 为 <code>1</code> 时，浏览器将以 <code>3:1</code> 的比例分享额外的空间。</p>
<p>这意味着额外空间的总值变为 <code>4</code>（3+1）。<code>Jane</code> 将获得额外空间的 <code>3/4</code>，而 <code>Jack</code> 将获得 <code>1/4</code>。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/32.-flex-grow-jane-jack.png" alt="32.-flex-grow-jane-jack" width="600" height="400" loading="lazy"></p>
<p><em>额外的空间按比例在 <code>Jane</code> 和 <code>Jack</code> 之间共享</em></p>
<p><strong>在 StackBlitz 上</strong> <a href="https://stackblitz.com/edit/js-m6h8af?file=style.css"><strong>练习使用 flex-grow 属性</strong></a></p>
<h3 id="the-flex-shrink-property"><code>flex-shrink</code> 属性</h3>
<p><code>flex-shrink</code> 属性与 <code>flex-grow</code> 相反。</p>
<p>当你希望在存在额外空间时增加 Flex 项的大小时，你可以使用 <code>flex-grow</code>。但是，当 Flex 容器中的空间不足时，你可以使用 <code>flex-shrink</code> 来减小 Flex 项的大小。</p>
<p>请参阅下面的示例:</p>
<pre><code class="language-HTML">&lt;div class="numbers-container"&gt;
	&lt;p id="one"&gt;1&lt;/p&gt;
	&lt;p id="two"&gt;2&lt;/p&gt;
	&lt;p id="three"&gt;3&lt;/p&gt;
	&lt;p id="four"&gt;4&lt;/p&gt;
&lt;/div&gt;
</code></pre>
<pre><code class="language-CSS">.numbers-container {  
	display: flex;  
	justify-content: flex-start;  
	/* Other styles */
}

#one {  
	flex-shrink: 2;  
	background-color: #fe4f46;
}
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/33.-flex-shrink-value-2.png" alt="33.-flex-shrink-value-2" width="600" height="400" loading="lazy"></p>
<p><em>第一张卡片缩小，为其他卡片腾出空间</em></p>
<p>在这个示例中，四个数字每个的宽度都设置为 150px（总共 600px）。但 <code>numbers-container</code> 的宽度只有 400px，这是不够的。</p>
<p>卡片必须缩小以适应可用空间。但是 flex-shrink 的值为 <code>2</code> 的数字 <code>1</code> ，元素大小缩小到了其他数字的 1/2。</p>
<h4 id="flex">如果你不希望一个 Flex 项缩小怎么办？</h4>
<p>为了防止 Flex 项收缩，给它一个 <code>flex-shrink</code> 值为 <code>0</code>。</p>
<p>例如，当你为 Number <code>1</code> 指定 <code>flex-shrink</code> 为 <code>0</code> 时，它将保持 150px 的宽度。其他 Flex 项将缩小以适应剩余空间。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/34.-flex-shrink-vallue-0.png" alt="34.-flex-shrink-vallue-0" width="600" height="400" loading="lazy"></p>
<p>第一个卡片不会缩小，因为它的 <code>flex-shrink</code> 值为 <code>0</code>。</p>
<p><strong>在 StackBlitz 上</strong> <a href="https://stackblitz.com/edit/js-q9zndc?file=style.css"><strong>练习使用 flex-shrink 属性</strong></a></p>
<h3 id="the-flex-basis-property"><code>flex-basis</code> 属性</h3>
<p>你可以使用 <code>flex-basis</code> 属性来设置特定 Flex 项的默认长度。这取决于 <code>flex-direction</code> ，可以是宽度或高度。</p>
<p>如果 <code>flex-direction</code> 是 <code>row</code> 或 <code>row-reverse</code> ，则 <code>flex-basis</code> 的值就成为 Flex 项的初始宽度。</p>
<p>如果 <code>flex-direction</code> 是 <code>column</code> 或 <code>column-reverse</code> ，那么 <code>flex-basis</code> 的值就成为 Flex 项的初始高度。</p>
<p>例如:</p>
<pre><code class="language-CSS">.names-container {  
	display: flex;  
	flex-direction: column;  
	/* Other styles */
}

div {  
	height: 20px;
}

#jane {  
	flex-basis: 60px;
}
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/35.-flex-basis-height.png" alt="35.-flex-basis-height" width="600" height="400" loading="lazy"></p>
<p><em>示例：<code>flex-basis</code> 设置 item 的高度</em></p>
<p>在这个示例中，div 的高度设置为 20px。但 Jane 得到的 <code>flex-basis</code> 值为 60px。这会覆盖所有 div 的 20px。</p>
<p>注意：Jane 的 <code>flex-basis</code> 值为 60px，因为 <code>flex direction</code> 是 <code>column</code>。这意味着主轴是垂直的。</p>
<p>下面是另一个示例。这次，<code>flex-direction</code> 是 <code>row</code>。这意味着 <code>flex-basis</code> 将设置 Flex 项的宽度。</p>
<pre><code class="language-CSS">.names-container {  
	display: flex;  
	flex-direction: row;  
    /* Other styles */
}

div {  
	width: 70px;
}

#jane {  
	flex-basis: 140px;
}
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/36.-flex-basis-width.png" alt="36.-flex-basis-width" width="600" height="400" loading="lazy"></p>
<p><em>示例：<code>flex-basis</code> 设置 item 的宽度</em></p>
<p>虽然所有其他 div 的宽度均为 70px，但 Jane 的宽度由 <code>flex-basis</code> 设置为 140px。</p>
<p><strong>在 StackBlitz 上</strong> <a href="https://stackblitz.com/edit/js-maihzd?file=style.css"><strong>练习使用 flex-basis 属性</strong></a></p>
<h3 id="the-flex-shorthand-property"><code>flex</code> 缩写属性</h3>
<p>你可以使用 <code>flex</code> 作为 <code>flex-grow</code>、<code>flex-shrink</code> 和 <code>flex-basis</code> 属性的缩写。</p>
<p>例如，无需这样写：</p>
<pre><code class="language-CSS">.flex-item {  
	flex-grow: 2;  
	flex-shrink: 0;  
	flex-basis: 50px;
}
</code></pre>
<p>你可以像这样使用缩写，它会产生相同的效果：</p>
<pre><code class="language-CSS">.flex-item {  
	flex: 2 0 50px;
}
</code></pre>
<p><code>flex</code> 属性最多可以接受三个值。值的顺序很重要。浏览器将第一个值分配给 <code>flex-grow</code>，第二个值分配给 <code>flex-shrink</code>，第三个值分配给 <code>flex-basis</code>。</p>
<p><code>flex</code> 的默认值是 <code>1 0 auto</code>。</p>
<p>这意味着如果你给 <code>flex</code> 一个值为 2，浏览器将使用 2 作为 <code>flex-grow</code>。然后它将 <code>flex-shrink</code> 设置为 0，将<code>flex-basis</code> 设置为 auto。</p>
<p><strong>在 StackBlitz 上</strong> <a href="https://stackblitz.com/edit/js-m19hov?file=style.css"><strong>练习使用 <code>flex</code> 属性</strong></a></p>
<h2 id="how-to-center-an-element-with-flexbox">如何使用 Flexbox 将元素居中</h2>
<p>让许多前端开发人员头疼的问题之一是元素居中。 Flexbox 对此提供了一个完美的解决方案。</p>
<p>涉及两个步骤：</p>
<ol>
<li>通过将 <code>display</code> 设置为 <code>flex</code> 使父元素成为 Flex 容器。</li>
<li>将 <code>justify-content</code> 和 <code>align-items</code> 都设置为 <code>center</code>。</li>
</ol>
<p>就是这样！你的元素将完美居中！</p>
<p>例如:</p>
<pre><code class="language-HTML">&lt;div class="name-container"&gt;  
	&lt;p&gt;JOHN&lt;/p&gt;
&lt;/div&gt;
</code></pre>
<pre><code class="language-CSS">.name-container {  
	display: flex;  
	justify-content: center;  
	align-items: center;  
	/* Other Styles */
}
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/38.-center-element-w--flexbox.png" alt="38.-center-element-w--flexbox" width="600" height="400" loading="lazy"></p>
<p><em>示例：使用 Flexbox 居中一个元素</em></p>
<p>无论你是试着居中文本、图像，还是整个导航栏，这都能完美运行。</p>
<h2 id="flexbox-gaps">Flexbox 间隙</h2>
<p>你可以使用 <code>gap</code> 属性来调整 flex 项之间的间距。</p>
<p><strong>注意：</strong> 你将 gap 属性应用于 Flex 容器，而不是 Flex 项。</p>
<p><code>gap</code> 可以取两个值：第一个值用于行之间的间距，第二个值用于列之间的间距。</p>
<p>例如:</p>
<pre><code class="language-CSS">.names-container {  
	display: flex;  
	flex-wrap: wrap;  
	gap: 50px 10px; 
	/* row-gap column-gap */
}
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/39.-gap-two-values.png" alt="39.-gap-two-values" width="600" height="400" loading="lazy"></p>
<p><em>示例：为 gap 属性指定两个值</em></p>
<p>如果你想要的行和列之间的间距相同，你可以使用单个值。浏览器将为行和列都应用相同的值。</p>
<p>例如:</p>
<pre><code class="language-CSS">.names-container {  
	display: flex;  
	flex-wrap: wrap;  
	gap: 10px; 
	/* Other Styles */
}
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/40.-gap-single-value.png" alt="40.-gap-single-value" width="600" height="400" loading="lazy"></p>
<p><em>示例：行距和列距仅使用一个值</em></p>
<p>如果你需要仅在行之间应用特定的间隙值，你还可以使用属性 <code>row-gap</code> 。如果你需要仅在列之间添加间隙，则使用 <code>column-gap</code> 。</p>
<p>例如：仅在行之间添加间距：</p>
<pre><code class="language-CSS">.names-container {  
	display: flex;  
	flex-wrap: wrap;  
	row-gap: 20px; 
	/* Other Styles */
}
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/41.-row-gap.png" alt="41.-row-gap" width="600" height="400" loading="lazy"></p>
<p><em>示例：使用 <code>row-gap</code></em></p>
<p>例如: 仅在列之间添加间距：</p>
<pre><code class="language-CSS">.names-container {  
	display: flex;  
	flex-wrap: wrap;  
	column-gap: 20px; 
	/* Other Styles */
}
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/08/42.-column-gap.png" alt="42.-column-gap" width="600" height="400" loading="lazy"></p>
<p><em>示例：使用 <code>column-gap</code></em></p>
<p><strong>在 StackBlitz 上</strong> <a href="https://stackblitz.com/edit/js-v77toh?file=style.css"><strong>练习使用 gap 属性</strong></a></p>
<h2 id="practice-with-flexbox-games">通过 Flexbox 游戏练习</h2>
<p>想要以交互方式练习 Flexbox？看看以下游戏。它们以有趣且引人入胜的方式提供亲身体验 Flexbox 的实践练习。</p>
<ul>
<li><a href="https://flexboxfroggy.com/">Flexbox Froggy</a></li>
<li><a href="http://www.flexboxdefense.com/">Flexbox Defense</a></li>
<li><a href="https://mastery.games/flexboxzombies/">Flexbox Zombies</a></li>
</ul>
<h2 id="are-there-bugs-in-css-flexbox">CSS Flexbox 中有 Bug 吗</h2>
<p>虽然 CSS Flexbox 是一个强大的布局工具，但它有一些可能会让你感到意外的 bug 。</p>
<p>一个常见的例子是 <strong>某些 HTML 元素无法充当 flex 容器</strong>。这些元素包括 <code>&lt;button&gt;</code>、<code>&lt;fieldset&gt;</code> 和 <code>&lt;summary&gt;</code> 元素。</p>
<p>解决方法是使用像 <code>div</code> 这样的元素来包裹该元素的子元素。然后在包装器 <code>div</code> 上使用 Flexbox。</p>
<p>如果你对其他 Flexbox 的 bug 和解决方法感兴趣，可以查看 GitHub 上的 <a href="https://github.com/philipwalton/flexbugs">Flexbugs 仓库</a>。</p>
<h2 id="conclusion">总结</h2>
<p>在本指南中，你学习了所有 Flexbox 属性、它们的值以及如何使用它们创建响应式布局。你还了解了一些像 Flexbox Froggy 这样的游戏，可以用来练习。</p>
<p>感谢你阅读本文，祝你编码愉快！欢迎<a href="https://www.youtube.com/@DevAfterHours">订阅我的 YouTube 频道</a>以获取更深入的教程。</p>
<p><strong>译文校对者：<a href="https://www.freecodecamp.org/chinese/news/author/tsukistar/">Tsukistar</a></strong></p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ CSS 定位和 Flexbox 使用示例 ]]>
                </title>
                <description>
                    <![CDATA[ 如果你曾经使用过 CSS，那么你就会知道定位元素有多么困难。在本教程结束时，你将了解更多关于 CSS 定位和 Flexbox 的知识，并且你可以在项目中轻松定位元素。 首先，让我们了解一些关于 CSS 定位的基础知识。 CSS position 属性 你可以使用 CSS position 属性根据需要在 CSS 中定位元素、div 和容器。 position 属性的好处在于，你可以使用它来将应用程序的元素排列在你想要的任何位置，并且它易于学习和实现。 CSS 中有五种类型的定位：  * 静态定位  * 相对定位  * 绝对定位  * 固定定位  * 粘性定位 让我们一一了解它们。 CSS 静态定位 静态定位是 CSS 中使用的默认定位属性。它始终按照页面的正常流进行。无论哪个元素首先出现在你的文档中，它都将首先显示。 输出代码如下： /* Static Positioning */ .parent ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/css-positioning-and-flexbox-explained/</link>
                <guid isPermaLink="false">609748500998fd05ae8c8567</guid>
                
                    <category>
                        <![CDATA[ CSS ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Flexbox ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chengjun.L ]]>
                </dc:creator>
                <pubDate>Thu, 19 Aug 2021 09:20:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2021/08/Pink-Cute-Chic-Vintage-90s-Virtual-Trivia-Quiz-Presentations--38-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>如果你曾经使用过 CSS，那么你就会知道定位元素有多么困难。在本教程结束时，你将了解更多关于 CSS 定位和 Flexbox 的知识，并且你可以在项目中轻松定位元素。</p><p>首先，让我们了解一些关于 CSS 定位的基础知识。</p><h2 id="css-position-">CSS p<strong><strong>osition</strong> </strong>属性</h2><p>你可以使用 CSS position<strong> </strong>属性根据需要在 CSS 中定位元素、div 和容器。 position 属性的好处在于，你可以使用它来将应用程序的元素排列在你想要的任何位置，并且它易于学习和实现。</p><p>CSS 中有五种类型的定位：</p><ul><li>静态定位</li><li>相对定位</li><li>绝对定位</li><li>固定定位</li><li>粘性定位</li></ul><p>让我们一一了解它们。</p><h2 id="css-"><strong><strong>CSS</strong> 静态定位</strong></h2><p>静态定位是 CSS 中使用的默认定位属性。它始终按照页面的正常流进行。无论哪个元素首先出现在你的文档中，它都将首先显示。</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Pink-Cute-Chic-Vintage-90s-Virtual-Trivia-Quiz-Presentations--30-.png" class="kg-image" alt="Pink-Cute-Chic-Vintage-90s-Virtual-Trivia-Quiz-Presentations--30-" width="600" height="400" loading="lazy"><figcaption>输出</figcaption></figure><p>代码如下：</p><figure class="kg-card kg-code-card"><pre><code class="language-css">/* Static Positioning */
.parent {
    padding: 5px;
    position: static;
    background-color: #00AAFF;
    width: 40%;
  }

  .child-one {
  	position: static;
    background-color: rgb(116, 255, 116);
  }
  
  .child-two {
  	position: static;
    background-color: rgb(248, 117, 117);
  }
  
  .child-three {
  	position: static;
    background-color: rgb(255, 116, 232);
  }</code></pre><figcaption>CSS 静态定位</figcaption></figure><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
    &lt;title&gt;CSS Position and Flexbox&lt;/title&gt;
    &lt;link rel="stylesheet" href="./index.css"&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div class="parent"&gt;Parent
        &lt;div class="child-one"&gt;One&lt;/div&gt;
        &lt;div class="child-two"&gt;Two&lt;/div&gt;
        &lt;div class="child-three"&gt;Three&lt;/div&gt;
    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p>在上面的例子中，我们有父级元素（parent），然后是子级元素（child-one、child-two、child-three）。它们都是按照静态定位排列的，也就是按照页面的正常流动。</p><h2 id="css--1">CSS 相对定位</h2><p>相对定位与静态定位完全一样，但有一个问题。</p><p>我们可以在相对定位中做四件事，而静态无法做到：我们可以将元素移动到左、右、下和上方向。</p><p>让我们通过一个例子来理解我的意思。</p><figure class="kg-card kg-code-card"><pre><code class="language-css">/* Relative Positioning */
.parent {
    padding: 5px;
    background-color: #00AAFF;
    width: 40%;
  }

  .child-one {
    position: relative;
    background-color: rgb(116, 255, 116);
  }
  
  .child-two {
    background-color: rgb(248, 117, 117);
  }
  
  .child-three {
    background-color: rgb(255, 116, 232);
  }</code></pre><figcaption>相对定位</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Pink-Cute-Chic-Vintage-90s-Virtual-Trivia-Quiz-Presentations--31-.png" class="kg-image" alt="Pink-Cute-Chic-Vintage-90s-Virtual-Trivia-Quiz-Presentations--31-" width="600" height="400" loading="lazy"></figure><p>如果我们运行我们的应用程序，会看到输出没有区别。换句话说，静态和相对定位是相同的，除非我们使用相对的顶部、底部、左侧和右侧。</p><p>让我们尝试使用顶部、底部、左侧和右侧。</p><pre><code class="language-css">/* Relative Positioning with Top, Bottom, Left and Right */
.parent {
    padding: 5px;
    background-color: #00AAFF;
    width: 40%;
  }

  .child-one {
    position: relative;
    top: 10px;
    background-color: rgb(116, 255, 116);
  }
  
  .child-two {
    background-color: rgb(248, 117, 117);
  }
  
  .child-three {
    background-color: rgb(255, 116, 232);
  }</code></pre><p>我们在 <strong>child-one</strong> 中使用 <strong>Top</strong> 和 <strong>Relative</strong>。</p><p>这会将 <strong>child-one</strong> 抛出文档流，它将从顶部移动到底部 10px。</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Pink-Cute-Chic-Vintage-90s-Virtual-Trivia-Quiz-Presentations--32-.png" class="kg-image" alt="Pink-Cute-Chic-Vintage-90s-Virtual-Trivia-Quiz-Presentations--32-" width="600" height="400" loading="lazy"><figcaption>Top 相对定位</figcaption></figure><p>你可以看到它覆盖了 <strong>child-two</strong> 元素。如果使用 left、right 或 bottom 也是类似情况。</p><p><strong><strong>child-one</strong> </strong>覆盖 <strong><strong>child-two</strong></strong> 的主要原因是 <strong><strong>child-one</strong></strong> 不再是正常文档流的一部分，但 <strong><strong>child-two</strong> </strong>和 <strong><strong>child-three</strong> </strong>是。</p><h2 id="css--2">CSS 绝对定位</h2><p>定位元素的另一种方法是使用绝对定位。这种定位将元素从文档流中完全移除。所有其他元素将忽略具有<strong>绝对属性</strong>的元素。</p><p>而如果我们使用 Top、Bottom、Left、Right 和 Absolute，它会根据父容器排列元素，条件是父容器也必须是绝对定位的。</p><pre><code class="language-css">/* Absolute Positioning */
.parent {
    padding: 5px;
    background-color: #00AAFF;
    width: 40%;
    position: static;
  }

  .child-one {
    position: absolute;
    top: 0px;
    background-color: rgb(116, 255, 116);
  }
  
  .child-two {
    background-color: rgb(248, 117, 117);
  }
  
  .child-three {
    background-color: rgb(255, 116, 232);
  }</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Pink-Cute-Chic-Vintage-90s-Virtual-Trivia-Quiz-Presentations--33-.png" class="kg-image" alt="Pink-Cute-Chic-Vintage-90s-Virtual-Trivia-Quiz-Presentations--33-" width="600" height="400" loading="lazy"></figure><p>在这里，如果我们<strong>将 Top 设置为 0px</strong>，则 child-one 在文档的正常流之外。</p><p>那是因为 child-one 是绝对的，而 parent 是静态的。</p><p>但是如果我们将父级设置为绝对定位，在顶部 0px 位置呢？</p><pre><code class="language-css">/* Absolute Positioning */
.parent {
    padding: 5px;
    background-color: #00AAFF;
    width: 40%;
    position: absolute;
    top: 0px;
  }

  .child-one {
    position: absolute;
    top: 0px;
    background-color: rgb(116, 255, 116);
  }
  
  .child-two {
    background-color: rgb(248, 117, 117);
  }
  
  .child-three {
    background-color: rgb(255, 116, 232);
  }</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Pink-Cute-Chic-Vintage-90s-Virtual-Trivia-Quiz-Presentations--34-.png" class="kg-image" alt="Pink-Cute-Chic-Vintage-90s-Virtual-Trivia-Quiz-Presentations--34-" width="600" height="400" loading="lazy"></figure><p>在这里，你可以看到第一个子元素与父元素重叠，并且它们都位于顶部，为 0px。</p><p>还有第三个用例，我们可以将 Parent 设置为相对，将 child-one 设置为绝对。</p><pre><code class="language-css">/* Absolute Positioning */
.parent {
    padding: 5px;
    background-color: #00AAFF;
    width: 40%;
    position: relative;
    top: 0px;
  }

  .child-one {
    position: absolute;
    top: 0px;
    background-color: rgb(116, 255, 116);
  }
  
  .child-two {
    background-color: rgb(248, 117, 117);
  }
  
  .child-three {
    background-color: rgb(255, 116, 232);
  }</code></pre><p>当我们使用相对和绝对时，这是最有用的用例。现在，你可以看到我们的 child-one 是相对于父元素的，而不是整个文档。</p><p>简单来说，如果将父级固定为相对，子级固定为绝对，则子级将把父级作为其容器。</p><h2 id="css--3">CSS 固定定位</h2><p>还记得绝对和相对定位吗？有一个定位完全忽略了父元素，那就是固定定位。</p><p>固定定位是根据整个 HTML 文档固定的。它不会跟随任何其他父级，即使它被设置为相对。</p><p>另一件事是，如果我们将某些东西设置为固定的，即使我们滚动页面，它也会保持在相同的位置。</p><p>固定定位主要用于浮动项目和按钮。</p><pre><code class="language-css">/* Fixed Positioning */
.parent {
    padding: 5px;
    background-color: #00AAFF;
    width: 40%;
    position: relative;
    top: 0px;
    height: 1000px;
  }

  .child-one {
    position: fixed;
    top: 0px;
    background-color: rgb(116, 255, 116);
  }
  
  .child-two {
    background-color: rgb(248, 117, 117);
  }
  
  .child-three {
    background-color: rgb(255, 116, 232);
  }</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Pink-Cute-Chic-Vintage-90s-Virtual-Trivia-Quiz-Presentations--36-.png" class="kg-image" alt="Pink-Cute-Chic-Vintage-90s-Virtual-Trivia-Quiz-Presentations--36-" width="600" height="400" loading="lazy"></figure><p>可以看到第一个元素完全脱离了它的父组件，即使父组件被设置为相对。</p><p>如果我们滚动页面，其余的子元素将根据文档流动，但固定的子元素将保持不变。</p><h2 id="css--4">CSS 粘性定位</h2><p>粘性位置是相对和固定的组合。</p><pre><code class="language-css">/* Sticky Positioning */
.parent {
    padding: 5px;
    background-color: #00AAFF;
    width: 40%;
    position: relative;
    top: 0px;
    height: 1000px;
  }

  .child-one {
    position: sticky;
    top: 0px;
    background-color: rgb(116, 255, 116);
  }
  
  .child-two {
    background-color: rgb(248, 117, 117);
  }
  
  .child-three {
    background-color: rgb(255, 116, 232);
  }</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Pink-Cute-Chic-Vintage-90s-Virtual-Trivia-Quiz-Presentations--37-.png" class="kg-image" alt="Pink-Cute-Chic-Vintage-90s-Virtual-Trivia-Quiz-Presentations--37-" width="600" height="400" loading="lazy"></figure><p>如果我们将子元素设置为粘性定位，它会看起来很正常，就像相对的。但是一旦我们开始滚动页面，粘性子元素就会粘在顶部。它将成为一个固定的定位。</p><p>粘性定位主要用于创建导航栏。</p><p>现在我们已经理解了 CSS 定位，让我们专注于 Flexbox。</p><h2 id="-flexbox">如何使用 Flexbox</h2><p>你可以使用 CSS Flexbox 属性在不使用浮动的情况下排列项目。这使得在文档中排列项目变得更加容易。你可以使用它来替换 CSS 中的网格（Grid）。</p><p>如果没有 Flexbox，我们的输出将与文档一起流动，即 child-1，然后 child-2，然后 child-3。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-07-14-00-12.png" class="kg-image" alt="Screenshot-2021-03-07-14-00-12" width="600" height="400" loading="lazy"></figure><p>但是如果我们希望它们水平并排，如下图所示呢？</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-07-14-01-02.png" class="kg-image" alt="Screenshot-2021-03-07-14-01-02" width="600" height="400" loading="lazy"></figure><p>解决方案是使用 Flexbox。我们需要将它们相对于行或列均匀放置，它们之间或周围有空格。</p><p>首先，让我们创建一个包含三个子级的父 div。</p><pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
    &lt;title&gt;CSS Position and Flexbox&lt;/title&gt;
    &lt;link rel="stylesheet" href="./index.css"&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div class="parent"&gt;
        &lt;div class="child-one"&gt;&lt;/div&gt;
        &lt;div class="child-two"&gt;&lt;/div&gt;
        &lt;div class="child-three"&gt;&lt;/div&gt;
    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><pre><code class="language-css">/* Flexbox container */
.parent {
    background-color: #00AAFF;
    width: 300px;
    height: 300px;
    display: flex;
  }

  .child-one {
    background-color: rgb(116, 255, 116);
    width: 300px;
    height: 300px;
  }
  
  .child-two {
    background-color: rgb(248, 117, 117);
    width: 300px;
    height: 300px;
  }
  
  .child-three {
    background-color: rgb(255, 116, 232);
    width: 300px;
    height: 300px;
  }</code></pre><p>我们可以看到 parent 已经被声明为 <strong>flex</strong>。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-07-14-01-02-1.png" class="kg-image" alt="Screenshot-2021-03-07-14-01-02-1" width="600" height="400" loading="lazy"></figure><p>在这里，我们有三个 div 框，每个都有不同的颜色。这是默认的 Flexbox 排列。</p><p>让我们看看 Flexbox 中不同类型的排列。</p><h2 id="-flexbox-">如何使用 Flexbox 排列元素</h2><h3 id="flex-">Flex 方向</h3><p>此属性定义你的元素在屏幕上的显示方式，即垂直或水平方式。</p><p><strong>Row</strong> 用于水平排列项目。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-05-05-38-32.png" class="kg-image" alt="Screenshot-2021-03-05-05-38-32" width="600" height="400" loading="lazy"></figure><p>如你所见，我们在水平行中进行了排列。</p><p><strong>Column</strong> 垂直排列项目，如下所示：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-05-05-39-10.png" class="kg-image" alt="Screenshot-2021-03-05-05-39-10" width="600" height="400" loading="lazy"></figure><p>正方形现在排列在垂直列中。</p><p><strong>Row Reverse</strong> 的工作方式与 row 完全相同，但元素的位置将颠倒。第一个元素将是最后一个，最后一个元素将移动到第一个。项目的排列将与 <strong>flex-direction: row </strong>相反。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-05-05-39-51.png" class="kg-image" alt="Screenshot-2021-03-05-05-39-51" width="600" height="400" loading="lazy"></figure><p><strong>Column Reverse</strong> 的工作方式与 column 完全相同，但元素将被反转。第一个元素将是最后一个，最后一个元素将移动到第一个。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-05-05-42-38.png" class="kg-image" alt="Screenshot-2021-03-05-05-42-38" width="600" height="400" loading="lazy"></figure><h3 id="justify-content"><strong><strong>Justify Content</strong></strong></h3><p>此属性确定元素的水平对齐方式。</p><p><strong>Center</strong> 将元素设置为页面的水平中心。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-05-05-43-23.png" class="kg-image" alt="Screenshot-2021-03-05-05-43-23" width="600" height="400" loading="lazy"></figure><p><strong>Flex Start</strong> 将元素定位在页面的开头。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-05-05-44-15.png" class="kg-image" alt="Screenshot-2021-03-05-05-44-15" width="600" height="400" loading="lazy"></figure><p><strong><strong>Flex End</strong></strong> 将元素定位在页面的末尾。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-05-05-44-40.png" class="kg-image" alt="Screenshot-2021-03-05-05-44-40" width="600" height="400" loading="lazy"></figure><p><strong><strong>Space Around</strong></strong> 均匀地排列项目，但它们之间有空间。弹性盒容器内的所有元素之间的空间将相等，但不在它们之外。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-05-05-45-24.png" class="kg-image" alt="Screenshot-2021-03-05-05-45-24" width="600" height="400" loading="lazy"></figure><p>在这里，child-one、child-two 和 child-three 之间的空间是相等的，但在外面不相等。</p><p><strong>Space Between</strong> 最大化子元素之间的空间（它是一个 Justify Content 属性）。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-05-05-45-54.png" class="kg-image" alt="Screenshot-2021-03-05-05-45-54" width="600" height="400" loading="lazy"></figure><p><strong><strong>Space Evenly</strong></strong> 在子元素和 FlexBox 容器外的空间之间均匀分布相等的空间。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-05-05-46-41.png" class="kg-image" alt="Screenshot-2021-03-05-05-46-41" width="600" height="400" loading="lazy"></figure><h3 id="align-items"><strong><strong>Align Items</strong></strong></h3><p>Align items 用于在 flex 容器内垂直对齐项目。但这仅在有固定高度时才有效。</p><p><strong>Center</strong> 将元素设置为垂直页面的中心。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-05-05-47-26.png" class="kg-image" alt="Screenshot-2021-03-05-05-47-26" width="600" height="400" loading="lazy"></figure><p><strong><strong>Flex Start</strong></strong> 与将内容对齐到中心相同，但它垂直排列元素。在我们的例子中，元素将位于屏幕的左上角。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-05-05-48-12.png" class="kg-image" alt="Screenshot-2021-03-05-05-48-12" width="600" height="400" loading="lazy"></figure><p><strong><strong>Flex End</strong></strong> 与 Flex Start 相同，但这会将项目对齐到屏幕的左下角。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-05-05-48-42.png" class="kg-image" alt="Screenshot-2021-03-05-05-48-42" width="600" height="400" loading="lazy"></figure><p>现在你了解 Flexbox 的基础知识了。</p><h2 id="-">如何在屏幕中心对齐项目</h2><p>这些 Flexbox 属性也可以一起使用。例如，如果我们想将项目排列在最中心，我们可以同时使用 <strong>align-items: center</strong> 和 <strong>justify-content: center</strong>。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-07-16-31-13.png" class="kg-image" alt="Screenshot-2021-03-07-16-31-13" width="600" height="400" loading="lazy"></figure><p>如果你想自己做实验，可以<a href="https://github.com/nishant-666/CSS-Positioning-and-Flexbox">在 GitHub 查看代码</a>。</p><p>感谢你阅读本文！</p><p>原文：<a href="https://www.freecodecamp.org/news/css-positioning-and-flexbox-explained/">How CSS Positioning and Flexbox Work – Explained with Examples</a>，作者：<a href="https://www.freecodecamp.org/news/author/nishant-kumar/">Nishant Kumar</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Flexbox vs Grid——如何构建最常见的 HTML 布局 ]]>
                </title>
                <description>
                    <![CDATA[ 互联网上有很多很棒的 CSS 资源。但是，如果你只想要一个简单的布局，并且现在就需要，怎么办？ 在本文中，我将描述 5 种最常见的网页布局，以及如何使用 Flexbox 和 Grid 构建它们。 如何运行 在 CodePen 上，每个布局下方都有一个完整 HTML 和 CSS 代码的链接。 请注意，我使用 SASS 来编写样式定义，因此如果你想在本地执行相同操作，请使用以下命令安装 SASS： npm i sass -g 基本卡片模版 我使用上面的卡片作为网页布局的基础。它由垂直方向的三个元素组成，因此普通的 div 块就可以。但是，我稍后需要使中间的元素 - 文本段落 - 拉伸。 在这里 Flexbox 和 Grid 无缝地完成了这项工作。我更喜欢 Flexbox，因为它对我来说更直接。 获胜者：Flexbox CodePen Flexbox [https://codepen.io/ondrabus/pen/rNeOEQJ]，CodePen Grid [https://codepen.io/ondrabus/pen/mdPeZvd] 现在让我们开始创建不同的布局。 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/flexbox-vs-grid-how-to-build-the-most-common-html-layouts/</link>
                <guid isPermaLink="false">60d2ea7efff62a063e576659</guid>
                
                    <category>
                        <![CDATA[ Flexbox ]]>
                    </category>
                
                    <category>
                        <![CDATA[ CSS ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Grid 布局 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chengjun.L ]]>
                </dc:creator>
                <pubDate>Mon, 12 Jul 2021 09:00:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2021/07/halacious-weRQAu9TA-A-unsplash-1.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>互联网上有很多很棒的 CSS 资源。但是，如果你只想要一个简单的布局，并且现在就需要，怎么办？</p><p>在本文中，我将描述 5 种最常见的网页布局，以及如何使用 Flexbox 和 Grid 构建它们。</p><h2 id="-">如何运行</h2><p>在 CodePen 上，每个布局下方都有一个完整 HTML 和 CSS 代码的链接。</p><p>请注意，我使用 SASS 来编写样式定义，因此如果你想在本地执行相同操作，请使用以下命令安装 SASS：</p><pre><code class="language-js">npm i sass -g
</code></pre><h2 id="--1"><strong>基本卡片模版</strong></h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/card.png" class="kg-image" alt="card" width="600" height="400" loading="lazy"></figure><p>我使用上面的卡片作为网页布局的基础。它由垂直方向的三个元素组成，因此普通的 <code>div</code> 块就可以。但是，我稍后需要使中间的元素 - 文本段落 - 拉伸。</p><p>在这里 Flexbox 和 Grid 无缝地完成了这项工作。我更喜欢 Flexbox，因为它对我来说更直接。</p><p><strong>获胜者：Flexbox</strong></p><p><a href="https://codepen.io/ondrabus/pen/rNeOEQJ">CodePen Flexbox</a>，<a href="https://codepen.io/ondrabus/pen/mdPeZvd">CodePen Grid</a></p><p>现在让我们开始创建不同的布局。</p><h2 id="-1-"><strong>#1 垂直且水平居中一张卡片</strong></h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/card--1-.png" class="kg-image" alt="card--1-" width="600" height="400" loading="lazy"></figure><p>对于 Flexbox，我们需要一个水平居中的元素，以及垂直居中的另一个（子元素）。</p><p>项目的顺序由 <code>flex-direction</code> 定义的。元素如何在可用空间中定位自己是由元素上的 <code>align-self</code> 或其父元素上的 <code>align-items</code> 设置的。</p><p>对于 Grid，我们需要三列三行。然后我们将卡片放在中间的单元格中。</p><p>水平居中很容易。我们使用 <code>grid-template-columns: auto 33% auto</code> 定义三列及其大小，因为卡片应该和可见区域的 1/3 一样宽。</p><p>问题是，我们不知道垂直尺寸。我们希望顶行和底行占据网格无法实现的剩余空间。 卡片居中，但其高度取决于窗口的高度。</p><p>但是，我们可以通过在卡片周围添加额外的环绕元素，并使用 <code>margin</code> 将其居中，来解决此问题。</p><p><strong><strong>获胜者</strong>：<strong>Flexbox</strong></strong></p><p><a href="https://codepen.io/ondrabus/pen/vYGYobr">CodePen Flexbox</a>，<a href="https://codepen.io/ondrabus/pen/yLOYdLO">CodePen Grid</a></p><h2 id="-2-"><strong>#2 垂直且水平居中两张卡片</strong></h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/two-cards.png" class="kg-image" alt="two-cards" width="600" height="400" loading="lazy"></figure><p>通常我们需要将多个元素居中。将两张卡片保持相同的高度，即使其中一张卡片包含更长的文本。</p><p>使用 Flexbox，我们需要将两张卡片包裹在另一个元素中，并使用它同时将两张卡片居中。</p><p>我们不能在这里使用 <code>align-items</code>，因为在这种情况下它适用于 Y 轴。我们需要用 <code>justify-content: center</code> 来定义 X 轴上的剩余空间应该如何分布。这样可以确保两张卡都水平居中。</p><p>如果我们省略 Grid 的可变高度问题，即使没有任何额外的包裹元素，我们也可以获得相同的结果。这次我们用 <code>grid-template-columns: auto 33% 50px 33% auto</code> 定义了五列网格，其余部分与前一个示例中的相同。</p><p><strong><strong>获胜者</strong>：<strong>Flexbox</strong></strong></p><p><a href="https://codepen.io/ondrabus/pen/mdPybJa">CodePen Flexbox</a>，<a href="https://codepen.io/ondrabus/pen/RwaWXOp">CodePen Grid</a></p><h2 id="-3-"><strong>#3 多张卡片具有相同的宽度和高度</strong></h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/cards.png" class="kg-image" alt="cards" width="600" height="400" loading="lazy"></figure><p>这是博客、电子商务网站或通常显示某种列表的任何网站的另一个典型用例。我们希望卡片具有相同的宽度和高度。需要从列表中最大的元素推断高度。</p><p>这可以在 Flexbox 中使用 <code>flex-wrap: wrap</code> 来完成。如果元素的宽度超过每行的剩余空间，则元素将换行到下一行。但是，除非你明确定义，否则只在单行内保持相同的高度。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/3-flexbox-1.png" class="kg-image" alt="3-flexbox-1" width="600" height="400" loading="lazy"></figure><p>Grid 在这里展示了它的真正力量。可以使用 <code>grid-auto-rows: 1fr</code> 创建此布局，它在所有行上强制执行相同的高度。</p><p><strong><strong>获胜者</strong>：<strong>Grid</strong></strong></p><p><a href="https://codepen.io/ondrabus/pen/LYNpawv">CodePen Flexbox</a>，<a href="https://codepen.io/ondrabus/pen/QWNjPLg">CodePen Grid</a></p><h2 id="-4-"><strong>#4 </strong>垂直和水平居中交替文本和图像</h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/alternating-text.png" class="kg-image" alt="alternating-text" width="600" height="400" loading="lazy"></figure><p>在这个例子中，我们有带有 CTA 按钮的文本，另一侧有一个图像。两个组件都应垂直居中，因为它们的大小可能会有所不同。</p><p>这对 Flexbox 来说是小菜一碟。每一行都是一个 <code>article</code> 元素，分为两个包装容器，<code>.img</code> 和 <code>.content</code>。它们是均匀尺寸分布所必需的（<code>flex-basis: 50%</code>）。</p><p>内部内容的垂直居中由 <code>align-items: center</code> 定义。</p><p>交替是通过在每个奇数文章上使用 <code>flex-direction: row-reverse</code> 反转 Flexbox 的方向来实现的。</p><p>Grid 也很好地处理了这个用例。我们不需要定义一个巨大的网格，而是为每个 <code>article</code> 定义一个。</p><p>它使用 <code>align-items: center</code> 定义垂直居中的同样宽的列。</p><p>交替是通过 <code>grid-column</code> 的切换值在单元格级别定义的。</p><p><strong><strong>获胜者</strong>：平手</strong></p><p><a href="https://codepen.io/ondrabus/pen/BaKoEyQ">CodePen Flexbox</a>，<a href="https://codepen.io/ondrabus/pen/WNwrOOv">CodePen Grid</a></p><h2 id="-5-"><strong>#5 </strong>带菜单的水平标题</h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/menu.png" class="kg-image" alt="menu" width="600" height="400" loading="lazy"></figure><p>要使用 Flexbox 实现这种设计，标题的两侧都需要由单个元素表示。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/5-flexbox.png" class="kg-image" alt="5-flexbox" width="600" height="400" loading="lazy"></figure><p>logo 和公司名称在左侧形成一个锚点 <code>anchor</code>，菜单是右侧的单个 <code>nav</code> 元素。Flexbox 使用 <code>justify-content: space-between</code> 来定位它们。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/5-grid.png" class="kg-image" alt="5-grid" width="600" height="400" loading="lazy"></figure><p>对于 Grid，我们需要两列——一列用于 logo，另一列用于菜单。该菜单是另一个使用 <code>grid-template-columns: repeat(4, minmax(0, 1fr))</code> 均匀分布列大小的网格。</p><p>这里的问题是，如果我们想在菜单中添加另一个项目，我们还需要调整 CSS。</p><p><strong><strong>获胜者</strong>：<strong>Flexbox</strong></strong></p><p><a href="https://codepen.io/ondrabus/pen/wvGMqXq">CodePen Flexbox</a>，<a href="https://codepen.io/ondrabus/pen/oNxbeKx">CodePen Grid</a></p><h2 id="--2"><strong>获胜者是......</strong></h2><p>最终的比分是 5:2，Flexbox 领先，但这并不意味着它成为最终的 CSS 赢家。在某些情况下，你需要使用其中一种，有时甚至两者一起使用，以实现你的需求。</p><p>如果你需要灵活和有条件的定位，请使用 Flexbox。如果要创建需要相同大小的元素或具有表格形式的列表或类似结构，请使用 Grid。</p><p>作为前端开发人员，你需要了解这两者。</p><p><a href="https://css-tricks.com/snippets/css/a-guide-to-flexbox/">Flexbox 参考指南</a>，<a href="https://css-tricks.com/snippets/css/complete-guide-grid/">Grid 参考指南</a></p><p>P.S. 如果以上内容由遗漏，请在 <a href="https://twitter.com/ondrabus">Twitter</a> 告诉我，我会再写一篇 :-)</p><p>原文：<a href="https://www.freecodecamp.org/news/flexbox-vs-grid-how-to-build-the-most-common-html-layouts/">Flexbox vs Grid - How to Build the Most Common HTML Layouts</a>，作者：<a href="https://www.freecodecamp.org/news/author/ondrej/">Ondrej Polesny</a></p> ]]>
                </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="800" height="338" 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="800" height="338" 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="800" height="338" 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="800" height="158" 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="800" height="161" 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="800" height="228" 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="800" height="338" 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="800" height="381" 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="800" height="381" 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="800" height="381" 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="800" height="381" 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="800" height="338" 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="729" height="286" 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="729" height="178" 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="800" height="124" 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="800" height="122" 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="800" height="122" 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="800" height="175" 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="800" height="172" 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="800" height="173" 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="800" height="163" 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="800" height="381" 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="800" height="381" 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="800" height="381" 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="800" height="381" 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="800" height="381" 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="800" height="381" 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="800" height="338" 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="800" height="338" 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="800" height="338" 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="800" height="338" 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="800" height="338" 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="800" height="338" 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="800" height="338" 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="800" height="338" 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="800" height="166" 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="800" height="542" 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="250" height="438" 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="640" height="480" 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="493" height="480" 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="493" height="480" 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="800" height="533" 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[ CSS Flexbox 速查表（含动画） ]]>
                </title>
                <description>
                    <![CDATA[ 前言 这篇全面的 CSS flexbox 速查表将会涵盖你在 Web 项目中使用 flexbox（弹性盒子）所需要的一切知识。 你可以使用 CSS flexbox 格式化 HTML。利用 flexbox 可以轻松地垂直或水平对齐项目，调整项目尺寸以适应空间。这样可以简化响应式设计。 CSS flexbox 对于网站或应用程序的总体布局是非常理想的。这种方法简单易学，适用于所有的现代浏览器，并且你不需要很多时间就能掌握它的基础知识。看完这篇指南，你就可以开始在你的 Web 项目中使用 flexbox 了。 这篇文章包含了 ScottDomes 制作的 gif 动画 [https://www.freecodecamp.org/news/an-animated-guide-to-flexbox-d280cf6afc35/] ，更容易理解。 不同的 CSS Flexbox 属性 下面罗列出各种 CSS flexbox 属性，可以用来在 CSS 中定位元素。 CSS 应用于容器 display: flexbox | inline-flex; flex-direction: row |  ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/flexbox-the-ultimate-css-flex-cheatsheet/</link>
                <guid isPermaLink="false">5f7850a9027c3105323f5911</guid>
                
                    <category>
                        <![CDATA[ CSS ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Flexbox ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web开发 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp.org ]]>
                </dc:creator>
                <pubDate>Sun, 04 Oct 2020 08:50:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2020/10/chuttersnap-fyaTq-fIlro-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <h2 id="-">前言</h2><p>这篇全面的 CSS flexbox 速查表将会涵盖你在 Web 项目中使用 flexbox（弹性盒子）所需要的一切知识。</p><p>你可以使用 CSS flexbox 格式化 HTML。利用 flexbox 可以轻松地垂直或水平对齐项目，调整项目尺寸以适应空间。这样可以简化响应式设计。</p><p>CSS flexbox 对于网站或应用程序的总体布局是非常理想的。这种方法简单易学，适用于所有的现代浏览器，并且你不需要很多时间就能掌握它的基础知识。看完这篇指南，你就可以开始在你的 Web 项目中使用 flexbox 了。</p><p>这篇文章包含了 <a href="https://www.freecodecamp.org/news/an-animated-guide-to-flexbox-d280cf6afc35/">ScottDomes 制作的 gif 动画</a>，更容易理解。</p><h2 id="-css-flexbox-">不同的 CSS Flexbox 属性</h2><p>下面罗列出各种 CSS flexbox 属性，可以用来在 CSS 中定位元素。</p><h3 id="css-">CSS 应用于容器</h3><pre><code class="language-css">display: flexbox | inline-flex;
flex-direction: row | row-reverse | column | column-reverse;
flex-wrap: nowrap | wrap | wrap-reverse;
flex-flow: &lt;‘flex-direction’&gt; || &lt;‘flex-wrap’&gt;
justify-content: flex-start | flex-end | center | space-between | space-around;
align-items: flex-start | flex-end | center | baseline | stretch;
align-content: flex-start | flex-end | center | space-between | space-around | stretch;</code></pre><h3 id="css--1">CSS 应用于容器中的元素</h3><pre><code class="language-css">order: &lt;integer&gt;;
flex-grow: &lt;number&gt;; /* default 0 */
flex-shrink: &lt;number&gt;; /* default 1 */
flex-basis: &lt;length&gt; | auto; /* default auto */
flex: none | [ &lt;'flex-grow'&gt; &lt;'flex-shrink'&gt;? || &lt;'flex-basis'&gt; ]
align-self: auto | flex-start | flex-end | center | baseline | stretch;</code></pre><h2 id="--1">术语</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2020/10/image-1.png" class="kg-image" alt="image-1" width="665" height="277" loading="lazy"><figcaption><a href="https://www.w3.org/TR/css-flexbox-1/">W3C 官方规范</a>中的 flexbox 术语图</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2020/10/image-1.png" class="kg-image" alt="image-1" width="665" height="277" loading="lazy"><figcaption><a href="https://www.w3.org/TR/css-flexbox-1/">W3C 官方规范</a>中的 flexbox 术语图</figcaption></figure><p>学 flexbox 属性之前，一定要知道相关的术语。下方是主要的 flexbox 术语的定义，来自 <a href="https://www.w3.org/TR/css-flexbox-1/">W3C 官方规范</a>。</p><ul><li><strong>main-axis</strong>：flex 项目沿着主轴 main axis 排布，方向是基于 flex-direction 属性的</li><li><strong><strong><strong><strong>main-start | main-end</strong></strong></strong></strong>：flex 项目在容器中，从 main-start 一侧开始，向 main-end 一侧排列</li><li><strong><strong><strong><strong>main size</strong></strong></strong></strong>：flex 容器或项目的宽或高作为主尺度，main size 属性就是指这个作为主尺度的尺寸</li><li><strong><strong><strong><strong>cross axis</strong></strong></strong></strong>：与主轴 main axis 交叉的轴</li><li><strong><strong><strong><strong>cross-start | cross-end</strong></strong></strong></strong>：项目放置在容器的 flex 网格线之间，从 cross-start 一侧开始，向 cross-end 一侧排列</li><li><strong><strong><strong><strong>cross size</strong></strong></strong></strong>：flex 项目的宽或高作为主尺度，cross size 属性就是指这个作为主尺度的尺寸</li></ul><h2 id="css-display-flex">CSS Display Flex</h2><p><code>display:flex</code> 告诉浏览器：“我想在容器中使用 flexbox。”</p><p>A <code>div</code> element defaults to <code>display:block</code>. An element with this display setting takes up the full width of the line it is on. Here is an example of four colored divs in a parent div with the default display setting:</p><p>默认情况下，<code>div</code>元素是 <code>display:block</code>。带有该显示设置的元素将完全占用它所在行的宽度。下面这个例子是一个默认设置的父级 <code>div</code> 包含 4 个彩色的 <code>div</code>。</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/10/1.gif" class="kg-image" alt="1" width="424" height="188" loading="lazy"></figure><p>为了在页面的某一部分使用 flexbox，首先需要给父容器的 CSS 添加 <code>display:flex</code>，把父容器转换成 flex 容器。</p><p>这个容器被初始化为一个 flex 容器，并且应用一些默认的 flex 属性。</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/10/2.gif" class="kg-image" alt="2" width="568" height="245" loading="lazy"></figure><h3 id="flex-">flex 方向</h3><p>使用 <code>flex-direction</code> 可以控制如何显示容器中的项目。你想让它们从左到右、从右到左、从上到下还是从下到上？通过为容器设置 <code>flex-direction</code>，可以很容易地实现 。</p><p>在使用 <code>display:flex</code> 之后，项目默认沿着主轴从左到右排列。以下动画展示向容器项目添加 <code>flex-direction:column</code> 时发生的事情。</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/10/3.gif" class="kg-image" alt="3" width="800" height="345" loading="lazy"></figure><p><br>你也可以设置 <code>flex-direction</code> 为 <code>row-reverse</code> 或 <code>column-reverse</code>。</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/10/4.gif" class="kg-image" alt="4" width="800" height="345" loading="lazy"></figure><h2 id="justify-content"><br>Justify Content</h2><p><code>justify-content</code> 是一个属性，它使容器中的项目沿着主轴对齐（见上面的术语图表），根据内容如何显示而定。使用这个属性填充行之间的空间，并定义如何安排内容。</p><p>这个属性常用的四个选项：<code>flex-start | flex-end | center | space-between | space-around</code>，效果如下：</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/10/5.gif" class="kg-image" alt="5" width="800" height="179" loading="lazy"></figure><p><code>space-between</code> 让项目保留一定间距地在主轴排列，第一个和最后一个项目会被挤到容器边沿。<code>space-around</code> 是类似的，但头尾两个项目不会紧贴容器边沿，空间会均匀分布在所有项目两边。<br></p><h2 id="flex-align-items">Flex Align Items</h2><p><code>align-items</code> 将项目沿着横轴（见上面的术语图表），同时使用 <code>justify-content</code> 和 <code>align-items</code> 就可以用多种不同的方法对齐项目。</p><p>这里有一些最常用的选项来对齐项目：<code>flex-start | flex-end | center | baseline | stretch</code>。</p><p>要想使用 <code>stretch</code> 达到预期效果，元素的高度必须设置为 <code>auto</code> 而非特定高度。</p><p>该动画显示选项的样式：</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/10/1-1.gif" class="kg-image" alt="1-1" width="800" height="280" loading="lazy"></figure><p><br>我们现在同时使用 <code>justify-content</code> 和 <code>align-items</code>，会显示主轴和交叉轴的区别。</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/10/2-1.gif" class="kg-image" alt="2-1" width="800" height="417" loading="lazy"></figure><h2 id="align-self"><strong>Align Self</strong></h2><p>Align-self 用于调整单个元素的位置，具有 <code>align-items</code> 的所有属性。<br>在下方动画中，父级 <code>div</code> 有 CSS 的 <code>align-items: center</code>和<code>flex-direction: row</code>。前面两个方块根据不同的<code>align-self</code> 值产生变化。</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/10/4-1.gif" class="kg-image" alt="4-1" width="800" height="251" loading="lazy"></figure><h2 id="flex-wrap">Flex Wrap</h2><p>flexbox 在默认情况下尝试将所有元素放在一行中。然而，可以使用 <code>flex-wrap</code> 属性来改变这个设置。你可以使用三个值来决定什么时候将元素移动到其他行。</p><p><code>flex-wrap: nowrap</code>为默认值，所有内容会从左到右排列。</p><p>如果第一行没有足够的空间，<code>flex-wrap: wrap</code> 可以将项目移到下一行，从左到右显示项目。</p><p><code>flex-wrap: wrap-reverse</code> 也是将项目移到下一行，但项目是从右到左显示的。</p><h2 id="flex-flow">Flex Flow</h2><p><code>flex-flow</code> 将 <code>flex-wrap</code> 和 <code>flex-direction</code> 组合成一个属性，先设定方向，再设定环绕效果，比如：<code>flex-flow: column wrap;</code></p><h2 id="align-content">Align Content</h2><p><code>align-content</code> 是用于对齐多行项的，在横轴上对齐，而不影响某一行的内容。</p><p>包含这些选项：<code>align-content: flex-start | flex-end | center | space-between | space-around | stretch;</code></p><h2 id="-flexbox-"><br>用 Flexbox 垂直居中</h2><p>若要将所有内容在父元素中垂直居中，可使用 <code>align-items</code>。</p><pre><code class="language-css">.parent {
    display: flex;
    align-items: center;
}</code></pre><h2 id="--2">游戏和应用</h2><p>如果你想练习使用 flexbox，试试这些游戏和应用，它们可以帮助你掌握 flexbox</p><ul><li><a href="http://www.flexboxdefense.com/" rel="nofollow">Flexbox Defense</a> 是一个在线游戏，你可以通过防止敌人穿过你的障碍来学习 flexbox</li><li><a href="http://flexboxfroggy.com/" rel="nofollow">Flexbox Froggy</a> 这个游戏里你通过写 CSS 编码来帮助 Froggy 和朋友们</li><li><a href="http://the-echoplex.net/flexyboxes/" rel="nofollow">Flexyboxes</a> 这个应用允许你查看代码示例和改变参数来查看 flexbox 视觉效果</li><li><a href="http://www.flexboxpatterns.com/" rel="nofollow">Flexbox Patters</a> 是一个提供很多 flexbox 示例的网站</li></ul><h2 id="--3">总结</h2><p>本文介绍了 CSS flexbox 最常用的所有属性。接下来就是练习！试着用 flexbox 创建一些项目吧，这样你就能慢慢掌握它。</p><p>原文：<a href="https://www.freecodecamp.org/news/flexbox-the-ultimate-css-flex-cheatsheet/">Flexbox - The Ultimate CSS Flex Cheatsheet (with animated diagrams!)</a>，作者：Beau Carnes</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
