布局的传统解决方案,基于盒模型,依赖 display 属性 + position 属性 +float 属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。
2009 年,W3C 提出了一种新的方案 ——Flex 布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。
#flex 布局的原理
-
Flex 是 Flexible Box 的缩写,意为 “弹性布局” ,用来为盒状模型提供最大的灵活性。
-
任何一个容器都可以指定为 Flex 布局。
-
当我们为父盒子设为 flex 布局后,子元素的 float、clear 和 vertical-align 属性将失效。
-
名字或叫法:伸缩布局 = 弹性布局 = 伸缩盒布局 = 弹性盒布局 = flex 布局。
-
采用 flex 布局的元素称为 flex 容器(flex container),它的所有子元素自动成为容器成员,称为 flex 项目。
-
子容器可以横向排列也可以纵向排列。
总结 flex 布局原理:就是通过给父盒子添加 flex 属性,来控制子盒子的位置和排列方式。
#Flex 布局常见属性
- flex-direction 设置主轴的方向
- justify-content 设置主轴上的子元素排列方式
- flex-wrap 设置子元素是否换行
- align-content 设置侧轴上的子元素排列方式(多行)
- align-items 设置侧轴上的子元素排列方式(单行)
- flex-flow 复合属性
#flex-direction 设置主轴的方向
#主轴与侧轴:
在 flex 布局中,是分为主轴和侧轴两个方向,同样的叫法有:行和列、x 轴和 y 轴
-
默认主轴方向就是 x 轴方向,水平向右
-
默认侧轴方向就是 y 轴方向,垂直向下
#属性值
flex-direction 属性决定主轴的方向(即项目的排列方向)
主轴和侧轴是会变化的,就看 flex-direction 设置谁为主轴,剩下的就是侧轴,而我们的子元素是跟着主轴来排列的。
属性值 | 说明 |
---|---|
row | 默认值 从左到右 |
row-reverse | 从右到左 |
column | 从上到下 |
column-reverse | 从下到上 |
#justify-content 设置主轴上的子元素排列方式
该属性定义了项目在主轴上的对齐方式
使用这个属性之前一定要确定好主轴是哪个方向
属性值 | 说明 |
---|---|
flex-start | 默认值 从头部开始,如果主轴是 x 轴则从左到右 |
flex-end | 从尾部开始排列 |
center | 在主轴居中对齐(如果主轴是 x 轴则水平居中) |
space-around | 平分剩余空间 |
space-between | 先两边帖边再平分剩余空间(重要) |
#flex-wrap 设置子元素是否换行
- 默认情况下,项目都排在一条线(又称 “轴线”)上。flex-wrap 属性定义,flex 布局中默认是不换行的。
属性值 | 说明 |
---|---|
nowrap | 默认值,不换行 |
wrap | 换行 |
#align-items 设置侧轴上的子元素排列方式(单行)
- 该属性是控制子项在侧轴(默认是 Y 轴)上的排列方式,在子项为单行的时候使用。
属性值 | 说明 |
---|---|
flex-start | 默认值 从上向下 |
flex-end | 从下向上 |
center | 挤在一起居中(垂直居中) |
stretch | 拉伸(子元素不能设置高度,否则无用) |
#align-content 设置侧轴上的子元素排列方式(多行)
- 设置子项在侧轴上的排列方式,并且只能用于子项出现换行的情况(多行),在单行下是没有效果的。
属性值 | 说明 |
---|---|
flex-start | 默认值 在侧轴的上部开始排列 |
flex-end | 在侧轴的下部开始排列 |
center | 在侧轴居中排列 |
space-around | 子项在侧轴平分剩余空间 |
space-between | 子项在侧轴先分布两头两个元素,其它元素平分中间剩余空间 |
stretch | 设置子项元素高度平分父元素高度 |
#flex-flow 复合属性
-
flex-flow 是复合属性,相当于同时设置了 flex-direction 和 flex-warp
-
flex-flow: column wrap;
-
第一个值为 flex-direction 的值
-
第二个值为 flex-wrap 的值
-
上面这些并不是 flex 中所有的属性,但使用以上这些基本上可以满足日常中所有的排版场景。