接触H5项目后,开始了解到flex布局,功能很是之强大,用起来至关之舒服。基本的知识介绍就不说了,参考http://www.ruanyifeng.com/blo...。css
接下来讲说我踩过的那些坑:html
1.flex布局版本兼容问题web
flex布局自2009提出以后,变化过好几个版本:浏览器
**2009** version 标志:**display: box**; **2011** version 标志:**display: flexbox**; **2012** version 标志:**display: flex/inline-flex**; 2014 version 新增了对flex项z-index的规定 2015 W3C Editor’s Draft (草案阶段)
兼容方案:
父级flex布局布局
display: -webkit-box; /* OLD - iOS 6-, Safari 3.1-6 */ display: -moz-box; /* OLD - Firefox 19- H5不用考虑 */ display: -mz-flexbox; /* TWEENER IE 10 */ display: flex; /* NEW, Spec - Opera 12.1, Firefox 20+ */
其余属性都对应相关的版本方案,目前项目中是只写最新的方案,由autoprefixer自动添加兼容方案。flex
2.关于flex-grow的宽度分配问题ui
flex-grow属性用于设置或检索弹性盒的扩展比率,默认为0。不容许为负值。
最为常见的用法是用flex-grow实现等比例“tab”布局,举例:flexbox
<div class="box"> <span class="item">元素</span> <span class="item">元素</span> <span class="item">元素</span> <span class="item">元素</span> <div class="item">元素</div> <div class="item">元素</div> </div>
css:spa
.box { display: flex; align-items: center; padding: 40px 20px; color: white; background-color: black; } .item { flex-grow: 1; height: 60px; line-height: 60px; text-align: center; border: 1px solid white; background-color: #ff0000; }
不用惧怕浮动,不用考虑子元素是块级元素仍是行内元素,显示OK,无论外面flex父级宽度如何变化,它们都等比分布:code
纠正一下本身错误的理解,flex-grow是分配flex容器除内容外剩余空间的比例,并非整个容器的比例[捂脸],因此出现下面的现象是彻底正常的,虽然解决方案可行,但我依然不懂其中的原因,再次[捂脸]。。。
氮素,“意外”来了:
好奇怪,怎么不是等比例显示?你们flex-grow都是1,为何你要占那么宽?
最后找到解决方案,全部flex-grow的子元素加上flex-basis: 0%;就是彻底等比分布了,这个属性值会让父级主轴在计算剩余空间时忽略子元素的自己宽度,从而实现等比分配。简单写法就是直接定义flex: 1;不分开定义三个属性。固然若是是那种连串的英文就要设置word-break: break-all;。
3.设置了flex-grow元素的子级宽度问题
来,栗子:
<div class="box"> <span class="other">Hi</span> <div class="item"> <div class="text"> 一个flex-grow为1的元素的子级一个flex-grow为1的元素的子级一个flex-grow 为1的元素的子级一个flex-grow为1的元素的子级 </div> </div> </div>
css:
.box { display: flex; align-items: center; padding: 40px 20px; color: white; background-color: black; } .item { flex-grow: 1; width: 100%; height: 60px; line-height: 60px; text-align: center; background-color: #ff0000; } .text { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .other { flex-shrink: 0; display: inline-block; width: 150px; height: 60px; line-height: 60px; background-color: orange; }
大跌眼镜的事就这么发生了,flex-grow元素的子级竟然撑破了父级的宽度,超出去了,不知道该怎么解释这种现象:
解决方案就是,flex-grow元素设置overflow: hidden;效果:
最后一个小坑,算不上坑,就是父级设置了flex布局后,子元素就算是行内元素不少浏览器能够把它当作inline-block或者block元素来用,能够直接设置它的宽高,可是仍是有些浏览器不支持,因此要设置行内元素的宽度,仍是手动设置一下它的display为inline-block或者block.
flex布局很是好用,就是PC兼容性相对较差,IE要10,甚至11以上才有很好的兼容,不过你们能够用它在H5页面好好发挥。