### 概念
盒子模型是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
```
一个标准的盒子模型的示意图:
![标准盒子模型](http://images2015.cnblogs.com/blog/793040/201511/793040-20151130140140858-2462296.jpg)
下面我们用一组代码来演示不同的情况,如下图的盒模型:
![演示demo](http://oritfw5nq.bkt.clouddn.com/20170810134534.png)
关于元素宽度获取的几种方式,及不同点:
* `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的怪异盒模型
![IE盒子模型](http://img.blog.csdn.net/20160429135409319)
```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面试
- 前端笔试题
- 笔试题