一、背景介绍
布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现. 2009年,W3C提出了一种新的方案----Flex布局,可以简便、完整、响应式地实现各种页面布局。现在的版本是2012年更新的版本,目前,它已经得到了所有浏览器的支持,但是考虑历史版本,在PC上兼容性一般,但是在手机上则可以从容使用。
二、知识剖析
1、Flex布局是什么?
Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。 任何一个容器都可以指定为Flex布局,行内元素也可以使用Flex布局。注意,设为Flex布局以后,子元素的float、clear和vertical-align属性将失效。
2、基本概念
采用Flex布局的元素,称为Flex容器(flex container),简称"容器"。它的所有子元素自动成为容器成员,称为Flex项目(flex item),简称"项目"。
容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end。项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。
3. 父级属性
flex:direction 设置主轴方向,确定子元素主轴排列方式
row 默认值,水平方向左至右
row-reverse 水平方向右至左
column 垂直方向,上至下排列
column-reverse 垂直方向,下至上排列
flex-wrap 主轴宽度不够时是否换行显示
nowrap 默认值,不换行
wrap 换行显示
wrap-reverse 逆序换行显示
flex-flow 上2复合属性
justify-content 主轴上子元素对齐方式
center 居中对齐
flex-end 侧轴结束对齐
flex-start 侧轴开始对齐
space-around 均匀分布
space-between 两端对齐
align-items 侧轴子元素对齐方式
stretch 默认值,充满侧轴
baseline 项目的第一行文字的基线对齐
center 侧轴居中对齐
flex-end 侧轴结束对齐
flex-start 侧轴开始对齐
align-content 多轴对齐方式
stretch 默认值,充满侧轴
center 侧轴居中对齐
flex-start 侧轴开始对齐
flex-end 侧轴结束对齐
space-between 侧轴两端对齐
space-around 侧轴均匀分布
4、子级属性
order 子元素排列顺序,设置的值越小越靠前
flex-grow 子元素扩展比例,剩余宽度 * 占比值/总比值
flex-shrink 子元素收缩比例,默认值为1平均分配,溢出宽度 * 占比值/总比值
flex-basis 属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。
align-self align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。
三、常见问题
使用flex-grow等分宽度,当元素内部内容宽度大于最小宽度时,不能等分排列,甚至溢出?
四、解决方案
设置width:100%;且overflow:hidden;
五、编码实战
2016百度前端学院有一个flex布局练习题
代码:
编码实战
.box{
display: flex;
max-width: 800px;
width: 80%;
margin: 0 auto;
padding: 20px;
border: 1px solid gray;
justify-content: space-between;
align-items: center;
}
.box1{
width: 150px;
height: 120px;
border: 1px solid #f00;
margin-bottom: 20px;
}
.box2{
width: 150px;
height: 100px;
border: 1px solid #f00;
margin-bottom: 20px;
}
.box3{
width: 150px;
height: 40px;
border: 1px solid #f00;
margin-bottom: 20px;
}
.box4{
width: 150px;
height: 200px;
border: 1px solid #0f0;
margin-bottom: 20px;
}
@media all and (max-width: 640px){
.box{
flex-wrap: wrap;
align-items: flex-start;
}
.box4{
display: flex;
order: -1;
}
}
六、拓展思考
flex布局可以应用到那些场景?
一般实现垂直居中是一件很麻烦的事,但flex布局轻松解决
display:flex;
justify-content: center;
align-items: center;
另外响应式布局应用flex布局也相当方便
flex兼容性写法
由于flex布局提出时间晚,且经过多次改变,所以需要用兼容写法以兼容更多版本的浏览器,当然各大主流浏览器最新版本现已不需要兼容写法。
display: -webkit-box; /* 老版本语法: Safari, iOS, Android browser, older WebKit browsers. */
display: -moz-box; /* 老版本语法: Firefox (buggy) */
display: -ms-flexbox; /* 混合版本语法: IE 10 */
display: -webkit-flex; /* 新版本语法: Chrome 21+ */
display: flex; /* 新版本语法: Opera 12.1, Firefox 22+ */
子元素兼容写法
-webkit-box-flex: 1 /* OLD - iOS 6-, Safari 3.1-6 */
-moz-box-flex: 1; /* OLD - Firefox 19- */
-webkit-flex: 1; /* Chrome */
-ms-flex: 1 /* IE 10 */
flex: 1; /* NEW, Spec - Opera 12.1, Firefox 20+ */
七、参考文献
http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html
http://www.ruanyifeng.com/blog/2015/07/flex-examples.html
http://blog.csdn.net/u010130282/article/details/52627661
八、更多讨论
bootstrap与flex布局
http://www.oschina.net/translate/boostrap-4-regular-vs-flex-grid?cmp
Q1:兼容性如何
A1:ie兼容性不好(11部分支持),Edge14开始支持,其他内核基本都能完美支持
Q2:使用优点及应用地方
A2:布局更科学合理,相对原有的浮动布局,可以用很少的代码实现更完美的功能。基本任何地方都可以使用,特别在栅格布局,锤子居中等上面优势明显。
Q3:缺点是什么?
A3:IE兼容性不好,适用于不考虑IE兼容性的开发环境,总体来看,针对初级学员,flex可以熟悉掌握,但是学好其他兼容性布局方式仍然是基础。