CSS – Flex 弹性布局详解
简介
Flex是Flexible Box 或 flexbox 的缩写 ,是一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的布局方式。
弹性盒子由弹性容器(父元素)和弹性子元素(item)组成。
弹性容器(父元素)通过设置 display 属性的值为 flex 或 inline-flex 将其定义为弹性容器。
- 注意:inline-flex 不但把子元素变成块项目带伸缩功能,还会让弹性容器变成行内块元素
弹性容器(父元素)内包含了一个或多个弹性子元素
弹性容器(父元素)可以设置的属性有:
flex-direction
flex-wrap
flex-flow
justify-content
align-item
align-contnet
flex-direction 主轴方向
flex-direction 属性决定主轴的方向(即项目的排列方向)
其中包含4种排列方式: row(默认) 、row-reverse 、column 、column-reverse
它们的属性区别分别如下
row: 主轴为水平方向,起点在左端,终点在右端,对应侧轴为垂直方向,起点在上方,终点在下方。
row-reverse:主轴为水平方向,起点在右端,对应侧轴为垂直方向,起点在上方,终点在下方。
column :主轴为垂直方向,起点在上方,终点在下方,对应侧轴为水平方向,起点在左方,终点在右方。
column-reverse:主轴为垂直方向,起点在下方,终点在上方,对应侧轴为水平方向,起点在左方,终点在右方。
flex-wrap 换行方式
flex-wrap 默认情况下,项目都排在一条线(又称“轴线”)上。flex-wrap 属性定义,如果一条轴线排不下,如何换行的问题。
nowrap(默认) : 不换行
wrap :换行
wrap-reverse : 反向换行
initial :设置这个元素不受其它父元素样式影响
inherit :继续父元素的样式
flex-flow 复合属性
flex-flow 其实就是 flex-direction 和 flex-wrap 的合集。
默认参数是 flex-flow : row wrap
一般比较少用。
justify-content 主轴对齐
justify-content 属性定义了项目在主轴上的对齐方式。
有5个参数可选:
flex-start(默认值) : 左对齐
flex-end : 右对齐
center : 居中
space-between : 两端对齐,项目之间的间隔都相等
space-around : 每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍
space-evenly : 每个项目的间隔相等。
align-items 单行侧轴对齐
align-items 属性定义项目在侧轴上如何对齐
共5个选项:
flex-start : 元素置顶排列
flex-end : 元素置底排列
center : 元素居中
stretch : 默认值,元素拉伸填充,前提是item没有设置高度。
baseline : 元素基线排列(使用字母X来判断)
align-content 多行侧轴对齐
align-content 属性定义项目在多行情况下的侧轴上如何对齐
flex-start :与侧轴的起点对齐。
flex-end :与侧轴的终点对齐。
center :与侧轴的中点对齐
space-between :与侧轴两端对齐,中间平均分布。
space-around :伸缩项目间的距离相等,比距边缘大一倍
space-evenly : 在侧轴上完全平分。
stretch :默认值,占满整个侧轴,前提是item没有设置高度。
flex-grow 盒子项目拉伸比
flex-grow 属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大
flex-grow: 0 
如果一个项目的 flex-grow 属性为2,其他项目都为1,则前者占据的剩余空间将比其它项多一倍。
计算方法:
1.取出所有设置了 flex-grow 属性的值之和
2.按每个元素所设置的 flex-grow 属性的值取得对应比例的空间
flex-shrink 盒子项目压缩比
flex-shrink 属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。
如果所有项目的 flex-shrink 属性都为1,当空间不足时,都将等比例缩小。如果一个项目的 flex-shrink 属性为0,其它项目都为1,则空间不足时,前者不缩小。
收缩比算法:
例如:
三个收缩项目,宽度分别为: 200px 、300px 、200px ,它们的flex-shrink 值分别为: 1 、2 、3
若想刚好容纳下三个项目,需要总宽度为700px ,但目前容器只有400px ,还差300px
所以每个人都要收缩一下才可以放下,具体收缩的值,这样计算:
1. 计算分母: (200×1) + (300×2) + (200×3) = 1400
2. 计算比例:
项目一: (200×1) / 1400 = 比例值1
项目二: (300×2) / 1400 = 比例值2
项目三: (200×3) / 1400 = 比例值3
3. 计算最终收缩大小:
项目一需要收缩: 比例值1 × 300
项目二需要收缩: 比例值2 × 300
项目三需要收缩: 比例值3 × 300
注意:收缩比会保证内容不被消失,因此项目收缩极限在于项目中的内容占用大小。
flex-basis 伸缩项目在主轴长的基准长度
flex-basis 属性定义了在分配多余空间之前,项目占据的主轴空间(main size).浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。
若主轴是横向的则原先设定的宽width将失效,宽将为flex-basis的值,若主轴是纵向的则原先设定的高height失效,高将为flex-basis的值.
默认值:flex-basis : auto,则浏览器采月伸缩项目的原宽或原高。
它可以设为跟 width 或 height 属性一样的值,则项目将占据固定空间。
flex 复合属性
flex 属性是 flex-grow(拉伸) , flex-shrink(收缩) 和 flex-basis(基准值) 的简写
语法:
flex: flex-grow flex-shrink flex-basis;
四个特殊简写值
flex: auto
flex: auto 即是 flex: 1 1 auto 的简写,代码如下:
/* 可以拉伸,可以压缩,基准值取原宽或原高 */
flex-grow: 1
flex-shrink: 1
flex-basis: auto
flex: 1
flex: 1 即是 flex: 1 1 0 的简写,代码如下:
/* 可以拉伸,可以压缩,基准值取0,取消原高或原宽 */
flex-grow: 1
flex-shrink: 1
flex-basis: 0
flex: none
flex: none 即是 flex: 0 0 auto 的简写,代码如下:
/* 不可以拉伸,不可以压缩,基准值取原宽或原高 */
flex-grow: 0
flex-shrink: 0
flex-basis: auto
flex: 0 auto(默认值)
flex: 0 auto 即是 flex:0 1 auto 的简写,代码如下:
/* 不可以拉伸,可以压缩,基准值取原宽或原高 */
flex-grow: 0
flex-shrink: 1
flex-basis: auto
order 项目排序
order 属性定义项目的排列顺序。数值越小,排列越靠前(按轴方向的优选显示),默认为0 。
align-self 单独调整侧轴对齐
align-self 属性允许单个项目有与其它项目不一样的对齐方式,可覆盖 align-items 属性,默认为 auto , 表示继承父元素的 align-items 属性,如果没有父元素,则等同于 stretch.
供 6 个参数可选择:
auto(默认值) :继承了它的父元素 align-items 属性
stretch :拉伸填充整个容器
center :居中对齐
flex-start :置顶对齐
flex-end :置底对齐
baseline :位于容器的基线上
align-content
align-content 属性是和 justify-content 相同的作用,只是 justify-content 是左右并排上的排列,而 align-content 是头尾上并排的排列。
提供 6 个选项
flex-start :所有元素向顶堆叠
flex-end :所有元素向底堆叠
center :所有元素居中堆叠
stretch(默认值) :向上堆叠,如果还有余空,不会平均分
space-between :空间平均分,边框没有间隔
space-around :空间平均分,但边框带有间隔



































共有 0 条评论