頁面整體布局
1.單列布局
特征:定寬、水平居中
常見的單列布局有兩種:
1. header、content、footer寬度都相同,其一般不會占滿瀏覽器的最寬寬度,但當瀏覽器寬度縮小低於其最大寬度時,寬度會自適應。
<div class="layout"> <div id="header"></div> <div id="container"></div> <div id="footer"></div> </div>
對header、container、footer統一設置width或max-width,並通過margin:auto實現居中。
.layout{
/*width: 960px;*/
max-width: 960px;
margin: 0 auto;
}
2. header、footer寬度為瀏覽器寬度,但content以及header和footer里的內容卻不會占滿瀏覽器寬度。
<div id="header">
<div class="layout"></div>
</div>
<div id="container" class="layout"></div>
<div id="footer">
<div class="layout"></div>
</div>
header、footer的內容寬度為100%,但header、footer的內容區以及content統一設置max-width,並通過margin:auto實現居中。
.layout{
/*width: 960px;*/
max-width: 960px;
margin: 0 auto;
}
2.雙列與三列布局
雙列布局:
側欄固定寬度,主欄自適應寬度。
主要說說左側固定右側自適應的情況,其他情況可類推。
<div class="page"> <div class="side">我是綠色</div> <div class="main">我是藍色</div> </div> /*一般布局*/ .page { position: relative; } .side { position: absolute; left: 0; width: 300px; height: 550px; background: green; } .main { margin-left: 310px; height: 550px; background: blue; } /*flex布局*/ .page { display: flex; } .side { flex:0 0 300px; height: 550px; margin-right:10px; background: green; } .main { flex:1; height: 550px; background: blue; }
三列布局:
主要說說左右固定中間自適應的情況,其他情況可類推。
a. float+margin
原理說明:設置兩個側欄分別向左向右浮動,中間列通過外邊距給兩個側欄騰出空間,中間列的寬度根據瀏覽器窗口自適應。
布局步驟:
-
對兩邊側欄分別設置寬度,並對左側欄添加左浮動,對右側欄添加有浮動。
-
對主面板設置左右外邊距,margin-left的值為左側欄的寬度,margin-right的值為右側欄的寬度。
一些說明:
1. 注意DOM文檔的書寫順序,先寫兩側欄,再寫主面板。若更換,側欄會被擠到下一列。(聖杯布局和雙飛翼布局都會用到)。
2. 這種布局方式比較簡單明了,但缺點是渲染時先渲染了側邊欄,而不是比較重要的主面板。
<div id="content"> <div class="sub">sub</div> <div class="extra">extra</div> <div class="main">main</div> </div> .sub{ width: 100px; float: left; } .extra{ width: 200px; float: right; } .main{ margin-left: 100px; margin-right: 200px; }
b. position+margin
原理說明:通過絕對定位將兩個側欄固定,同樣通過外邊距給兩個側欄騰出空間,中間列自適應。
布局步驟:
-
對兩邊側欄分別設置寬度,設置定位方式為絕對定位。
-
設置兩側欄的top值都為0,設置左側欄的left值為0, 右側欄的right值為0。
-
對主面板設置左右外邊距,margin-left的值為左側欄的寬度,margin-right的值為右側欄的寬度。
一些說明:
1. 與上一種方法相比,本種方法是通過定位來實現側欄的位置固定。
2. 如果中間欄含有最小寬度限制,或是含有寬度的內部元素,則瀏覽器窗口小到一定程度,主面板與側欄會發生重疊。
<div id="content">
<div class="sub">sub</div>
<div class="main">main</div>
<div class="extra">extra</div>
</div>
.sub, .extra { position: absolute; top: 0; width: 200px; } .sub { left: 0; } .extra { right: 0; } .main { margin: 0 200px; }
c. 聖杯布局(float + 負margin + padding + position)
原理說明:
為了讓瀏覽器最先渲染main,要把main放DOM最上面,以此為出發點展開的布局。就是聽起來高大上的三欄布局。
布局步驟:
-
三者都設置向左浮動。
-
設置main寬度為100%,設置兩側欄的寬度。
-
設置 負邊距,sub設置負左邊距為100%,extra設置負左邊距為負的自身寬度。
-
設置main的padding值給左右兩個子面板留出空間。
-
設置兩個子面板為相對定位,sub的left值為負的sub寬度,extra的right值為負的extra寬度。
一些說明
1. DOM元素的書寫順序不得更改。
2. 當面板的main
內容部分比兩邊的子面板寬度小的時候,布局就會亂掉。可以通過設置main
的min-width
屬性或使用雙飛翼布局避免問題。
<div id="bd"> <div class="main"></div> <div class="sub"></div> <div class="extra"></div> </div> .main { float: left; width: 100%; } .sub { float: left; width: 190px; margin-left: -100%; position: relative; left: -190px; } .extra { float: left; width: 230px; margin-left: -230px; position: relative; right: -230px; } #bd { padding: 0 230px 0 190px; }
c. 雙飛翼布局(float + 負margin + margin)
原理說明:
聖杯布局的改進版,在main
元素上加了一層div, 並設置margin。
布局步驟:
-
三者都設置向左浮動。
-
設置main-wrap寬度為100%,設置兩個側欄的寬度。
-
設置 負邊距,sub設置負左邊距為100%,extra設置負左邊距為負的自身寬度。
-
設置main的margin值給左右兩個子面板留出空間。
一些說明
1. 聖杯采用的是padding,而雙飛翼采用的margin,解決了聖杯布局main的最小寬度不能小於左側欄的缺點。
2. 雙飛翼布局不用設置相對布局,以及對應的left和right值。
3. 通過引入相對布局,可以實現三欄布局的各種組合,例如對右側欄設置position: relative; left: 190px;
,可以實現sub+extra+main的布局。
<div id="main-wrap" class="column"> <div id="main">#main</div> </div> <div class="sub"></div> <div class="extra"></div> .main-wrap { float: left; width: 100%; } .sub { float: left; width: 190px; margin-left: -100%; } .extra { float: left; width: 230px; margin-left: -230px; } .main { margin: 0 230px 0 190px; }
c. flex 布局
簡單好用
<div id="content">
<div class="sub">sub</div>
<div class="main">main</div>
<div class="extra">extra</div>
</div> #content { display: flex; } .sub,.extra { flex: 0 0 200px; height: 550px; background: green; } .main { flex: 1; height: 550px; background: blue; }
總結:三欄布局一般用 position + margin 方案就好,瀏覽器允許直接上flex 通吃。
以上是本人目前了解的,若有看客,望不吝拍磚。
參考鏈接:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html (flex語法篇)
http://www.ruanyifeng.com/blog/2015/07/flex-examples.html (flex實例篇)
https://segmentfault.com/a/1190000011990028 (有關聖杯與雙飛翼)