雙飛翼布局
代碼如下
<!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 charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>雙飛翼布局</title>
<style type="text/css">
*{margin: 0;padding: 0;}
body{min-width: 700px;}
.header,
.footer{
border: 1px solid #333;
background: #aaa;
text-align: center;
}
.sub,
.main,
.extra{
float: left;
min-height: 130px;
}
.sub{
margin-left: -100%;
width: 200px;
background: red;
}
.extra{
margin-left: -220px;
width: 220px;
background: blue;
}
.main{
width: 100%;
}
.main-inner{
margin-left: 200px;
margin-right: 220px;
min-height: 130px;
background: green;
word-break: break-all;
}
.footer{
clear: both;
}
</style>
</head>
<body>
<div class="header">
<h4>header</h4>
</div>
<div class="main">
<div class="main-inner">
<h4>main</h4>
<p>HHHHHHHHHHHHHHHHHHHHHH
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
HHHHHHHHHHHHHHHHHHHHHH
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
</p>
</div>
</div>
<div class="sub">
<h4>sub</h4>
<p>oooooooooooooo
00000000000000000
ooooooooooooooo
ooooooooooooooo
000000000000000</p>
</div>
<div class="extra">
<h4>extra</h4>
<p>BBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBB
88888888888888888888</p>
</div>
<div class="footer">
<h4>footer</h4>
</div>
</body>
</html>
這里相應(yīng)解釋一下,中間的main設(shè)置了width:100%,所以后面的浮動(dòng)元素沒(méi)有位置換行到了下一行,但是實(shí)際還是相當(dāng)于排在main的后面。此時(shí),left塊使用margin-left:-100%,則讓left塊向左邊移動(dòng)了父元素100%的距離,成功移動(dòng)到了main的左邊,對(duì)于右側(cè)元素,使用margin-left:-自身width,則可以移動(dòng)到main的右側(cè),最后,給main加一個(gè)wrap,給上合適的margin,左右側(cè)欄設(shè)置position:relative方便調(diào)整,布局完成。
BFC
創(chuàng)建BFC的方法:
- 根元素或其它包含它的元素
- 浮動(dòng)元素的不是 none
- 絕對(duì)定位的元素 (元素具有為 absolute或 fixed)
- 內(nèi)聯(lián)塊 inline-blocks (元素具有display: inline-block)
- 表格單元格 (元素具有 display: table-cell,HTML表格單元格默認(rèn)屬性)
- 表格標(biāo)題 (元素具有 display: table-caption, HTML表格標(biāo)題默認(rèn)屬性)
- 塊元素具有overflow且值不是 visible
BFC的特點(diǎn):
- 內(nèi)部的Box會(huì)在垂直方向,從頂部開(kāi)始一個(gè)接一個(gè)地放置。
- Box垂直方向的距離由margin決定。屬于同一個(gè)BFC的兩個(gè)相鄰Box的margin會(huì)發(fā)生疊加
- 每個(gè)元素的margin box的左邊, 與包含塊border box的左邊相接觸(對(duì)于從左往右的格式化,否則相反)。即使存在浮動(dòng)也是如此。
- BFC的區(qū)域不會(huì)與float box疊加。
- BFC就是頁(yè)面上的一個(gè)隔離的獨(dú)立容器,容器里面的子元素不會(huì)影響到外面的元素,反之亦然。
- 計(jì)算BFC的高度時(shí),浮動(dòng)元素也參與計(jì)算。
margin負(fù)值
對(duì)于static元素:
當(dāng)元素沒(méi)有設(shè)置width(或者width:auto)時(shí),margin left/right為負(fù)值會(huì)使元素向指定的方向拉伸,增加元素的寬度。
當(dāng)元素設(shè)置了width屬性時(shí),margin left/top設(shè)置負(fù)值會(huì)使元素向左/上偏移,而margin right/bottom會(huì)將后續(xù)的元素拖拉進(jìn)來(lái),覆蓋本來(lái)的元素。我認(rèn)為這與BCF中margin box的左邊會(huì)與包含塊的左邊相接觸以及BFC內(nèi)部的Box會(huì)在垂直方向,從頂部開(kāi)始一個(gè)接一個(gè)地放置這兩個(gè)規(guī)則有關(guān)。
對(duì)于浮動(dòng)元素:
如果向浮動(dòng)的方向設(shè)置負(fù)margin,會(huì)使元素向這個(gè)方向移動(dòng),如果設(shè)置與浮動(dòng)方向相反的負(fù)margin,會(huì)使后面的浮動(dòng)元素覆蓋本身。著名的雙飛翼布局就是將浮動(dòng)和margin負(fù)值應(yīng)用起來(lái)實(shí)現(xiàn)的。
Flex布局
Flex 是 Flexible Box 的縮寫(xiě),意為"彈性布局",用來(lái)為盒狀模型提供最大的靈活性。
任何一個(gè)容器都可以指定為 Flex 布局。
.box{
display: flex;
}
采用 Flex 布局的元素,稱為 Flex 容器(flex container),簡(jiǎn)稱"容器"。它的所有子元素自動(dòng)成為容器成員,稱為 Flex 項(xiàng)目(flex item),簡(jiǎn)稱"項(xiàng)目"。

容器上的屬性
以下六個(gè)屬性設(shè)置在容器上
- flex-direction
- flex-wrap
- flex-flow
- justify-content
- align-items
- align-content
1 . flex-direction決定了主軸的方向(也就是項(xiàng)目的排列順序)

這個(gè)屬性可能有四個(gè)值
row(默認(rèn)值):主軸為水平方向,起點(diǎn)在左端。
row-reverse:主軸為水平方向,起點(diǎn)在右端。
column:主軸為垂直方向,起點(diǎn)在上沿。
column-reverse:主軸為垂直方向,起點(diǎn)在下沿。
2 .flex-wrap屬性
默認(rèn)情況下,項(xiàng)目都排在一條線(又稱"軸線")上。flex-wrap屬性定義,如果一條軸線排不下,如何換行。
可能為以下下三個(gè)值:
1 .nowrap(默認(rèn)):不換行
2 . wrap:換行,第一行在上方。
3 . wrap-reverse:換行,第一行在下方。
3 . flex-flow屬性是flex-direction屬性和flex-wrap屬性的簡(jiǎn)寫(xiě)形式,默認(rèn)值為row nowrap。
flex-flow: <flex-direction> || <flex-wrap>;
4 . justify-content屬性
justify-content: flex-start | flex-end | center | space-between | space-around;

它可能有五個(gè)值:
flex-start(默認(rèn)值):左對(duì)齊
flex-end:右對(duì)齊
center: 居中
space-between:兩端對(duì)齊,項(xiàng)目之間的間隔都相等。
space-around:每個(gè)項(xiàng)目?jī)蓚?cè)的間隔相等。所以,項(xiàng)目之間的間隔比項(xiàng)目與邊框的間隔大一倍。
5 . align-items
align-items: flex-start | flex-end | center | baseline | stretch;

6 .align-content
align-content: flex-start | flex-end | center | space-between | space-around | stretch;

該屬性可能取得值
flex-start:與交叉軸的起點(diǎn)對(duì)齊。
flex-end:與交叉軸的終點(diǎn)對(duì)齊。
center:與交叉軸的中點(diǎn)對(duì)齊。
space-between:與交叉軸兩端對(duì)齊,軸線之間的間隔平均分布。
space-around:每根軸線兩側(cè)的間隔都相等。所以,軸線之間的間隔比軸線與邊框的間隔大一倍。
stretch(默認(rèn)值):軸線占滿整個(gè)交叉軸。
項(xiàng)目上的屬性
以下六個(gè)屬性設(shè)置在項(xiàng)目上
order
flex-grow
flex-shrink
flex-basis
flex
align-self
1 .order屬性
order屬性定義項(xiàng)目的排列順序。數(shù)值越小,排列越靠前,默認(rèn)為0。
2 .flex屬性
flex屬性是flex-grow, flex-shrink 和 flex-basis的簡(jiǎn)寫(xiě),默認(rèn)值為0 1 auto。后兩個(gè)屬性可選。
該屬性有兩個(gè)快捷值:auto (1 1 auto) 和 none (0 0 auto)。
建議優(yōu)先使用這個(gè)屬性,而不是單獨(dú)寫(xiě)三個(gè)分離的屬性,因?yàn)闉g覽器會(huì)推算相關(guān)值。
- align-self屬性
align-items: flex-start | flex-end | center | baseline | stretch;
屬性和align-items一致