flex 弹性盒布局简介 | 每天学一点flex

186 阅读4分钟

flex 弹性盒布局简介 | 每天学一点flex

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 14 天,点击查看活动详情

知其所以然

在 Web 短暂的历史中,设计师用过多种不同的网页布局方式。

一开始,设计师依靠 html 表格组织内容,把页面分成多行和多列。可是,html 中的 table 标签原本就不是为页面布局而生的。

后来出现了 css 和基于浮动的布局,使用这种方法控制页面布局更简单,也更加符合逻辑。

如今,基于浮动的布局仍然是最常用的方法,而且设计师一直在改进其用法。例如,栅格系统就是创建布局的得力工具,不过其背后仍然使用的是浮动。

再往后,万维网联盟引入了 css 定位模块,可以使用相对定位和绝对定位来辅助页面的布局了。

至此,在布局的传统解决方案中,有很长一段时间都是基于盒状模型,依赖 display、position 以及 float 属性来进行布局。

但是,这种方式对于那些特殊布局非常的不方便,比如:垂直居中就不容易实现。

2009 年,W3C 提出了一种新的方案,flex 布局

可以简便,完整,响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能了。

flex 布局已经成为当前布局的首选方案。

flex 弹性盒布局简介

flex 是 flexible box 的缩写,翻译成中文为“弹性盒子”,用来为盒状模型提供最大的灵活性。

任何一个容器都可以指定为弹性盒,只需要将 display 属性设置为 flex 即可,如下:

.box{
    display: flex;
}

行内元素也可以使用 flex 布局,只需要将 display 属性设置为 inline-flex 即可。如下:

.box{
    display: inline-flex;
}

注:设置为 flex 布局之后,子元素的 float,clear 和 vertical-align 属性将失效。

采用 flex 布局的元素,会成为 flex 容器(flex container),简称容器。它的所有子元素自动成为容器成员,称之为 flex 项目(flex item),简称项目

bg2015071004.png

容器默认存在两根轴:**水平的主轴 main axis ** 和 垂直的交叉轴 cross axis

主轴的开始位置(与边框的交叉点)叫做 main start,结束位置叫做 main end。交叉轴的开始位置叫做 cross start,结束位置叫做 cross end

项目默认沿主轴排列。单个项目占据的主轴空间叫做 main size,占据的交叉轴空间叫做 cross size

学习弹性盒子,其实主要就是学习容器上面可以设置的属性,以及项目上面可以设置的属性

这里将容器和项目上面可以设置的属性一并列举出来,方便查询。之后会对每一个属性进行详细的介绍。

容器和项目上面可以设置的属性如下表所示:

容器可设置属性:一共有 6 个属性

属性名描述
flex-direction设置内部项目的排列方向
flex-wrap设置一行放不下的话是否换行
flex-flow上面两种属性的简写,推荐使用
justify-content项目在主轴( x 轴)上的对齐方式
align-items项目在交叉轴( y 轴)上的对齐方式
align-content有多根轴线时的对齐方式。如果项目只有一根轴线,那么该属性不起作用

项目可设置属性:一共也是 6 个属性

属性名描述
order项目的排列顺序,数字越小越靠前
flex-grow项目放大的比例
flex-shrink项目缩小的比例
flex-basis项目占据的主轴空间
flexflex-grow,flex-shrink 和 flex-basis 的简写,推荐使用
align-self设置个别项目在交叉轴( y 轴)上的对齐方式

为了演示上面的属性效果,我们首先建立一个页面,其 html 和 css 代码如下:

html 代码片段:

<!-- 容器盒子 -->
<div class="container">
    <!-- 项目盒子 -->
    <div class="one item">one</div>
    <div class="two item">two</div>
    <div class="three item">three</div>
    <div class="four item">for</div>
</div>

css 代码片段:

* {
    margin: 0;
    padding: 0;
}

/* 容器 css */
.container {
    width: 300px;
    height: 300px;
    outline: 1px solid;
    margin: 100px;
}

/* 项目 css */
.item {
    width: 60px;
    height: 60px;
    text-align: center;
    line-height: 60px;
    color: white;
}

/* 每个项目背景颜色 */
.one {
    background-color: red;
}

.two {
    background-color: skyblue;
}

.three {
    background-color: gray;
}

.four {
    background-color: pink;
}

当前的效果如下:

接下来我们给外层的容器添加 display:flex 后,此时容器就变成了一个弹性盒子。

/* 容器 css */
.container {
    width: 300px;
    height: 300px;
    outline: 1px solid;
    margin: 100px;
    display: flex;  /* 设置该盒子为弹性盒 */
}

当我们设置外层盒子为弹性盒之后,里面的子元素排列成了一行。效果如下: