一劳永逸的搞定 flex 布局

论坛 期权论坛     
选择匿名的用户   2021-5-26 13:30   18   0
<div class="article-content">
<h2 id="-">寻根溯源话布局</h2>
<p>一切都始于这样一个问题:怎样通过 CSS 简单而优雅的实现水平、垂直同时居中。记得刚开始学习 CSS 的时候,看到 <code>float</code> 属性不由得感觉眼前一亮,顺理成章的联想到 Word 文档排版中用到的的左对齐、右对齐和居中对齐,然而很快就失望的发现 CSS 中并不存在 <code>float: center</code> 的写法,那么 <code>text-align: center</code>、<code>verticle-align: center</code> 是否可行呢?答案也是否定的。这两个属性只能用于行内元素,对于块级元素的布局是无效的。</p>
<p>在网页布局没有进入 CSS 的时代,排版几乎是通过 <code>table</code> 元素实现的,在 <code>table</code> 的单元格里可以方便的使用 <code>align</code>、<code>valign</code> 来实现水平和垂直方向的对齐,随着 Web 语义化的流行,这些写法逐渐淡出了视野,CSS 标准为我们提供了 3 种布局方式:<code>标准文档流</code>、<code>浮动布局</code>和<code>定位布局</code>。这几种方式的搭配使用可以轻松搞定 PC 端页面的常见需求,比如实现水平居中可以使用 <code>margin: 0 auto</code>,实现水平垂直同时居中可以如下设置:</p>
<pre class="blockcode"><code class="hljs css copyable"><span class="hljs-selector-class">.dad</span> {
    <span class="hljs-attribute">position</span>: relative;
}<span class="copy-code-btn">复制代码</span></code></pre>
<pre class="blockcode"><code class="hljs css copyable"><span class="hljs-selector-class">.son</span> {
    <span class="hljs-attribute">position</span>: absolute;
    <span class="hljs-attribute">margin</span>: auto;
    <span class="hljs-attribute">top</span>: <span class="hljs-number">0</span>;
    <span class="hljs-attribute">right</span>: <span class="hljs-number">0</span>;
    <span class="hljs-attribute">bottom</span>: <span class="hljs-number">0</span>;
    <span class="hljs-attribute">left</span>: <span class="hljs-number">0</span>;
}<span class="copy-code-btn">复制代码</span></code></pre>
<hr>
<pre class="blockcode"><code class="hljs css copyable"><span class="hljs-selector-class">.dad</span> {
    <span class="hljs-attribute">position</span>: relative;
}<span class="copy-code-btn">复制代码</span></code></pre>
<pre class="blockcode"><code class="hljs css copyable"><span class="hljs-selector-class">.son</span> {
    <span class="hljs-attribute">width</span>: <span class="hljs-number">100px</span>;
    <span class="hljs-attribute">height</span>: <span class="hljs-number">100px</span>;
    <span class="hljs-attribute">position</span>: absolute;
    <span class="hljs-attribute">top</span>: <span class="hljs-number">50%</span>;
    <span class="hljs-attribute">left</span>: <span class="hljs-number">50%</span>;
    <span class="hljs-attribute">margin-top</span>: -<span class="hljs-number">50px</span>;
    <span class="hljs-attribute">margin-left</span>: -<span class="hljs-number">50px</span>;
}<span class="copy-code-btn">复制代码</span></code></pre>
<p>然而,这些写法都存在一些缺陷:缺少语义并且不够灵活。我们需要的是通过 1 个属性就能优雅的实现子元素居中或均匀分布,甚至可以随着窗口缩放自动适应。在这样的需求下,CSS 的第 4 种布局方式诞生了,这就是我们今天要重点介绍的 flex 布局。</p>
<h2 id="flex-">flex 基本概念</h2>
<p>使用 flex 布局首先要设置父容器 <code>display: flex</code>,然后再设置 <code>justify-content: center</code> 实现水平居中,最后设置 <code>align-items: center</code> 实现垂直居中。</p>
<pre class="blockcode"><code class="hljs css copyable"><span class="hljs-selector-id">#dad</span> {
    <span class="hljs-attribute">display</span>: flex;
    <span class="hljs-attribute">justify-content</span>: center;
    <span class="hljs-attribute">align-items</span>: center
}<span class="copy-code-btn">复制代码</span></code></pre>
<p></p>
<figure>
  <figcaption></figcaption>
</figure>
<p>就是这么简单,大功告成。等等,好像哪里不对,<code>justify-content</code> 和 <code>align-items</code> 是啥?哪里可以看出横向、竖向的语义?是的,flex 的确没有那么简单,这就要从两个基本概念说起了。</p>
<p></p>
<figure>
  <figcaption></figcaption>
</figure>
<p>说来也不难,flex 的核心的概念就是 <strong>容器</strong> 和 <strong>轴</strong>。容器包括外层的 <strong>父容器</strong> 和内层的 <strong>子容器</strong>,轴包括 <strong>主轴</strong> 和 <strong>交叉轴</strong>,可以说 flex 布局的全部特性都构建在这两个概念上。flex 布局涉及到 12 个 CSS 属性(不含 <code>display: flex</code>),其中父容器、子容器各 6 个。不过常用的属性只有 4 个,父容器、子容器各 2 个,我们就先从常用的说起吧。</p>
<h3 id="1-">1. 容器</h3>
<blockquote>
  <p>容器具有这样的特点:父容器可以统一设置子容器的排列方式,子容器也可以
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP