关于flex布局
一、布局原理
flex是flexible Box的缩写,意味“弹性布局”,用来为盒状模型提供最大的灵活性,任何一个容器都可以制定为flex布局。通过给父盒子(父元素)添加flex属性,来控制子盒子(子元素)的位置和排列方式。
- 当我们为父元素设为flex布局以后,子元素的float、clear、vertical-align属性将失效。
- 采用Flex布局的元素,称位flex容器(flex container),简称“容器”。它的所有子元素自动成为容器成员,称位flex项目(flex item),简称“项目”。
二、常见父元素属性
以下6个属性是对父元素设置的:
- flex-direction:设置主轴的方向
- justify-content:设置主轴上子元素的排列方式
- flex-wrap:设置子元素是否换行
- align-content:设置侧轴上的子元素的排列方式(多行)
- align-item:设置侧轴上的子元素排列方式(单行)
- flex-flow:复合属性,相当于同时设置了flex-direction和flex-wrap
2.1 flex-direction 设置主轴的方向 *
主轴和侧轴
在flex布局中,分主轴和侧轴两个方向(也可以叫:行和列、x轴和y轴)
- 默认主轴方向是x轴方向,水平向右
- 默认侧轴方式向是y轴方向,水平向下
属性值
flex-direction属性决定主轴的方向(即项目排列的方向)
PS:主轴和侧轴是会变化的,就看flex-direction设置谁为主轴,剩下的就是侧轴。(子元素是跟着主轴来排列的)
属性值 | 说明 |
---|---|
row | 从左到右(默认值) |
row-reverse | 从右到左 |
column | 从上到下 |
column-reverse | 从下到上 |
2.2 justify-content 设置主轴的子元素排列方式 *
该属性定义了子元素在主轴(默认是x轴)的对齐方式
PS: 一定要先确定好主轴是哪个
属性值 | 说明 |
---|---|
flex-start | 从头部开始 如果主轴是x轴,从左到右(默认值) |
flex-end | 从尾部开始 |
center | 在主轴居中对齐 |
space-around | 平分剩余的空间 |
space-between | 先两边贴边,再平分剩余空间(重要) |
2.3 flex-wrap 设置子元素是否换行 *
默认情况下,子元素都排在一条线上
属性值 | 说明 |
---|---|
nowrap | 不换行(默认值) |
wrap | 换行 |
2.4 align-items 设置侧轴上的子元素排列方式(单行)*
该属性定义了子元素在侧轴(默认是y轴)的对齐方式,在子元素为 单行 的时候使用
属性值 | 说明 |
---|---|
flex-start | 从上到下(默认值) |
flex-end | 从下到上 |
center | 在侧轴居中对齐 |
stretch | 拉伸 |
2.5 align-content 设置侧轴上的子元素排列方式(多行)
该属性定义了子元素在侧轴的对齐方式,在子元素为 多行 的时候使用,在单行下使用是无效的
PS:多行就是子元素出现 换行 的情况
属性值 | 说明 |
---|---|
flex-start | 在侧轴的头部开始排列(默认值) |
flex-end | 在侧轴的尾部开始排列 |
center | 在侧轴中间显示 |
space-around | 子元素在侧轴平分剩余空间 |
space-between | 子元素在侧轴先两边贴边,再平分剩余空间 |
stretch | 设置子元素高度平分父元素高度 |
align-content 和 align-items 区别:
- align-items 适用于单行情况,只有上对齐、下对齐、居中和拉伸
- align-content 适用于多行(即出现 换行 的情况),不仅有上对齐、下对齐、居中拉伸,还增加了 平均分配剩余空间 的属性
总结:
单行找align-items,多行找align-content
2.6 flex-flow
该属性是 flex-direction和flex-wrap属性的复合属性
flex-flow: row wrap;
三、 常见子元素属性
以下3个属性是对子元素设置的:
- flex:设置子元素占的份数
- align-self:设置子元素自己在侧轴的排列方式
- order:设置子元素的排列顺序(前后顺序)
3.1 flex属性 *
该属性定义子元素分配剩余空间,用flex来表示占多少份数
原本子项是通过设置宽高来分配所占空间的,现在通过flex来设置,flex会相对灵活,可随着页面的缩放而改变(简单的理解就是flex是一个比例而不是一个具体的、固定的值)
.item {/* 默认是0 */flex: 1;
}
3.2 align-self 设置单个子元素在侧轴上的排列方式
该属性允许单个元素与其他子元素有不一样的对齐方式,可覆盖align-items属性
默认值是auto,表示 继承父元素的align-items属性
span:nth-child(2) {/* 设置自己在侧轴的排列方式 */align-self: flex-end;
}
3.3 order 设置子元素的排列顺序
数字越小,排列越靠前,默认值是0
PS:和z-index不一样