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的属性,能实现多行对齐。


![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属性。


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%;
  }
<div class="con">
   <div class="t" style="background-color:blue;flex-basis: 50px;flex-grow: 2;flex-shrink: 2;"> 1sd</div>
   <div class="t" style="background-color:yellow;flex-basis: 50px;flex-grow:1;flex-shrink:1;">2fe</div>
   <div class="t" style="background-color:green;flex-basis: 50px;flex-grow:1;flex-shrink:1;">3fd</div>
   <div class="t" style="background-color:red;flex-basis: 50px;flex-grow:1;flex-shrink:1;">4se</div>
</div>

容器.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.


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


QQ截图20180126173355.png

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

关于flex伸缩

<div class="con">
   <div class="t" style="background-color:blue;flex-basis:50px; flex-grow:1;flex-shrink:1;"> 
     1sd
    </div>
   <div class="t"  style="background-color:yellow; flex-grow:1;flex-shrink:1;">
     2fe大幅缩水的粉丝的粉丝的
    </div>
   <div class="t"  style="background-color:green;flex-basis:50px; flex-grow:1;flex-shrink:1;">
     3fd
    </div>
   <div class="t"  style="background-color:red;flex-basis:50px; flex-grow:1;flex-shrink:1;">
     4se
    </div>
</div>

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


QQ截图20180126173423.png

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


QQ截图20180126173501.png

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,192评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,858评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,517评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,148评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,162评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,905评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,537评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,439评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,956评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,083评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,218评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,899评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,565评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,093评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,201评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,539评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,215评论 2 358

推荐阅读更多精彩内容