by zhangxinxu from http://www.zhangxinxu.com
本文地址:http://www.zhangxinxu.com/wordpress/?p=1338css
昨天趁着不想工做的时间间隙闲逛24ways,在My CSS Wish List一 文中,见到了个新鲜的CSS属性,就是题目中的box-flex,之前没有见过,顿生疑惑,不知是骡子仍是马,因而习惯性谷歌之,真是不谷不知道,一谷吓 一跳。倒不是该属性自己,而是此属性做为导火索,让我了解了下CSS3中新的盒子模型——弹性盒子模型(Flexible Box Model)。对于我这样的流体布局控而言,这种盒子模型的出现就比如打麻将杠上开花杠到绝张边七条,让人兴奋不已。在国外,弹性盒子模型早在去年就开始 被说起,研究,与应用。然而,本身如今才第一次听到此概念,真是一不留神就out了,学习这东西,果真松懈不得。html
本文内容叙述撇开以往顺流而下的方式,直接以box-flex属性为切入口,直入大本营,再铺开叙述。css3
有道桌面词典显示,”flex”一词中文有“收缩”之意。不过,今后属性实际上产生的效果来看,不管怎样用“收缩”一词解释都显得很牵强。因此,这 里,直接抛开字面意思,咱们能够将”box-flex”理解为”房子-分配”。box为“盒子”的意思,咱们能够理解为当下价格巨高的“房 子”,”flex”指兄弟几个“分配房子”。web
举个更实际点的例子:马林大叔省吃俭用一生,终于在上海郊外买了间150平米的商品房。后来,马林大叔想回老家养老,决定把房子分配给他的三个儿 子。ok,先暂停下,这里提到的“房子”就是”box-flex”中的”box”,“分配”就是”box-flex”中的”flex”,因而,这个“分配 房子”的举动就称为”box-flex”,而box-flex属性的值就是说的如何分配,分配比例是什么。oK,继续咱们的例子,马林大叔的三个儿子分别 叫作大马,中马和小马,其中大马已经结婚多年,有一堆双胞胎女儿,拖家带口的人多;而中马和小马是优秀的光棍人士。因此,大马要求分配更多的房子,最终, 家人一番协商有了下面的分配结果,就是:浏览器
#大马 { 房子-分配: 2; } #中马 { 房子-分配: 1; } #小马 { 房子-分配: 1; }
我想,上面的分配应该很容易看懂的。房子分红了总共4份,其中有家室的大马分得其中的两份,而为国家省橡胶的中马和小马每人分得其中一份,因而用数值换算就是:
大马 = 150 * (2 / (2+1+1)) = 75(平米);
中马 = 150 * (1 / (2+1+1)) = 37.5(平米);
小马 = 150 * (1 / (2+1+1)) = 37.5(平米);wordpress
若是装换成CSS表示就是:布局
#first_boy { box-flex: 2; } #second_boy { box-flex: 1; } #three_boy { box-flex: 1; }
哇咔咔,box-flex的含义与做用理解瞬间柳暗花明:用来按比例分配父标签的宽度(或高度)空间。学习
box-flex的值为至少为1的整数时起做用。可是,仅仅一个box-flex属性是不足以实现子元素间的空间分配,由于还要看其老爸的意思。所谓,我爸是李刚,撞人很嚣张;恨爸不是刚,撞人心慌慌。只有老爸开口说:“这个房子如今大家随意分配。”其子女才能分配。测试
因此,父元素也是须要添加必要的声明的。此声明就是:flex
#father { display: box; }
彷佛也能够是:
#father { display: inline-box; }
此声明好像是在说:孩子们,如今我把这个房子变成了可随意分配状态,非固定财产,大家能够本身协商分配了。
display: box;
的声明其实就是弹性盒子模型的声明,此声明下的子元素的行为与表现与CSS2中的传统盒子模型的表现是有显著的差别的。
毕竟属于CSS3的东西,目前而言,仅Firefox/Chrome/Safari浏览器支持弹性盒子模型(IE9不详,Opera还没有),且使用的时候,须要附带私有前缀。就是诸如-moz-, -webkit-之类。
CSS实例
如今把上面的马林分房子的例子CSS实例化,看看在web页面上是个如何的表现://zxx:有把小说拍成电影的感受,
主要CSS代码以下:
.test_box { display: -moz-box; display: -webkit-box; display: box; ... } .list { ... } .list_one { -moz-box-flex: 1; -webkit-box-flex: 1; box-flex: 1; } .list_two{ -moz-box-flex: 2; -webkit-box-flex: 2; box-flex: 2; }
HTML代码以下:
<div class="test_box"> <div class="list list_two">1</div> <div class="list list_one">2</div> <div class="list list_one">3</div> </div>
结果以下缩略图:
从上图能够看去,老大大马确实分配到了2份的房子空间,而中马和小马均分到了一份房子空间。
您能够狠狠地点击这里:box-flex弹性布局测试demo
继续上面马林大叔分房的例子。本来兄弟三人和和气睦是一点问题都没有的,房子怎么分也基本都定下来了。然而,忽然,事情起了波澜。老三小马忽然有了 个彪悍的女友,叫阿凤。小马本人对分配房子的大小是以为无所谓的,即便两我的住,近40平米的屋子也足够了,何须为了这点事情伤了兄弟们间的和睦。然 而,小马的女朋友阿凤倒是个吃不了亏的人,说什么也要争口气,因而,找来大马中马,强烈要求要加大他们房子的分配面积。
在大马,中马看来,阿凤还属于外来人,凭什么对他们兄弟的房子指手划脚,因而,没得妥协,因而,争执不断,因而,愈演愈烈,因而,不可开交。因而, 有天,阿凤实在憋不住了,在厨房作菜的时候忽然拿着菜刀跑出来,大声咆哮:“无论怎样,反正我家小马至少要50平米的房子,其他的怎么分是大家的事情,我 无论,这是个人底线了,再低就没得商量!!”大马等被这架势吓住了,最终仍是妥协了:小马就50平米(即便之后房子扩建仍是50平米),剩下的面积大马, 中马2:1比例再分配。因而就有:
#大马 { 房子-分配: 2; } #中马 { 房子-分配: 1; } #小马 { 房子-分配: 50m2; }
改编成CSS剧本就是:
#first_boy { box-flex: 2; } #second_boy { box-flex: 1; } #three_boy { width: 50px; }
仍是不难理解,当子元素中有宽度值的时候,此元素就定宽处理,剩下的空间再按比例分配。
因而,此时,大马的房子大小是:(150 – 50) * (2 / (1 + 2)) = 66.7平米,中马分配房子大小是:(150 – 50) * (1 / (1 + 2)) = 33.3平米。
仍是相似上面的demo,看看含有定宽元素的子元素是如何表现的。
新增CSS样式以下:
.list_w300 { width: 300px; }
HTML代码以下:
<div class="test_box"> <div class="list list_two">1</div> <div class="list list_one">2</div> <div class="list list_w300">3</div> </div>
结果以下缩略图:
老三分得300像素的宽度,剩下的500像素宽度老大和老二2:1比例分配。
您能够狠狠地点击这里:含定宽元素弹性布局demo
然而,事情尚未结束。兄弟几个相处了一段时间后发现,偌大的屋子若是所有都是私有的话,会有诸多生活上的不便。因此,须要腾出些公共空间,给屋子透个气。咋办呢,老三小马的女朋友阿凤死活不妥协,没有办法,老马和中马只能牺牲本身的住所面积做为公共空间了。
反应到CSS上,大体就是增长了margin间距,以下HTML:
<div class="test_box"> <div class="list list_two">1</div> <div class="list list_one" style="margin:0 30px;">2</div> <div class="list list_w300">3</div> </div>
结果以下缩略图:
老大,老二的空间同时被压榨了,老大还好,本来比例高。只是可怜了二当家的,地方愈来愈小。不过,老二的隐忍换来了和气,所作的牺牲没有白费。
语言小知识:“厉害”用日语说的话,动漫里面常常用的比较文雅的就是“すごい”,如今年轻人经常使用的就是“スゲ”,还有一种说法“よくできるね”是一种称赞的说法,语气比较柔和。
弹性盒子模型下的爸爸(父标签)实际上是颇有货的,男人嘛,就应该这样,够沉稳够内涵。
爸爸肚子中的货有:box-orient, box-direction, box-align, box-pack, box-lines. 如今依次讲讲这里box打头的属性都是干吗用的。
box-orient
box-orient用来肯定子元素的方向。是横着排仍是竖着走。可选的值有:
horizontal | vertical | inline-axis | block-axis | inherit
其中,inline-axis是默认值。且horizontal与inline-axis的表现彷佛一致的,让子元素横排;而vertical与block-axis的表现也是一致的,让元素纵列。
我专门作了个demo页面,方便您查看各个值的行为与表现。您能够狠狠地点击这里:box-orient值做用测试页面
切换demo页面左边的单选选项卡(若是您的浏览器为Firefox/Chrome/Safari),就能够看到不一样的box-orient属性值的行为表现了。//zxx:对比能够发现,Firefox下的display:box会收缩外框(有点display:inline-block的感受),而Chrome则没有收缩。
box-direction
box-direction是用来肯定子元素的排列顺序,可选值有:
normal | reverse | inherit
其中normal是默认值,表示按照正常顺序排列。所谓正常顺序,就是咱们看书写文字的顺序,从左往右,由上至下,先出现的元素,就上面或是左边。而reverse表示反转,本来从左往右应该是1-2-3的,结果显示确实3-2-1。
例如咱们将此属性应用在咱们一开始的分配房子的demo上的话,最后的显示就会以下缩略图——顺序反过来的:
相关CSS代码以下:
.test_box { display: -moz-box; display: -webkit-box; display: box; -moz-box-direction:reverse; -webkit-box-direction:reverse; box-direction:reverse; ... }
您能够狠狠地点击这里:列表顺序反转显示demo
box-align
box-align与box-pack都是决定盒子内部剩余空间怎么使用的。在行为效果上就是表现为“对齐”,这跟Adobe的软件中的一些“对齐”是一致的,例如化妆大师photoshop中的图层-对齐:
其中box-align决定了垂直方向上的空间利用,也就是垂直方向上的对齐表现。为了便于记忆,咱们能够拿来和CSS2中的vertical-align隐射记忆,二者都有”align”,都是都是垂直方向的对齐;而剩下的box-pack就是水平方向的了。
box的可选参数有:
start | end | center | baseline | stretch
其中stretch为默认值,为拉伸,也就是父标签高度太高,其孩子元素的高度就多高,//zxx:之后等高布局不用愁了。start表示顶边对齐,end为底部对齐,center为居中对齐,baseline表示基线(英文字母o,m,n等的底边位置线)对齐。
为了直观的知道各个值的效果,我作了个可实时查看效果的demo,您能够狠狠地点击这里:css box-align各值效果demo
点击demo左边的单选按钮组,便可查看各个属性值的效果。
例如,选中”center”这个单选按钮,结果右侧的显示以下面的截图:
其余各个属性值的效果您能够本身点击查看(非IE浏览器),这里就不一一展现效果截图了。
box-pack
box-pack决定了父标签水平遗留空间的使用,其可选值有:
start | end | center | justify
就大部分的行为表现来讲分别对应text-align属性的值:left | right | center | justify;可是,之因此box-pack不使用”left”, 而是”start”,是由于box-direction属性,这玩意能够反转本来的排列,本来的“左对齐”反转后结果是“右对齐”了,此时”left”显 然就词不达意了,因此使用”start”更具备归纳性,就是与父标签的起始位置对齐,从而不会产生语义与行为上的困扰。
其中”start”是box-pack属性的默认值,justify表示两端对齐。
为了方便直观的查看各个属性值的效果,我制做了与上面相似风格的demo,您能够狠狠地点击这里:box-pack属性值效果demo
下为选中end的界面截图缩略图:
貌似发如今Firefox浏览器下,justify是没有反应的,可能还未支持。Chrome浏览器表现良好。
box-lines
box-lines是用来决定子元素是能够换行显示呢?仍是就算挤出油仍是单行显示。两个可选值:
single | multiple
其中single是默认值,表示死活不换行,以下图所示:
设置box-lines:multiple后,就多行显示了。不过我本身测试了下,貌似如今不管是Firefox浏览器仍是Chrome都不认识box-lines:multiple属性,是暂不支持呢,仍是什么什么?
您能够狠狠地点击这里:看不到换行效果的demo
子元素除了box-flex属性,还有两个属性,box-flex-group和box-ordinal-group,其中box-flex- group的做用不详,貌似目前浏览器也不支持;box-ordinal-group的做用是拉帮结派。仍是上面马林大叔分房子的例子。小马女朋友阿凤又不 消停,眼瞅着大马的房子面积比本身大好多,内心不平衡,因而,就去拉拢中马,一块儿打大马房子的主意。这个“拉拢”就是这里的box-ordinal- group,拉拢的组织团伙是有一个数字级别的,决定了你这个组织的位置。
数值越小,位置就越靠前,这不难理解,第一组在最前嘛,随后第二组,第三组… 例如:box-ordinal-group:1的组就会在box-ordinal-group:2的组前面显示。因而,咱们能够利用这个属性改变子元素的顺序。例以下面这个例子:
HTML代码以下:
<div class="test_box"> <div class="list list_two">1</div> <div class="list list_one">2</div> <div class="list list_one">3</div> </div>
相关CSS以下:
.list_one { ... -moz-box-ordinal-group: 1; -webkit-box-ordinal-group: 1; box-ordinal-group: 1; } .list_two{ ... -moz-box-ordinal-group: 2; -webkit-box-ordinal-group: 2; box-ordinal-group: 2; }
结果后面两个class为”list_one”的元素跑到前面去了。以下图所示:
您能够狠狠地点击这里:box-ordinal-group分组改序demo
若是您如今浏览器地址栏中的地址中含有”www.zhangxinxu.com”字样,而且浏览器为较新的Firefox/Chrome/Safari浏览器,那么您就能够在本页面上找到我作的应用。
咔咔,我就不卖卖关子了,我改变了相关文章某一处的显示顺序,就是随机文章。
可是在本文所在的页面上,随机文章第一个显示了(因为赞不支持换行,故垂直显示了)。
相关CSS代码以下:
.similarity ul{display:-moz-box; display:-webkit-box; display:box; -moz-box-orient:vertical; -webkit-box-orient:vertical; -o-box-orient:vertical; box-orient:vertical; } .similarity ul li{-moz-box-flex:1; -webkit-box-flex:1; box-flex:1; -moz-box-ordinal-group:2; -webkit-box-ordinal-group:2; box-ordinal-group:2;} .similarity ul li:last-child{-moz-box-ordinal-group:1; -webkit-box-ordinal-group:1; box-ordinal-group:1; }
原创文章,转载请注明来自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com]
本文地址:http://www.zhangxinxu.com/wordpress/?p=1338