### 概念
盒子模型是css最核心的內容了,理解盒子模型可以更好的對頁面進行排版布局.
盒子模型又稱框模型(Box Model),它是由四要素組成,分別是:
* 元素內容(content)
* 內邊距(padding)
* 邊框(border)
* 外邊距(margin)-透明
```js
//外盒尺寸計算(元素空間尺寸)
Element空間高度 = content height + padding + border + margin
Element 空間寬度 = content width + padding + border + margin
//內盒尺寸計算(元素大小)
Element Height = content height + padding + border (Height為內容高度)
Element Width = content width + padding + border
```
一個標準的盒子模型的示意圖:

下面我們用一組代碼來演示不同的情況,如下圖的盒模型:

關于元素寬度獲取的幾種方式,及不同點:
* `clientWidth`:包括元素寬度和padding,不含border的寬度值
* `offsetWidth`: dom元素實際寬度包括border和padding
* `scrollWidth`:對于無滾動元素來講,同clientWidth,但如果內容出現滾動條,則包括滾動的寬度,也就是說scrollWidth的最小值是clientWidth,其中隨內容的寬度而變
* `$element.width()`:jquery元素的寬度,單指元素的寬度
> [代碼](http://jsrun.net/StYKp)
### 盒模型的疊加
兩個上下相鄰的盒模型,它們的外邊距即彼此的`margin-bottom`和`margin-top`會合并,合并準則以外邊距值較大的為彼此的實際外間距.
但是上述只針對在普通文檔流中的垂直塊元素,而行內元素,浮動框或者是絕對定位的元素,它們的外邊距不會發生合并.
> [舉個栗子](http://jsrun.net/knYKp)
### 不得不說IE的怪異盒模型

```js
/*外盒尺寸計算(元素空間尺寸)*/
Element空間寬度 = content Width + margin (Width包含了元素內容寬度、邊框寬度、內距寬度)
/*內盒尺寸計算(元素大小)*/
Element Width = content Width(Width包含了元素內容寬度、邊框寬度、內距寬度)
```
**what?**
乍一看跟標準盒模型好像沒區別.但是仔細看,結合上圖,怪異盒模型元素的寬度就包含了元素內容,border和padding的寬度.還不明白?
```css
.box{
width:200px;
height:300px;
background:#bc223d;
text-align:center;
color:#fff;
margin:20px;
padding:20px;
border:3px solid #aaabbb;
overflow-x:auto;
box-sizing:border-box;//可講盒模型修改為怪異模型
}
```
```js
//怪異模型下元素寬度包括了內容的寬度,padding的寬度和border的寬度
$('.box').width();//=200-20*2-3*2=154px
```
> [代碼](http://jsrun.net/fnYKp)
### box-sizing
理解并掌握上述的兩種盒模型,那么`box-sizing`這個屬性相對來說更好理清了,它很好的實現了這兩種模型間的互相切換,`box-sizing`有如下的屬性:
* `content-box`: 讓元素維持標準盒模型,即:`Element Width/Height = border+padding+content width/height`
* `border-box`: 讓元素的寬度/高度等于元素內容的寬度/高度,換言之:此處的內容寬度/高度=width/height-border-padding;
* `inherit`:繼承父元素`box-sizing`的屬性值
繼續上代碼,直觀展現下這兩種模型:
> [點擊看代碼](http://jsrun.net/vnYKp)
#### 瀏覽器兼容性
現代瀏覽器基本支持,IE8及以上版本支持該屬性,Firefox 需要加上瀏覽器廠商前綴`-moz-`,對于低版本的IOS和Android瀏覽器也需要加上`-webkit-`
`boxder-box`更直接,更利于開發,所以有了如下的代碼:
```css
*, *:before, *:after {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
```
### 盒模型的應用,畫三角
```css
.triangle {
width:0;
height:0;
border:100px solid transparent;
border-top:100px solid #bc223d;
}
```
> [代碼](http://jsrun.net/anYKp)
>
<p class="over">Over!</p>
- 前端
- C1-Javascript
- H5圖片分塊和斷點續傳
- JavascriptPatterns[Stoyanstefanov]
- macotask和microtask
- 前端代碼生成器
- 跨域
- 頁面回到頂部滾動按鈕實現
- C2-CSS
- 瀏覽器的一些單位
- 盒模型
- 移動端判斷橫豎屏
- C3-框架
- ReactNative
- 開發環境搭建(安卓篇)
- Vue
- vue+pdfjs使用
- vue+typescript使用實踐
- vue+webpack3.x集成typescript
- Vue源碼3
- vue源碼分析1
- vue源碼分析2
- vue筆記
- C4-工具
- git
- Gitlab-CICD
- mock規則
- vscode-settings
- webpack自定義命令,切換代理地址
- 正則表達式
- 深入淺出webpack
- C5-Node
- express
- express源碼閱讀
- nightmare使用指南
- 爬蟲1.0
- C6-微信
- 微信
- C7-Canvas
- 基礎API
- 前端隨筆筆記
- 后端
- C1-Java
- shiro
- C2-Linux
- ffmpeg
- ITerm
- Linux
- MongoDB安裝
- MySql安裝
- Ngnix反向代理
- 常見錯誤
- 備忘
- mac
- 備忘-Work
- 備忘Link
- 服務器資源
- 教程
- Hexo個人博客搭建筆錄
- 文檔
- CSS編碼規范
- 前端編碼規范
- 隨筆
- 整理
- 正則
- 鏈接收藏
- 面試
- CodeWars題庫
- CodeWars題庫(二)
- Java社招面試題
- Java面試
- Web面試
- 前端筆試題
- 筆試題