css:弹性布局box和flex总结

以前在做项目的时候,涉及到弹性布局的时候,通常用display:-webkit-box,后来看到还有display:flex,研究了一下,发现还是有区别的。

浏览器兼容问题

box布局的兼容性

box是2009年提出来的,是旧版的写法。

在w3school关于css的参考手册中提到:

目前没有浏览器支持 box-align 属性。
Firefox 支持替代的 -moz-box-align 属性。
Safari、Opera 以及 Chrome 支持替代的 -webkit-box-align 属性。

但经过测试,Firefox中使用-webkit-box,-webkit-box-flex等属性,也是可以正确解析的。

而反之,在chrome,opera等浏览器使用-moz-box却解析不出来,可以说-moz-前缀是firefox专用的。

因此,应当尽量使用-webkit-前缀,当然可以两个都加。如果同时加,建议将-webkit-写在前面以利于渲染。

ie-edge支持-webkit-box,但ie11及以下都不支持

另外根据之前使用的经验,目前的手机浏览器包括android和ios平台均-webkit-box

flex布局兼容性

flex布局标准是2012年提出来的,相比之下,现代浏览器对flex的支持度更高。不用写-webkit-等前缀都基本上能解析。

包括ie11,ie-edge,safari,opera,chrome都能很好地支持这个布局。

综上所述,弹性布局在使用时应该以flex为主。如果要兼容老版本的web或手机浏览器,再加入-webkit-box,-moz-box等兼容代码。
而如果要兼容ie10,ie11,那就只能用flex布局了。

关于flex和box布局的详细使用,可以参考相关文档:

box

https://www.cnblogs.com/jr1993/p/4751410.html

flex

http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html

http://blog.csdn.net/magneto7/article/details/70854472

这里我主要做一下对比,以便记忆。

box与flex

两种布局的思想基本上是一致的,只是flex又增加了一些属性:

都需要通过设置容器和子元素的样式,两者相互配合。

容器有主轴和交叉轴,都可设置横排和纵排。两个轴方向上都提供了居中和两边对齐,两端对齐,基线对齐。但flex的容器增加了align-content的属性,能实现多行对齐。


css:弹性布局box和flex总结_第1张图片
![QQ截图20180126172324.png](http://upload-images.jianshu.io/upload_images/4581697-1a88e8a63ca6cc17.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

子元素上都能设置放大的比例,都能自定义顺序。但flex增加了按比例缩小的flex-shrink属性,还有元素单独对其的align-self属性。还有控制子元素占据空间的flex-basis属性。


css:弹性布局box和flex总结_第2张图片
QQ截图20180126172324.png

一些难点:

什么是基线对齐?

基线对齐,其实就是每个子元素第一行文本下方的底线。将首行文本对齐后,整体往上移,直到有一个子元素碰到边界,确定下来的位置,就是基线的位置。

flex是flex-grow,flex-shrink,flex-basis的简写,当两个和三个一起用时,怎么理解它们的关系?

在box布局中,要么子元素宽是固定的,要么是可扩展的,二选一,但flex布局可以不这么干。flex-basis给子元素定义了一个原始的宽度值。如果这些宽度值加起来刚好是容器的宽,没有剩余,那么flex-grow和flex-shrink可以理解为没有起作用。flex-grow是定义如果宽度有多,能分到的比例。flex-shrink定义了如果宽度不够,应该减去的比例(这个比例是相对于多了或少了的总宽度,而不是元素本身的宽度)。

例如

  .con{
    width:100%;
    height:100px;
    width:400px;
    display:flex;
  flex-direction: row;
background-color: #f0f0f0;
  }
  .t{
    height:100%;
  }
1sd
2fe
3fd
4se

容器.con宽度为400,4个子元素的flex-basis都是50,加起来应该有50*4=200px,剩余200px宽度,4个元素的flex-grow分别是2,1,1,1,所以分到的宽度为80px,40px,40px,40px, 所以第一个元素为50+80=130px,其余为90px.


css:弹性布局box和flex总结_第3张图片
QQ截图20180126173303.png

同理,如果4个flex-basis都是150px,加起来有150*4=600px, 多处了200px,需要压缩宽度。4个元素的flex-shrink分别是2,1,1,1,分别需要压缩80px,40px,40px,40px,所以第一个元素为150-80=70px,其余为110px


css:弹性布局box和flex总结_第4张图片
QQ截图20180126173355.png

怎么理解flex-flow?
flex-flow是flex-direction和,flex-wrap的简写。可以理解为子元素向哪个轴方向流动(flex-direction),流动到末尾向哪个方向换行(flex-wrap)

关于flex伸缩

1sd
2fe大幅缩水的粉丝的粉丝的
3fd
4se

如果增加其中一个子元素字符串的长度,并且没有使用word-break:all. 该子元素会被撑开,其它子元素则会收缩。至于撑开后尺寸怎么计算,比上面提到的要复杂。有谁知道的请留言。


css:弹性布局box和flex总结_第5张图片
QQ截图20180126173423.png

如果使用word-break:all 换行,则不会出现该情况。


css:弹性布局box和flex总结_第6张图片
QQ截图20180126173501.png

如果子元素同时定义了width,flex-grow,flex-shrink,当flex-grow或flex-shrink符合应用条件,width会不起作用。

你可能感兴趣的:(css:弹性布局box和flex总结)