Flex是Flexible Box的缩写,意为弹性布局。是W3C早期提出的一个新的布局方案。能够便捷的实现页面布局,目前较高版本的主流浏览器都能兼容,兼容状况以下:css
Flex在移动端开发上已经是主流,好比在h5页面,微信小程序等等。web
为何要用弹性布局呢?
小程序
在传统的布局方案主要基于CSS盒子模型,依赖display、position、float等属性。可是它对于一些特殊的布局很是不方便,好比盒子水平剧中,实现起来比较繁琐,各类黑科技。如今咱们用多种方法实现盒子剧中,基础dom以下:父容器背景为粉色的容器,目标盒子为200px的天蓝色子容器:微信小程序
实现效果:浏览器
传统方法一:微信
传统方法二:dom
Flex布局方法就简单多了布局
下面是Flex的使用flex
任何一个容器均可以指定为Flex布局,写法: .box{ display: flex; }, spa
行内元素也可使用Flex布局, 写法: .box{ display: inline-flex; },
注意:Webkit内核的浏览器需加上-webkit前缀,另外,设为Flex布局后,子元素的float、clear及vertical-alian属性都将失效。
基本概念
父容器设为flex后,它全部的子元素自动成为容器成员(这里的子元素不管是什么元素,块级仍是行内,并且只做用于子元素,对孙元素无效,须要继续在子元素上设置display:flex)。
Flex的基本概念就是容器和轴,容器包括外层的父容器和内层的子容器(也叫项目,flex item),轴包括主轴和交叉轴。以下图:
容器默认存在两根轴,水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置(与边框交叉的点)叫作main start;结束的位置叫main end;交叉轴的开始位置叫cross start;交叉轴结束的未知叫cross end。
子容器(项目)默认沿主轴排列,单个项目占据的主轴空间叫作main size,占据交叉轴的空间叫cross size。
Flex 布局主要涉及12个属性(不含display:flex),其中容器和子容器各6各,可是日常使用到的基本只有4个属性,父容器和子容器各2个。
做用于父容器的属性
. flex-direction
. flex-wrap
. flex-flow
. justify-content
. align-items
. align-content
做用于子容器(项目)的属性
. order
. flex-grow
. flex-shrink
. flex-basis
. flex
. align-self
详细介绍
容器属性
一、flex-direction
flex-direction属性决定主轴的方向,及子容器(项目)的排列方向。
。 row(默认值):主轴为水平方向,起点在左端(从左到右排序,至关于float:left);
。 row-reverse:主轴为水平方向,起点在右端(从右往左排序,至关于float:right);
。 column:主轴为垂直方向,起点在上沿;
。 column-reverse:主轴为垂直方向,起点在下沿。
二、flex-wrap
默认状况下,项目都排在一条线(又称“轴线”)上。flex-wrap属性定义,若是一条轴线排不下如何换行。
。 nowrap(默认):不换行;
。 wrap:换行,第一行在上方;
。wrap-reverse:换行,第一行在下方;
三、flex-flow
flex-flow属性是flex-direction和flex-wrap的简写形式,默认值:row nowrap
四、justify-content
justify-content定义了子容器(项目)在主轴上的对齐方式。
。 flex-start(默认值):左对齐;
。 center:居中;
。 flex-end:右对齐;
。 space-between:两端对齐,子容器(项目)之间的间隔相等;
。 space-around:每一个子容器(项目)两侧的间距相等,因此子容器(项目)的间隔比子容器(项目)与边框的间隔大一倍;
五、align-items
align-items属性定义了子容器(项目)在交叉轴的对齐方式。
。 flex-start:交叉轴的起点对齐;
。 center :交叉轴居中;
。 flex-end:交叉轴的终点对齐;
。 baseline:子容器(项目)的第一行文字的基线对齐;
。 stretch(默认值):若是子容器(项目)未设置高度或者设为auto时,将占满整个容器的高度;
六、algin-content
align-content属性定义了多根轴线的对齐方式,若是子容器(项目)只有一根轴线,该属性不起做用。
。 flex-start:与交叉轴的起点对齐;
。 center:与交叉轴的中点对齐;
。 flex-end:与交叉轴的终点对齐;
。 space-between:与交叉轴两端对齐,轴线之间的间隔平均分布;
。 space-around:每根轴线两侧的间隔都相等,因此,轴线之间的间隔比轴线与边框的间隔大一倍;
。 stretch(默认值):轴线占满整个交叉轴;
容器(项目)属性
一、order
order属性定义项目的排列顺序,数值越小,排在越前,默认为0。 .item { order: <integer> }
二、flex-grow
flex-grow属性定义项目方大比例,默认为0,即若是存在剩余空间,也不放大。 .item{ flex-grow: <number>} 注意:负数是至关于默认值
三、flex-shrink
flex-shrink属性定义了项目的缩小比例,默认为1,即若是空间不足,该项目将缩小。 .item { flex-shrink: <number> }
若是全部项目的flex-shrink
属性都为1,当空间不足时,都将等比例缩小。若是一个项目的flex-shrink
属性为0,其余项目都为1,则空间不足时,前者不缩小。负值对该属性无效。
注意:只有当父容器空间不够时该属性才会生效,另外当空间继续减少时,flex-shrink属性值越大的子容器(项目)先缩小。
四、flex-basis
flex-basis属性定义了在分配多余空间以前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。
它的默认值为auto
,即项目的原本大小。 .item { flex-basis: <length> | auto }
注意:它能够设为跟width
或height
属性同样的值(好比350px),则项目将占据固定空间。
五、flex
flex属性是flex-grow
, flex-shrink
和 flex-basis
的简写,默认值为0 1 auto
。后两个属性可选。
.item { flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]}
该属性有两个快捷值:auto
(1 1 auto
) 和 none (0 0 auto
)。
建议优先使用这个属性,而不是单独写三个分离的属性,由于浏览器会推算相关值。
六、align-self
align-self属性容许单个项目有与其余项目不同的对齐方式,可覆盖align-items
属性。默认值为auto
,表示继承父元素的align-items
属性,若是没有父元素,则等同于stretch
。
.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
注意:该属性可能取6个值,除了auto,其余都与align-items属性彻底一致。auto为默认值!