CSS 盒模型详解
作者:哆来咪 er
链接:https://juejin.im/post/6844903505983963143
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
盒子模型
首先盒模型分为 IE 盒模型和 W3C 标准盒模型。
IE 盒模型和 W3C 标准盒模型的区别是什么
1. W3C 标准盒模型
属性 width,height 只包含内容 content,不包含 border 和 padding
2. IE 盒模型
属性 width,height 包含 border 和 padding,指的是 content+padding+border
在 ie8+浏览器中使用哪个盒模型可以由box-sizing(CSS 新增的属性)控制,默认值为content-box
,即标准盒模型;如果将box-sizing
设为border-box
则用的是 IE 盒模型。如果在 ie6,7,8 中DOCTYPE
缺失会触发 IE 模式。在当前 W3C 标准中盒模型是可以通过box-sizing
自由的进行切换的
box-sizing : content-box || border-box || inherit;
在 css3 中新增了 box-sizing
属性,具备了以上知识后,我们已经理解:
- 当为
content-box
时,将采取标准模式进行解析计算 - 当为
border-box
时,将采取怪异模式解析计算 - 当为
inherit
时,将从父元素来继承box-sizing
属性的值
content-box(标准盒模型)
width = 内容的宽度
height = 内容的高度
border-box(IE 盒模型)
width = border + padding + 内容的宽度
height = border + padding + 内容的高度
实践
案例 1
谷歌浏览器,按下 F12,然后把右边栏的滚动条拉到最下面你就会看到一个东西,例如:
通过代码来对其进行理解,更直观,如下
普通 context
.box{
width:200px;
height:200px;
background-color:pink;
}
此时,盒子大小就是 content 的大小。
添加 padding
如果添加了 padding 的话
.box{
width:200px;
height:200px;
background-color:pink;
padding:20px;
border:10px solid black;
}
在浏览器上会显示
box 的图如下
此时,盒子的长宽变成了 240x240,显然,padding 是能够改变盒子的大小的,这时盒子大小就等于 content+padding。
加 border
.box{
width:200px;
height:200px;
background-color:pink;
padding:20px;
border:10px solid black;
}
此时,盒子的长宽变成了 260x260,所以这时盒子大小就等于 content+padding+border。
案例 2
代码:
.box{
width:200px;
height:200px;
background-color:pink;
padding:20px;
border:10px solid black;
margin-bottom:10px;
}
.box1{
width: 100px;
height: 100px;
background: green;
}
案例图如下:
盒子模型如下:
可以看到盒子在原来的 200+20x2+10x2 = 260 的基础上,还加了 10px 的空白
所以说,盒子的大小为 content+padding+border 即内容的(width)+内边距的再加上边框,而不加上 margin。很多时候,我们会错误地把 margin 算入,若那样的话,上面这种情形盒子的大小应该是 260x270,但实际情况并不是这样的。
css 的盒模型由 content(内容)、padding(内边距)、border(边框)、margin(外边距)组成。但盒子的大小由 content+padding+border 这几部分决定,把 margin 算进去的那是盒子占据的位置,而不是盒子的大小!
我们可以试着给上面的粉色方块设置 box-sizing 属性为 content-box 发现,会发现:无论我们怎么改 border 和 padding 盒子大小始终是定义的 width 和 height。如下
.box{
width:200px;
height:200px;
background-color:pink;
box-sizing:border-box;
padding:20px;
}
结论
我们在编写页面代码时应尽量使用标准的 W3C 模型(需在页面中声明 DOCTYPE 类型),这样可以避免多个浏览器对同一页面的不兼容。
因为若不声明 DOCTYPE 类型,IE 浏览器会将盒子模型解释为 IE 盒子模型,FireFox 等会将其解释为 W3C 盒子模型;若在页面中声明了 DOCTYPE 类型,所有的浏览器都会把盒模型解释为 W3C 盒模型。