1. 为什么我们要用flex布局
相比于传统布局方式,flex布局可以较为简便实现一些布局样式,比如水平排列,水平等分排列等,而这些排列方式在传统布局中需要通过设置flow
,display
等属性,并配合margin
外边距等方式才能实现,相比于传统布局,flex布局便捷快速,但对于IE11以下的浏览器不能适配。
而在手机端,由于兼容性非常好,所以在做移动端前端页面时,flex布局有着非常大的优势。
2. flex布局常用属性
2.1 设置flex容器
当我们需要设置flex布局的时候,首先需要制定一个flex容器,即设定display: flex
。在这个容器下的元素会进行flex布局展示。flex布局有两个坐标轴,一条为主轴,以浏览器左上角为原点,方向向右,另一条为副轴,以浏览器左上角为原点,方向向下。
需要注意的是,在flex容器下的元素都是行内块元素,即它们也可以通过设置width
和height
改变大小。
<style>
* {
margin: 0%;
}
.wrap {
display: flex;
margin: 20px 0 0 20px;
}
.wrap div:nth-child(1) {
width: 100px;
background-color: orange;
}
.wrap div:nth-child(2) {
/* flex: 1; */
width: 100px;
background-color: green;
}
.wrap div:nth-child(3) {
width: 100px;
background-color: blue;
}
</style>
<div class="wrap">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
2.2 flex-direction属性
flex-direction
属性是设置在flex容器上的,它可以更改主轴的方向,有下面几个值
属性 | 说明 |
---|---|
row | (默认)水平排列 |
Row-reverse | 水平反向排列 |
column | 纵向排列 |
column-reverse | 纵向反向排列 |
下面我们来分别用代码看看它们的效果,只需修改前面代码中.wrap
下的属性
.wrap {
display: flex;
flex-direction: row-reverse;
margin: 20px;
}
这里我们可以看到,123的顺序被逆向为321排列了。
下面我们将属性设置为
column
.wrap {
display: flex;
flex-direction: column;
margin: 20px;
}
下面设置为
column-reverse
,我们将看到123排列被逆向为321排列
.wrap {
display: flex;
flex-direction: column-reverse;
margin: 20px;
}
2.3 justify-content属性
justify-content
属性也是设置在flex容器上的,它可以设置主轴上的子元素的排列方式,有下面几种属性。
属性 | 说明 |
---|---|
flex-start | (默认)从头部开始,如果主轴是X轴,则从左往右 |
flex-end | 从右往左开始排列 |
center | 在主轴居中对齐(如果主轴是X轴则水平居中) |
space-around | 平分flex容器空间排列 |
space-between | 先两边贴边,再去平分剩下的空间排列 |
默认值为justify-content: flex-start
.wrap {
display: flex;
justify-content: flex-start;
margin: 20px;
border: 1px solid red;
}
下面我们设置justify-content: flex-end
查看效果
.wrap {
display: flex;
justify-content: flex-end;
margin: 20px;
border: 1px solid red;
}
当设置为
justify-content: center
时,代码就不贴了当设置为
justify-content: space-around
,我们发现中间的空白区域和两侧的空白区域也分别相同。最后我们设置
justify-content: space-between
,可以看到两侧不再留空白,中间空白区域等分。2.4 flex-wrap属性
flex-wrap
属性可以设置是否元素排列不下的时候进行换行。
例如参考如下代码,每个div
的宽度为100px
,而容器的宽度为200px
,显然是不能够直接装下的,所以在不设置flex-wrap
属性的时候,5个div
都会被压缩而填满一行
<style>
* {
margin: 0%;
}
.wrap {
display: flex;
width: 200px;
height: 200px;
margin: 20px;
border: 1px solid red;
}
.wrap > div {
width: 100px;
height: 50px;
background-color: orange;
border: 1px solid black;
box-sizing: border-box;
}
</style>
<div class="wrap">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</div>
如果我们希望它在排列不下的时候自动换行,我们可以设置
flex-wrap
属性为wrap
,即可实现换行
.wrap {
display: flex;
width: 200px;
height: 200px;
margin: 20px;
flex-wrap: wrap;
border: 1px solid red;
}
2.5 align-items属性
align-items
属性是设置侧轴排列的属性,一共有如下几个值
属性值 | 说明 |
---|---|
flex-start | 默认值,从上到下 |
flex-end | 从下到上 |
center | 垂直居中 |
stretch | 拉伸 |
2.5.1 默认值flex-start
该效果如前一张图,侧轴是从上到下进行排列的
2.5.2 flex-end
我们通过设置align-items属性
,即可使得侧轴从下往上排列
align-items: flex-end;
2.5.3 center
通过设置align-items: center
我们可以实现下图居中排列
align-items: center;
2.5.4 stretch
当我们在不设置每个div
高度的情况下,设置align-items: stretch
时,会使得div
的高度拉长充满盒子的高度,如下图
(后续更新)