当对一个文档进行布局的时候,浏览器渲染引擎会根据标准,将页面中的全部元素表示为一个一个矩形的盒子。CSS决定这些盒子的大小、位置以及属性。每一个盒子有四个部分组成,分别是:content,padding,border,margin。css
属性解释:html
content
内容区域,内容区域能够定义width
和height
padding
内容区域和边框之间的空间量border
内容区域和内边距周围边框的粗细和样式。margin
边框和元素外边缘的空间量在CSS中咱们普遍的使用两种『盒子』——块级盒子和内联盒子。两种盒子在页面布局中有如下特色:前端
块级盒子css3
width
和height
属性能够发挥做用padding
外边距margin
边框border
会将其余元素从当前盒子周围推开内联盒子面试
width
和height
属性不起做用inline
状态的盒子推开。inline
状态的盒子推开。咱们经过对盒子display
属性的设置,来控制盒子的外部显示类型。segmentfault
完整的CSS盒模型应用于块级盒子,内联盒子只使用盒模型中定义的部份内容。盒模型有两种类型,标准盒模型和IE盒模型。浏览器
在标准盒模型中,若是给盒子设置width
和height
,实际设置的是content
内容区域的宽和高。内边距padding
和边框border
加上设置的宽高一块儿决定了盒子的大小。布局
在IE盒模型中,若是给盒子设置width
和height
,那么盒子的大小就是设置的宽高值,若是盒子设置了内边距padding
和边框border
,那么内容的大小其实是盒子的大小减去内边距和边框的大小以后的值。spa
假设咱们定义了以下一个盒子翻译
.box { width:100px; height:100px; margin:25px; padding:20px; border:15px solid #000; }
标准盒模型盒子图示:
盒子的宽度=width + padding-left + padding-right + border-left + border-right(100+20+20+15+15 = 170)
内容的宽度 = width(100)
IE盒模型图示:
盒子的宽度=width(100)
内容的宽度 = width - padding-left - padding-right - border-left - border-right(100-20-20-15-15 = 30)
在标准盒模型当中,咱们使用CSS定义盒子的宽度width
和高度height
并非盒子所占据空间大小。
在IE盒模型当中使用CSS定义盒子的宽度width
和高度height
就是盒子的大小。
在现代浏览器当中,几乎全部的浏览器,默认的盒模型都是标准盒模型。若是想要使用IE盒模型,能够经过设置属性box-sizing: border-box
来设置。
在早期仍是IE浏览器天下的时候,若是HTML文档缺失DOCTYPE
文档定义标签,在IE六、IE七、IE8下默认使用的是IE盒模型。
盒模型没有好坏优劣之分,根据状况的差别咱们选择不一样的盒模型。
折叠边距(边距重叠)不是一个Bug;以前咱们说过BFC,下面是W3C关于BFC的相关说明原文:
In a block formatting context, boxes are laid out one after the other, vertically, beginning at the top of a containing block. The vertical distance between two sibling boxes is determined by the 'margin' properties. Vertical margins between adjacent block-level boxes in a block formatting context collapse.
翻译一下就是说:『在BFC当中,盒子是按照垂直方向一个叠一个排列的,垂直方向上两个盒子的距离是由margin属性决定的,在BFC垂直方向的块级盒子之间margin会发生collapse
折叠』
在W3C关于CSS章节的8.3.1章节详细说了Collapsing margins
边距折叠的特色,在此我简单总结一下一些(不全),详细的内容点击查看
知道了会发生边距折叠的缘由,那么解决方法天然是小菜一碟。
一个完整的盒模型有四部分组成,分别是内容区域content,内边距padding,边框border,以及外边距margin;其中margin不参与计算盒子的大小;盒模型有两种类型,IE盒模型和标准盒模型;有时候IE盒模型也被成为怪异盒模型;在现代浏览器当中默认是盒子模型,咱们能够经过CSS的box-sizing:border-box;
来修改盒模型为IE盒模型;在IE盒模型当中,盒子的宽度是咱们定义的width值,而在标准盒模型当中盒子的宽度是内容的width值加上左右内边距加上左右边框的值。
详解CSS的盒模型(box model) 及 CSS3新增盒模型计算方式box-sizing
前端面试系列其它文章