前言:如下内容总结于CSS2.1规范, http://www.ayqy.net/doc/css2-1/cover.html
以上图形说的是盒子模型中的content、padding、border、margin边界。css
盒的内容区的尺寸—content width和content height —取决于几个因素:生成该盒的元素是否设置了'width'或'height'属性,该盒是否包含文本以及其它盒,该盒是否是表格等等。盒的内容,内边距和边框区域的背景样式由生成(该盒的)元素的'background'属性来指定。外边距背景老是透明的。html
CSS中,两个或多个盒(可能但不必定是兄弟)的相邻的margin会被结合成一个margin。外边距按这种方式结合叫作合并(collapse),产生的结合的外边距叫作折叠外边距(collapsed margin 译注:这里译做折叠表示结果,与合并的动做区分开)ide
合并后的结果:
当两个或者更多的margin合并时,产生的margin宽度为被合并的外边距宽度中的最大值。至于负margin,就从正相邻margin的最大值中减去负相邻margin的绝对值的最大值。若是没有正margin,就用0减去相邻margin的绝对值的最大值。若是该元素的外边距与其父元素的上外边距合并了,盒的上边框边界被定义为与其父元素的相同不然,要么该元素的父元素没参与外边距合并,要么只涉及其父元素的下外边距。该元素上边框边界的位置与元素下边框非0时的位置相同。布局
内边距的属性和外边距的属性相似, 有一点不一样的是,内边距padding不能为负。spa
这个属性比较简单, 有些样式而已。.net
在视觉格式化模型中,文档树中的每一个元素根据其盒模型生成0个或多个盒。这些盒的布局由(如下因素)控制:
* 盒尺寸与类型 * 定位方案(常规流,浮动与绝对定位) * 文档树中元素间的关系 * 外部信息(例如,视口大小,图片的固有尺寸等等)
CSS 2.1中,不少盒的位置和大小是根据被称为包含块的矩形框的边界计算的。通常把生成的盒做为后代盒的包含块,咱们说一个盒为其后代“创建”了包含块。“一个盒的包含块”表示“盒所在的包含块”,而不是它生成的(包含块)每一个盒都根据其包含块肯定了一个位置,但它不受该包含块的限制,可能会溢出code
行级元素与行内盒orm
使用display属性能够定义block、inline-block、inline、list-item、none等样式。如下分别是这几种属性的做用:htm
定位方案图片
浮动 在浮动模型中,盒先根据常规流来放置,而后从常规流中取出来并尽量远地向左或向右移动。其它内容可能沿着浮动(盒)的一侧排列(Content may flow along the side of a float)
* 绝对定位 在绝对定位模型中,一个盒会从常规流中所有移除(它不会影响后面的兄弟元素)并根据包含块肯定位置 * 若是一个元素是浮动的,绝对定位的或者是根元素,它就叫流外(out of flow)(元素)。若是一个元素不是流外的,就叫流内(in-flow)(元素)。
static
盒是个常规盒,根据常规流布局。'top','right','bottom'和'left'属性失效.
relative
盒的位置是根据常规流计算的(被称为常规流中的位置),而后盒相对于其常规位置偏移。当盒B为相对定位时,后面的盒的位置仍按照B没有偏移量来计算。table-row-group,table-header-group,table-footer-group,table-row,table-column-group,table-column,table-cell和table-caption元素上'position:relative'的效果是未定义的
absolute
盒的位置(及可能的大小)由'top','right','bottom'和'left'属性指定,这些属性指定了相对于盒的包含块的偏移量。绝对定位的盒脱离了常规流,意味着它们不会影响后面兄弟元素的布局,并且,虽然绝对定位的盒有外边距,但它们不会与任何其它外边距合并
fixed
除了盒相对于某些参照(reference)是固定的(fixed)以外,盒的位置根据'absolute'模型来计算。如同'absolute'模型同样,盒的外边距不会与任何其它外边距合并。
常规流中的盒属于一个格式化上下文,多是块或是行内(格式化上下文),但不能二者都是。块级盒参与块格式化上下文。行内级盒参与行内格式化上下文.
块格式化上下文
浮动,绝对定位的元素,非块盒的块容器(例如inline-blocks,table-cells和table-captions),以及’overflow’不为’visible’的块盒(当该值已被传播到视口时除外(except when that value has been propagated to the viewport))会为其内容创建新的块格式化上下文.在一个块格式化上下文中,盒在垂直方向一个接一个地放置,从包含块的顶部开始。两个兄弟盒之间的垂直距离由'margin'属性决定。同一个块格式化上下文中的相邻块级盒之间的垂直外边距会合并.
在一个块格式化上下文中,每一个盒的左外边界(left outer edge)挨着包含块的左外边界(对于从右向左的格式化,右外边界挨着)。即便存在浮动(尽管一个盒的行框可能会由于浮动而收缩 译注:环绕浮动元素放置的行框比正常的行短一些),这也成立。除非该盒创建了一个新的块格式化上下文(这种状况下,该盒自身可能会由于浮动变窄)
行内格式化上下文
在行内格式化上下文中,盒是从包含块的顶部开始一个挨一个水平放置的。这些盒之间的水平外边距,边框和内边距都有效。盒可能会以不一样的方式垂直对齐:以它们的底部或者顶部对齐,或者以它们里面的文本的基线对齐。包含来自同一行的盒的矩形区域叫作行框行框的宽度由包含块和浮动状况决定,行框的高度由行高的计算小节给出的规则决定
行框老是足够高,可以容纳它包含的全部盒。然而,它可能比它所包含的最高的盒还要高(例如,若是盒是以基线对齐的)。当盒B的高度小于它所在的行框的高度时,行框中B的垂直对齐方式由'vertical-align'属性决定。当几个行内级盒在水平方向上不能共存于一个行框时,它们会被分到两个或多个垂直堆叠的(vertically-stacked) 行框里。所以,段落就是个行框的垂直栈(vertical stack)。行框没有垂直间隔地堆放(除非在其它地方有特别说明)而且它们不会重叠
相对定位
当一个盒根据常规流或者浮动摆放好后,它可能会相对于该位置移动,称之为相对定位。用这种方式偏移盒(B1)的位置不影响盒(B2),遵循:给定B2位置时就当B1没有偏移,而且B2在B1应用偏移以后没有从新定位(re-positioned)。这代表相对定位可能会致使盒重叠。然而,若是相对定位致使有'overflow:auto'或'overflow:scroll'的盒溢出了的话,UA必须让用户可以访问这部份内容(在其偏移位置),此时,滚动条的建立可能会影响布局
绝对定位
绝对定位模型中,盒相对其包含块明确偏移,它会从常规流中所有移除(不会影响后面的兄弟)。绝对定位的盒会为常规流中的子级和绝对(不包括fixed)定位的后代创建一个新的包含块。然而绝对定位的元素的内容不会沿着任何其它盒排列。它们可能会遮住其它盒的内容(或者它们自身被遮住),取决于重叠盒的堆叠层级(stack levels)fixed定位是绝对定位的子类(subcategory)。fixed定位的盒惟一的区别是,包含块由视口创建。对于连续媒体,当文档滚动时,fixed盒不会移动。在这一点上,它们和fixed背景图像相似。对于分页媒体,fixed定位的盒会在每一页上重复(出现)。这在排版(placing)方面颇有用,例如,每一页的底部都有一个签名。fixed定位的盒比页区(page area)大的部分会被裁剪。fixed定位盒在初始包含块中不可见的部分将不会被打印