一、基本概念
盒子模型就是網頁布局中的一種手段,包括邊框(border)、外邊距(margin)、內邊距(padding)、網頁元素(content)、寬(width)、高(height)等元素。

要點:
- Margin(外邊距) - 清除邊框外的區(qū)域,外邊距是透明的。
- Border(邊框) - 圍繞在內邊距和內容外的邊框。
- Padding(內邊距) - 清除內容周圍的區(qū)域,內邊距是透明的。
- Content(內容) - 盒子的內容,顯示文本和圖像。
<div class="parent">
<div class="child1"></div>
<div class="child2"></div>
</div>
.parent {
width: 400px;
height: 400px;
background: #ccc;
}
.child1, .child2 {
width: 100px;
height: 100px;
margin: 10px;
padding: 10px;
border: 10px solid #000;
background: #f00;
}
二、盒模型的兩種標準


要點:
- 標準模型中盒模型的寬高只是內容(content)的寬高
- IE模型中盒模型的寬高是內容(content)+填充(padding)+邊框(border)的總寬高
三、CSS3 box-sizing 屬性
box-sizing 是用于告訴瀏覽器如何計算一個元素的總寬度和總高度
- 標準盒模型 box-sizing: content-box
<p>???????width = content width</p>
<p>???????height = content height</p>
-
IE盒模型 box-sizing: border-box
<p>???????width = border + padding + content width</p>
<p>???????height = border + padding + content height</p>
<div class="parent">
<div class="child1 content-box"></div>
<div class="child2 border-box"></div>
</div>
.content-box {
box-sizing: content-box;
}
.border-box {
box-sizing: border-box;
}
四、margin折疊問題
css2.1盒子模型中規(guī)定:
In this specification, the expression collapsing margins means that adjoining margins (no non-empty content, padding or border areas or clearance separate them) of two or more boxes (which may be next to one another or nested) combine to form a single margin.所有毗鄰的兩個或更多盒元素的margin將會合并為一個margin共享之。毗鄰的定義為:同級或者嵌套的盒元素,并且它們之間沒有非空內容、padding或border分隔。
在CSS當中,相鄰的兩個盒子(可能是兄弟關系也可能是祖先關系)的外邊距可以結合成一個單獨的外邊距。這種合并外邊距的方式被稱為折疊,所結合成的外邊距稱為折疊外邊距。折疊的結果按照如下規(guī)則計算:
- 兩個相鄰的外邊距都是正數(shù)時,折疊結果是它們兩者之間較大的值。
- 兩個相鄰的外邊距都是負數(shù)時,折疊結果是兩者絕對值的較大值。
- 兩個外邊距一正一負時,折疊結果是兩者的相加的和。
產生折疊的必備條件:margin必須是鄰接的!
解決嵌套元素產生折疊問題的方法:
- 給父元素設置padding
- 給父元素設置透明border
.parent {
/* padding-top:1px; */
border: 1px solid rgba(0,0,0,0);
width: 400px;
height: 400px;
background: #ccc;
}
五、什么是BFC
1、BFC 定義
BFC(Block formatting context)直譯為"塊級格式化上下文"。它是一個獨立的渲染區(qū)域,只有Block-level Box參與, 它規(guī)定了內部的Block-level Box如何布局,并且與這個區(qū)域外部毫不相干。
Box:css布局的基本單位
Box 是 CSS 布局的對象和基本單位, 直觀點來說,就是一個頁面是由很多個 Box 組成的。元素的類型和 display 屬性,決定了這個 Box 的類型。 不同類型的 Box, 會參與不同的 Formatting Context(一個決定如何渲染文檔的容器),因此Box內的元素會以不同的方式渲染。
Box盒子的類型:
- block-level box : display 屬性為 block, list-item, table 的元素,會生成 block-level box。并且參與 block fomatting context;
- inline-level box : display 屬性為 inline, inline-block, inline-table 的元素,會生成 inline-level box。并且參與 inline formatting context;
Formatting Context
Formatting context 是 W3C CSS2.1 規(guī)范中的一個概念。它是頁面中的一塊渲染區(qū)域,并且有一套渲染規(guī)則,它決定了其子元素將如何定位,以及和其他元素的關系和相互作用。最常見的 Formatting context 有 Block fomatting context (簡稱BFC)和 Inline formatting context (簡稱IFC)。
2、如何創(chuàng)建BFC
- float的值不是none
- position的值不是static或者relative
- display的值是inline-block、table-cell、flex、table-caption或者inline-flex
- overflow的值不是visible
3、BFC的布局規(guī)則
- 內部的Box會在垂直方向,一個接一個地放置。
- Box垂直方向的距離由margin決定。屬于同一個BFC的兩個相鄰Box的margin會發(fā)生重疊。
- 每個盒子(塊盒與行盒)的margin box的左邊,與包含塊border box的左邊相接觸(對于從左往右的格式化,否則相反)。即使存在浮動也是如此。
- BFC的區(qū)域不會與float box重疊。
- BFC就是頁面上的一個隔離的獨立容器,容器里面的子元素不會影響到外面的元素。反之也如此。
- 計算BFC的高度時,浮動元素也參與計算。
4、BFC的應用場景
(1)利用BFC避免margin重疊
- 解決嵌套元素margin重疊,父元素可選擇添加以下樣式之一
padding-top:1px;
border: 1px solid rgba(0,0,0,0);
display: inline-block;
display: table;
display: table-caption;
display: flex;
display: inline-flex;
float: left;
position: absolute;
overflow:hidden;
- 解決同級相鄰元素margin重疊,任意相鄰元素可選擇添加以下樣式之一
display:inline-block;
display:table-caption;
display:inline-flex;
(2)自適應兩欄布局
- 要點:BFC的區(qū)域不會與float box重疊
<body>
<div class="left">LEFT</div>
<div class="right">RIGHT</div>
</body>
.left {
float: left;
width: 200px;
height: 150px;
line-height: 150px;
text-align: center;
font-size: 40px;
background: #00f;
}
.right {
overflow: hidden;
height: 300px;
line-height: 300px;
text-align: center;
font-size: 40px;
background: #f00;
}
(3)清除浮動
- 當我們不給父節(jié)點設置高度,同時給子節(jié)點設置了浮動的時候,就會發(fā)生高度塌陷,這個時候我們就要清除浮動
- 要點:計算BFC的高度時,浮動元素也參與計算
<div class="parent">
<div class="child"></div>
<div class="child"></div>
</div>
.parent {
overflow: hidden;
width: 300px;
border: 5px solid #f00;
}
.child {
float: left;
width:100px;
height: 100px;
border: 5px solid #00f;
}