在flex出现以前,双列布局,三列布局,动态盒居中,绝对居中布局等常见的布局均是采用dispaly+float+定位来布局的,通常包括如下几种布局策略:css
flex-即flexible,弹性的,灵活的,又叫弹性盒布局(flexible box layout),这种布局方式主要有如下特色:html
关于flex布局中,有如下几个基本常识值得注意:bash
display:flex
属性的元素叫作 flex container,即flex容器,它里面的子元素叫作flex item宽度老是自动扩张到最大值
(注意是宽度,无论主轴是哪一个方向,它的宽度老是会扩张到最大值,即便这个容器元素是行内元素如span,而子元素的宽度受多个属性影响,如flex-direction,align-items,flex-grow等,有时候看起来容器元素的宽度并不等于item元素宽度的和,以下图2所示)不区分主轴的方向,height,width老是自动收缩
flex-direction 指定了子元素排列的方式,能够为row(按行展现)/column(按列展现)/inherit/row-reverse/column-reverse布局
例1. 当flex-direction为row时,显示效果以下:post
其中html和css代码以下:测试
<div class="container">
<div class="item">item1</div>
<div class="item">item2</div>
</div>
.container{
display:flex;
border:1px solid red;
height:300px;
}
.item{
border:1px solid black;
}
复制代码
例2.当为.container添加flex-direction:cloumn属性后,排列效果以下:flex
图2,图3中的flex-item都没有指定width和height值,但咱们经过border能够看到看到,图2中的垂直方向的空间自动填满了container的宽度,即container此时在主轴方向的长度,图3中的水平方向的空间自动填满了container的高度,一样的,这也是container此时在侧轴方向的长度,这个如今和后续提到的align-items
有关,不过咱们暂时能够作出以下总结: 默认状况下,flex-item元素在其侧轴方向的长度老是自动扩张的(固然,后续会知道,只是默认状况,稍微改变align-items属性值,表现就会不同~)spa
用于控制是否能够换行(按row排列时)/列(按column排列时),当flex-wrap是nowrap时,全部items老是自动缩小而不会换行(列)3d
flex-direction和flex-wrap的缩写,如flex:row wrap实际上同时设置了 flex-direction:row和flex-wrap:wrap;code
主轴方向的对齐方式,可取:flex-start/flex-end/center/space-around/space-between,默认为flex-start
侧轴方向的对齐方式,可取:flex-start/flex-end/center/stretch/baseline,默认为stretch(填满父空间,前提是不指定height值,当指定了height值时,会以该值为主
),也就是以前提到的默认状况下,flex-item元素在其侧轴方向的长度老是自动扩张的
为了测试指定height时,align-items:stretch仍是否会对元素项产生效果,进行了如下测试:
<div class="outer">
<div>item1</div>
<div>item2</div>
<div>item3</div>
<div>item4</div>
</div>
.outer{
align-items:stretch;
}
.outer div:nth-child(1){
height:200px;
}
复制代码
如图所示,因为align-items是stretch(也是默认值),因此除item1元素外的全部元素在侧轴方向都自动拉伸到最大了,而item1之因此没有自动拉伸,是由于对其显示设置了高度,此时能够理解为height属性的优先级要更高。
align-content属性和justify-content,align-items是相似的,都是控制item元素之间的摆放方式,只是该属性只有在主轴方向上有多个轴线时才有效,如flex-direction是row时,若是item有换行则align-cnotent属性值有效,当flex-direction是clolumn时,若是item有换列,则align-content有效,其中属性值能够取flex-start/flex-end/center/space-around/space-between/stretch
注意:justify-content是用于控制属于不一样的主轴线(能够想象为平行与主轴线)的元素在侧轴方向的的排列方式,其属性值包含space-around/space-between,没有stretch,而align-items是用于控制单个元素在侧轴方向的摆放的,其属性值包含stretch,不含space-around/space-between,align-content则用于控制当同一个侧轴有多个元素时,这些元素之间的摆放方式,它们便可取space-around/space-between,又可取stretch(当每个侧轴都只穿过一个元素时(即没有多个主轴线,没换行/列),该属性失效)
以flex-direction:row时为例,当item有多行时,align-content和align-items是同时有效的,align-content控制行于行之间的排列关系,align-items控制元素在一行中的位置,能够看下如下例子:
html和css部分以下:
<div class="outer">
<div>item1</div>
<div>item2</div>
<div>item3</div>
<div>item4</div>
</div>
.outer{
display:flex;
border:1px solid red;
height:300px;
align-items:center;
flex-wrap:wrap;
align-content:flex-end;
}
.outer div{
width:200px;
border:1px solid black;
}
.outer div:nth-child(1){
height:200px;
}
复制代码
效果以下所示:
能够看到,如今item1和item2是处于一行的,item3和item4是处于一行的,因为align-content是flex-end,因此全部行依次排列在侧轴的终点处,同时因为align-items为center,因此item2处于它所在行的垂直方向的中点处(原来并不是相对于它的父元素垂直居中,而是相对于它所在的行垂直居中)
接下来,再看一下把align-items:center去掉的效果
如图5所示,和刚才不一样的是,item2在没有指定高度的状况下自动拉伸为什么item1的高度(指定了200px)同样了,其实仍是由于align-items的效果,它虽然没有显示指定,但它的默认值是stretch,因此在它所处的行中在垂直方向自动拉伸了。
因此,当align-content有效时,不要觉得align-items就无效了,只是它们的做用不一样而已,一个控制不一样行元素相对于父元素(flex-container)的排列方式,一个用于控制元素在所处行中的垂直方向的位置(这里指的flex-direction为row,flex-direction为column时请自行推算~)
用于控制当主轴方向空间过多时,元素在主轴方向的长度自动增长;若是多个元素同时指定了flex-grow,则多余的空间
会按照各自flex-grow值的比例自动分配
默认值:0
当主轴方向空间不够时,使元素在主轴方向的长度自动收缩(即便为元素项设置了显示宽度width值,依然会根据须要自动收缩,不一样于以前container中的align-items属性值stretch会低于height的优先级),以使得总长度可以适应container的长度(当应用了flex-wrap:wrap时,通常是不会自动收缩的,由于这时候自动换行/列了,不会空间不够)
默认值:1
flex-shrink的概念已经明了,看上去功能比较单一,不过不一样的属性值之间的搭配仍是会带来不少样化得效果的,尤为是这里就来看一下flex-shrink和flex-wrap的配合使用。
下面看一下flex-shrink为0而且container没有设置flex-wrap属性时的效果:
html和css以下:
<div class="outer">
<div>item1</div>
<div>item2</div>
<div>item3</div>
<div>item4</div>
</div>
.outer{
display:flex;
border:1px solid red;
height:300px;
align-content:flex-end;
}
.outer div{
width:150px;
border:1px solid black;
flex-shrink:0;
}
.outer div:nth-child(1){
height:200px;
}
.outer div:nth-child(2){
}
复制代码
如上图所示,当设置item的flex-shrink为0时,说明子元素项不会自动收缩,形成的结果就是全部元素项按自身本来的尺寸依次排列,可能会有主轴上总长度超出container在该放向的长度的可能。
接下来,将css中设置的flex-shrink:0去掉(等同于设置了flex-shrink:1,由于这是默认值),此时效果以下:
如上图所示,此时,各子元素项的宽度(在主轴方向的长度)明显收缩了(小于为其设置的width:150px),这就是由于默认的flex-shrink:1使得超出的部分均分在了全部子元素项的宽度上。
最后,再为container添加flex-wrap:wrap看下是否又会有什么不一样呢?
如图8所示,此时子元素项懂得在合适的位置自动换行了,所以也就不存在宽度超出父元素宽度范围的状况了,因此即便设置了flex-shrink也不会出现长度收缩了~
咱们都知道为container设置了display:flex后,子元素项的宽度正是刚好包裹自身内容的宽度,至关因而自动的,设置flex-basis后则相似于设置了width值,能够显示指定宽度,取值能够为绝对单位或是百分比(可用于栅格效果)
默认值:auto
flex属性即为flex-grow,flex-shrink,flex-basis三个属性的缩写
order用于指定子元素项在兄弟元素中排列的顺序,应用该属性能够简单的实现双飞翼布局
align-self指定元素自身在侧轴上的对齐方式,能够用来覆盖align-items属性的值对自身设置的效果
。
如图9所示,当align-items为stretch,item1的align-slef为center时,除item1外的全部元素在侧轴方向的对齐方式都是自动延伸的,而item1元素由于应用了align-slef:center,明显是垂直居中的。
想了解不一样布局的flex实现方式的话,请戳进一步了解flex布局—来实现这些常见布局吧~