還記得盒模型嗎?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:
![](http://static.javashuo.com/static/loading.gif)
-webkit-box-orient:vertical:
![](http://static.javashuo.com/static/loading.gif)
屬性:由圖可看出此屬性表明着彈性盒模型對象的子元素的排列方式;取值有兩個,一個橫向,一個縱向。
完事開頭難,頭已經開完了,接下來的屬性就簡單地說;
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