还记得盒模型吗?css
除了盒模型以外css3为咱们提供了一个弹性模型,称之为自适应布局;html
接下来咱们看看怎么用。css3
首先,咱们须要清楚的是弹性布局有哪些优势,web
以下:浏览器
优势:
1 适应性强,在作不一样屏幕分辨率的界面时很是实用
2 能够随意按照宽度、比例划分元素的宽高
3 能够轻松改变元素的显示顺序
4 自适应布局实现快捷,易维护
理解弹性盒模型布局
到目前为止,咱们还不知道什么是弹性模型,弹性模型能干吗,别着急,咱们一点点来。测试
首先:flex
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <style type="text/css"> body,div,ul,li{ margin:0; padding:0; } body{ background: #d2b2ce; } ul{ width:400px; height:400px; background: #f0f0f0; margin:50px auto; } li{ list-style: none; padding:25px; } ul :nth-child(1){ background: #ccc; } ul :nth-child(2){ background: #999; } ul :nth-child(3){ background: #666; } ul :nth-child(4){ background: #333; } ul :nth-child(5){ background: #111; } </style> </head> <body> <ul> <li></li> <li></li> <li></li> <li></li> <li></li> </ul> </body> </html>
这是个人一个页面布局,毫无疑问,以上的布局样式以下图:spa
这是正常的盒模型布局方式。3d
接着咱们给ul填上一个属性:
display:box; //将对象做为弹性盒模型显示
以后咱们在看一下页面显示的布局样式:
看页面的话显然li的display属性由块属性变行属性了。
这只是个开始,display:box只是让ul变为弹性盒模型,接着还有不少更有意思的属性。
接下来咱们给ul属性添加以下css命令:
-webkit-box-orient: [horizontal | vertical] ;
horizontal //默认值 水平排列
vertical //纵向排列
-webkit-box-orient:horizontal:

-webkit-box-orient:vertical:

属性:由图可看出此属性表明着弹性盒模型对象的子元素的排列方式;取值有两个,一个横向,一个纵向。
完事开头难,头已经开完了,接下来的属性就简单地说;
box-pack: 弹性盒模型对象的子元素的对齐方式,换言之,子元素排列时从哪边起?
取值:
start:
设置弹性盒模型对象的子元素从开始位置对齐(大部分状况等同于左对齐) //默认值
center:
设置弹性盒模型对象的子元素居中对齐
end:
设置弹性盒模型对象的子元素从结束位置对齐(大部分状况等同于右对齐)
justify:
设置或弹性盒模型对象的子元素两端对齐
取值:
start:
设置弹性盒模型对象的子元素从开始位置对齐
center:
设置弹性盒模型对象的子元素居中对齐
end:
设置弹性盒模型对象的子元素从结束位置对齐
baseline:
设置弹性盒模型对象的子元素基线对齐
stretch:
设置弹性盒模型对象的子元素自适应父元素尺寸 //默认值
看着两个意思彷佛相同?那他们两个到底有什么区别呢?看图:
注明:此属性的排列方式与box-orient属性值有关。
如图所示, 以上四个图表明了box-orient与box-pack、box-orient与box-algin的关系及具体取值的排列方式。
属性:弹性盒模型对象的子元素如何分配其剩余空间。
取值:number;
具体实例:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <style type="text/css"> body,div,ul,li{ margin:0; padding:0; } body{ background: #d2b2ce; } ul{ width:400px; height:100px; background: #f0f0f0; margin:50px auto; display: -webkit-box; } li{ list-style: none; padding:25px; } ul :nth-child(1){ background: #ccc; } ul :nth-child(2){ background: #999; } ul :nth-child(3){ background: #666; } ul :nth-child(4){ background: #333; } ul :nth-child(5){ background: #111; } </style> </head> <body> <ul> <li></li> <li></li> <li></li> <li></li> <li></li> </ul> </body> </html>
此段代码再是没有作任何操做,显示如图:
其中,带背景色的五个块分别为5个li,而白色部分为ul的空白部分。此时用box-flex属性,
代码以下:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <style type="text/css"> body,div,ul,li{ margin:0; padding:0; } body{ background: #d2b2ce; } ul{ width:400px; height:100px; background: #ffffff; margin:50px auto; display: -webkit-box; } li{ list-style: none; padding:25px; } ul :nth-child(1){ background: #ccc; } ul :nth-child(2){ background: #999; -webkit-box-flex:1; } ul :nth-child(3){ background: #666; } ul :nth-child(4){ background: #333; -webkit-box-flex:1; } ul :nth-child(5){ background: #111; } </style> </head> <body> <ul> <li></li> <li></li> <li></li> <li></li> <li></li> </ul> </body> </html>
此时我给第二个及第四个li加上了box-flex的属性,页面变成:
显然第二个及第四个li的宽度增长了。增长的部分是 [ulWidth 400 - liWidth 50 * li.length 5 ]/ box-flex+(此父级标签下的全部的box-flex的属性值相加) 的值 ;
意思是我须要获得此父级元素(UL)剩余的空白宽度,而后除上 box-flex 份值 获得 一份box-flex 的值在按照具体的box-flex比例去分配 UL 的剩余空白宽度。
属性:弹性盒模型对象的子元素的显示顺序;
取值:用整数值来定义弹性盒模型对象的子元素显示顺序。
啥意思呢?意思就是说咱们能够经过这个属性给元素设置一个显示顺序。
看代码:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <style type="text/css"> body,div,ul,li{ margin:0; padding:0; } body{ background: #d2b2ce; } ul{ width:400px; height:100px; background: #ffffff; margin:50px auto; display: -webkit-box; } li{ list-style: none; width:50px; height:100px; text-align: center; line-height: 100px; font-size: 30px; color: #fff; } ul :nth-child(1){ background: #ccc; } ul :nth-child(2){ background: #999; -webkit-box-flex:1; } ul :nth-child(3){ background: #666; } ul :nth-child(4){ background: #333; -webkit-box-flex:1; } ul :nth-child(5){ background: #111; } </style> </head> <body> <ul> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> </ul> </body> </html>
这样的一页面显示出来的效果如图:
li很整齐的按照代码顺序排列出来。
以后我作了一些修改,我在每一个li中添加了box-ordinal-group这个属性,而且设一些值。
我作了如下调整:
ul :nth-child(1){ background: #ccc; -webkit-box-ordinal-group:5; } ul :nth-child(2){ background: #999; -webkit-box-flex:1; -webkit-box-ordinal-group:4; } ul :nth-child(3){ background: #666; -webkit-box-ordinal-group:3; } ul :nth-child(4){ background: #333; -webkit-box-flex:1; -webkit-box-ordinal-group:1; } ul :nth-child(5){ background: #111; -webkit-box-ordinal-group:2; }
设置的顺序是5 4 3 1 2 ,若是按照这个顺序显示li元素的话应该是 4 5 3 2 1.咱们看一下具体的实现是:
因此此属性理解起来就至关于给元素设置了一个显示顺序。
属性:弹性盒模型对象的子元素的排列顺序是否反转。
取值:
normal:
设置弹性盒模型对象的子元素按正常顺序排列
reverse:
反转弹性盒模型对象的子元素的排列顺序
此属性效果:
以上就是弹性盒模型涉及到的一些属性,还有一些属性因为用法不明确或兼容性问题 本文就暂不作介绍了。
特此声明:本文全部实例代码皆以webkit为基础,如用其余浏览器测试,请自主改下内核前缀。
参考资料:W3CHTML