flex布局原理
flex是flexible box的缩写,意为“弹性布局”,用来为盒状模型提供最大的灵活性,任何一个容器都可以指定为flex布局。
- 当我们为父盒子设为flex布局以后,子元素的
float
、clear
和vertical-align
属性将失效 - 伸缩布局 = 弹性布局 = 伸缩盒布局 = 弹性盒布局 = flex布局
采用flex布局的元素,称为flex容器(flex container),简称“容器”。它的所有子元素自动成为容器成员,称为flex项目(flex item),简称项目。
总结flex布局原理:就是通过给父盒子添加flex属性,来控制盒子的位置和排列方式。
常见父项属性
flex-direction
:设置主轴的方向justify-content
:设置主轴上的子元素排列方式flex-wrap
:设置子元素是否换行align-content
:设置侧轴上的子元素的排列方式(多行)align-items
:设置侧轴上的子元素排列方式(单行)flex-flow
:复合属性,相当于同时设置了flex-direction
和flex-wrap
flex-direction
设置主轴方向
主轴与侧轴
在flex布局中,是分为主轴和侧轴两个方向,同样的叫法有:行和列、x轴和y轴。
- 默认主轴方向就是x轴方向,水平向右
- 默认侧轴方向就是y轴方向,水平向下
属性值
flex-direction属性决定主轴的方向(即项目的排列方向)
注意:主轴和侧轴是会变化的,就看flex-direction设置谁为主轴。而我们的子元素是跟着主轴来排列的。
属性值 | 说明 |
---|---|
row |
默认值从左到右 |
row-reverse |
从右到左 |
column |
从上到下 |
column-reverse |
从下到上 |
justify-content
设置主轴上的元素排列方式
justify-content属性定义了项目在主轴上的对齐方式。
注意:使用这个属性之前一定要确定好主轴是哪个。
属性值 | 说明 |
---|---|
flex-start |
默认值从头部开始,如果主轴是x轴,则从左到右 |
flex-end |
从尾部开始排列 |
center |
在主轴居中对齐(如果主轴是x轴则水平居中) |
space-around |
平分剩余空间 |
space-between |
先两边贴边,再平分剩余空间 |
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 | 设置子项元素高度平分父元素高度 |
align-content和align-items区别
align-items
适用于单行情况下,只有上对齐、下对齐、居中和拉伸align-content
适应于换行(多行)的情况下(单行情况下无效),可以设置上对齐、下对齐、居中、拉伸以及平均分配剩余空间等属性值- 总结就是单行找
align-items
,多行找align-content
flex-flow(复合属性)
flex-flow属性是flex-direction和flex-wrap属性的复合属性。
flex-flow: row wrap;
flex布局子项常见属性
- flex子项目占的份数
- align-self控制子项自己在侧轴的排列方式
-
order
order属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。
注意:和z-index不一样。flex-grow
flex-grow
规定了flex-grow
项在flex容器中分配剩余空间的相对比例。- 剩余空间是flex容器的大小减去所有flex项的大小加起来的大小。如果所有的兄弟项目都有相同的
flex-grow
系数,那么所有的项目将剩余空间按相同比例分配,否则将根据不同的flex-grow
定义的比例进行分配。 -
flex-shrink
flex-shrink
属性指定了flex元素的收缩规则。- flex元素仅在默认宽度之和大于容器的时候才会发生收缩,其收缩的大小是依据
flex-shrink
的值。 -
flex-basis
flex-basis指定了flex元素在主轴方向上的初始大小
- 如果不使用box-sizing改变盒模型的话,那么这个属性就决定了flex元素的内容盒(content-box)的尺寸
- 当一个元素同时被设置了 flex-basis (除值为 auto 外) 和 width (或者在 flex-direction: column 情况下设置了height) , flex-basis 具有更高的优先级.
- 默认值:
auto
flex属性
flex属性定义子项目分配剩余空间,用flex来表示占多少份数。
初始值:0、1、auto.item {
flex: <number>; /* default 0 */
}
align-self控制子项自己在侧轴上的排列方式
align-self
属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items
属性。默认值为auto
,表示继承父元素的align-items
属性,如果没有父元素,则等同于stretch
。
属性值 | 说明 |
---|---|
auto | 默认值 |
flex-start | |
flex-end | |
center | |
baseline | |
stretch |