CSS等比例劃分,在CSS布局中是比較重要的,下面分享幾種常用方法和探討一下相容性。
一:浮動布局+百分比
代碼如下 |
複製代碼 |
emmet html代碼:ul.float-ul>li*5>.con>h3{等分標題}+p{等分內容等分內容} .float-ul{width: 100%; overflow: hidden; zoom: 1;} .float-ul li{float: left; width: 20%;}
|
該樣式相容性較好,但是無法實現當裡面的列增多時比例也隨著變化,必須手動修改,當然你也可以使用一個js來調整了。
二:行內元素(inline-block)+百分比
參考之前寫過的inline-block替換float的代碼,使用該樣式還可以實現布局置中等區塊層級元素所具有的特性。
代碼如下 |
複製代碼 |
.inline-ul{font-size: 0; *word-spacing: -1px;} .inline-ul li{display: inline-block; *display: inline; *zoom: 1; font-size: 14px; vertical-align: top; word-spacing: normal; letter-spacing: normal; width: 20%;} @media screen and (-webkit-min-device-pixel-ratio:0){ .inline-ul{letter-spacing: -5px;} }
|
三:display:table + display:table-cell
我們知道表格可以根據內容進行劃分,CSS也有一個樣式是display:table來實作類別似表格的布局,不過不支援IE8以下瀏覽器。
代碼如下 |
複製代碼 |
.table-cell{display: table; width: 100%;} .table-cell li{display: table-cell;}
|
四:使用css3 display:flex.
舊文法:
代碼如下 |
複製代碼 |
.flex-ul{display: -webkit-box; display: box;} .flex-ul li{-webkit-box-flex:1; box-flex:1;} 新文法: .flex-ul{display:-webkit-flex; display: flex; width: 100%;} .flex-ul li{-webkit-flex:1; flex:1;} |
該方法只適用於進階瀏覽器,IE10以下的還是算了。具體介紹
五:使用柵格化系統
例如Bootstrap的柵格化系統
代碼如下 |
複製代碼 |
<div class="container"> <div class="row"> <div class="col-md-3"></div> ... </div> </div> .col-md-3 { float:left; } @media (min-width: 992px) { .col-md-3 { width: 25%; } /* 父級容器的3/12 */ }
|
缺點和第一個的float一樣,需要根據列數來跳出寬度調整。
例子
代碼如下 |
複製代碼 |
<style type="text/css"> ul{list-style: none; margin: 0; padding: 0;} .float-ul{width: 100%; overflow: hidden; zoom: 1;} .float-ul li{float: left; width: 20%;} .inline-ul{font-size: 0; *word-spacing: -1px;} .inline-ul li{display: inline-block; *display: inline; *zoom: 1; font-size: 14px; vertical-align: top; word-spacing: normal; letter-spacing: normal; width: 20%;} @media screen and (-webkit-min-device-pixel-ratio:0){ .inline-ul{letter-spacing: -5px;} } .table-cell{display: table; width: 100%;} .table-cell li{display: table-cell;} .flex-ul{display:-webkit-flex; display: flex; width: 100%;} .flex-ul li{-webkit-flex:1; flex:1;} /*.flex-ul{display: -webkit-box; display: box;} .flex-ul li{-webkit-box-flex:1; box-flex:1;}*/ </style> </head> <body> ul.float-ul>li*5>.con>h3{等分標題}+p{等分內容等分內容} <h2>浮動+百分比</h2> <ul class="float-ul"> <li> <div class="con"> <h3>等分標題</h3> <p>等分內容等分內容</p> </div> </li> <li> <div class="con"> <h3>等分標題</h3> <p>等分內容等分內容</p> </div> </li> <li> <div class="con"> <h3>等分標題</h3> <p>等分內容等分內容</p> </div> </li> <li> <div class="con"> <h3>等分標題</h3> <p>等分內容等分內容</p> </div> </li> <li> <div class="con"> <h3>等分標題</h3> <p>等分內容等分內容</p> </div> </li> </ul> <h2>inline-block + 百分比</h2> <ul class="inline-ul"> <li> <div class="con"> <h3>等分標題</h3> <p>等分內容等分內容</p> </div> </li> <li> <div class="con"> <h3>等分標題</h3> <p>等分內容等分內容</p> </div> </li> <li> <div class="con"> <h3>等分標題</h3> <p>等分內容等分內容</p> </div> </li> <li> <div class="con"> <h3>等分標題</h3> <p>等分內容等分內容</p> </div> </li> <li> <div class="con"> <h3>等分標題</h3> <p>等分內容等分內容</p> </div> </li> </ul> <h2>table+table-cell</h2> <ul class="table-cell J_equalList"> <li> <div class="con"> <h3>等分標題</h3> <p>等分內容等分內容</p> </div> </li> <li> <div class="con"> <h3>等分標題</h3> <p>等分內容等分內容</p> </div> </li> <li> <div class="con"> <h3>等分標題</h3> <p>等分內容等分內容</p> </div> </li> <li> <div class="con"> <h3>等分標題</h3> <p>等分內容等分內容</p> </div> </li> <li> <div class="con"> <h3>等分標題</h3> <p>等分內容等分內容</p> </div> </li> </ul> <h2>flex</h2> <ul class="flex-ul"> <li> <div class="con"> <h3>等分標題</h3> <p>等分內容等分內容</p> </div> </li> <li> <div class="con"> <h3>等分標題</h3> <p>等分內容等分內容</p> </div> </li> <li> <div class="con"> <h3>等分標題</h3> <p>等分內容等分內容</p> </div> </li> <li> <div class="con"> <h3>等分標題</h3> <p>等分內容等分內容</p> </div> </li> <li> <div class="con"> <h3>等分標題</h3> <p>等分內容等分內容</p> </div> </li> </ul> <script type="text/javascript"> window.onload = function(){ function setequal(cls){ var a = document.querySelectorAll(cls); for(var i = 0, l = a.length; i<l; i++){ var b = a[i]; var child = b.children; var c = child.length; for(var j = 0; j<c; i++){ child[i].style.width = '20%'; } } // var child = a.children; // for(var i = 0, l = child.length; i<l; i++){ // child[i].style.width = 100/l+"%"; // } } // setequal('.J_equalList'); } </script> |
上中下三行布局,上下定高,中間欄自適應瀏覽器高度,且內容垂直置中
代碼如下 |
複製代碼 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>上中下三行布局,上下定高,中間欄自適應瀏覽器高度,且內容垂直置中</title> <style type="text/css"> * { margin:0; padding:0; } html, body, #box { height:100%; font:small/1.5 "宋體", serif; } body { text-align:center; } #box { text-align:left; background:#666; display:table; width:80%; margin:0 auto; position:relative; } #box > div { display:table-row; } #header, #footer { background:#fcc; height:50px; } #main { background:#ccf; } #main #wrap { display:table-cell; background:#ffc; vertical-align:middle; } #text { text-align:center; } </style> <!--[if IE]> <style type="text/css"> #header, #footer { width:100%; z-index:3; position:absolute; } #footer { bottom:0; } #main { height:100%; z-index:1; position:relative; } #main #wrap { position:absolute; top:50%; width:100%; text-align:left; } #main #text { position:relative; width:100%; top:-50%; background:#ccc; } </style> <![endif]--> </head> <body> <div id="box"> <div id="header">header</div> <div id="main"> <div id="wrap"> <div id="text"> <p>內容內容</p> <p>內容內容</p> <p>內容內容</p> <p>內容內容</p> <p>內容內容</p> <p>內容內容</p> <p>內容內容</p> <p>內容內容</p> <p>內容內容</p> <p>內容內容</p> <p>內容內容</p> <p>內容內容</p> <p>內容內容</p> <p>內容內容</p> </div> </div> </div> <div id="footer">footer</div> </div> </body> </html> |
總結:
如果需要相容IE6-IE7的,如果列數固定可以使用第一種和第二種。如果列數不固定,可以加少量js支援。
如果是只考慮移動的,考慮第三種,相容性比下面的flex支援的比較好。
如果單純的不考慮低版本瀏覽器的,可以考慮使用第四種。