盒子模型作为CSS的一个重中之重,被大众所熟知。但是我们平时讨论的盒子模型更多的是块级盒子(block box),其实还有一种盒子模型叫做行级盒子(line box),行级盒子我将在下一篇文章中讲述。
盒子模型
这就是我们所熟悉的盒子模型,包含了margin(外边距)、border(边框)、padding(内边距)、content(内容)。
- Margin(外边距) - 清除边框区域。Margin没有背景颜色,它是完全透明
- Border(边框) - 边框周围的填充和内容。边框是受到盒子的背景颜色影响
- Padding(内边距) - 清除内容周围的区域。会受到框中填充的背景颜色影响
- Content(内容) - 盒子的内容,显示文本和图像
块级盒子(block box)
对于块级元素,浏览器会采用block box模型来进行渲染。
不过,早期的IE和W3C有不同的解释。
IE盒子模型
早期的IE浏览器(IE6之前)采用IE盒子模型,现在多采用标准模式(W3C模式)
(content)width = content-width + padding-width + border-width
(content)height = content-height + padding-height + border-height
标准盒子模型(W3C盒子模型)
标准模式看起更加容易理解一点。
(content)width = content-width
(content)height = content-height
注意:
这里的高度和宽度并不是元素的真正宽高。这里的宽高指的是通过CSS设置的内容的宽高。
(吐槽:网上被广泛传播的这个图,我一直以为是错的…)
box-sizing属性
box-sizing属性可以让我们自由选择盒子的模式。
box-sizing:content-box/border-box/inherit
content-box——默认值,采用Standard box model
border-box——采用IE box model
inherit——继承父元素属性值
借助这个属性,我们来看看到底IE盒子和W3C标准盒子到底有什么不同。
IE和W3C盒子的异与同
这里的padding和margin以及border为了书写方便,全部假定为左右值都相等,大家懂这个意思就好了。
W3C盒子
通过设置 box-sizing: content-box;
,我们选定了W3C盒子模型。
图-W3C1:
图-W3C2:
通过W3C2我们可以明显的看出,contentWidth=width;即图阴影部分。
那么这个div元素的实际宽度(个人认为这个应该被称为做像素宽度)为:
contentWidth+padding*2+border*2+margin*2
=
100+50*2+0*2+200*2
=600px
IE盒子
IE盒子相比之下就显得很怪异了。
图-IE1:
在IE盒子的模式下,
contentWidth=width+padding*2+border*2
也就说我们设置了contentWidth=100px
,但是由于padding*2=100px
,所以把width
的宽度消除了。
如果我们让padding=0
,那么width
则会恢复正常。
图-IE2
所以图-IE1中div元素的实际宽度(像素宽度)为:
width+margin*2
=
100+200*2
=500px
这里另外提一点,
如果
border+padding>width
,
那么
width=border+padding; contentWidth=0;
。
图—IE3
参考资料:
https://www.w3cschool.cn/css/css-boxmodel.html
https://www.w3.org/TR/CSS2/box.html
http://www.jianshu.com/p/fde40f0c20cb#
https://segmentfault.com/a/1190000005155084
https://segmentfault.com/a/1190000005116275#articleHeader11
http://www.cnblogs.com/fsjohnhuang/p/5259121.html