8 盒模型

内容

注意:本规范的若干章节已被其他规范更新。请参阅最新 CSS Snapshot 中的 “层叠样式表 (CSS) — 官方定义”,其中列出了规范以及它们取代的章节。

CSS 工作组也在开发 CSS 2 级修订版 2(CSS 2.2)

CSS 盒模型描述了为文档树中的元素生成的矩形框,并按照视觉格式化模型进行布局。

8.1 盒的尺寸

每个盒都有一个 内容区(例如文本、图像等),以及可选的环绕 内边距 边框 外边距区域;每个区域的大小由下文定义的属性指定。下图展示了这些区域之间的关系以及用于指代外边距、边框和内边距各部分的术语。

展示内容区、内边距、边框和外边距之间关系的图示   [D]

外边距、边框和内边距可以细分为上、右、下、左四个段(例如,在图中,“LM”表示左外边距,“RP”表示右内边距,“TB”表示顶部边框,等)。

每个四个区域(内容、内边距、边框、外边距)的周边称为“边”,因此每个盒子都有四条边。

内容边缘内侧边缘
内容边缘围绕盒子所给出的宽度高度矩形,这通常取决于元素的已渲染内容。四条内容边缘定义了盒子的内容盒
内边距边缘
内边距边缘围绕盒子的内边距。如果内边距宽度为 0,则内边距边缘与内容边缘相同。四条内边距边缘定义了盒子的内边距盒
边框边缘
边框边缘围绕盒子的边框。如果边框宽度为 0,则边框边缘与内边距边缘相同。四条边框边缘定义了盒子的边框盒
外边距边缘外侧边缘
外边距边缘围绕盒子的外边距。如果外边距宽度为 0,则外边距边缘与边框边缘相同。四条外边距边缘定义了盒子的外边距盒

每条边缘都可以细分为上、右、下、左四条边。

盒子内容区的尺寸——内容宽度内容高度——取决于多个因素:生成盒子的元素是否已设置'width''height'属性,盒子是否包含文本或其他盒子,盒子是否为表格等。盒子的宽度和高度在视觉格式化模型细节章节中讨论。

盒子内容、内边距和边框区域的背景样式由生成元素的 'background' 属性指定。外边距的背景始终是透明的。

8.2 外边距、内边距和边框示例

本示例说明了外边距、填充和边框之间的相互作用。示例 HTML 文档

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML>
  <HEAD>
    <TITLE>Examples of margins, padding, and borders</TITLE>
    <STYLE type="text/css">
      UL { 
        background: yellow; 
        margin: 12px 12px 12px 12px;
        padding: 3px 3px 3px 3px;
                                     /* No borders set */
      }
      LI { 
        color: white;                /* text color is white */ 
        background: blue;            /* Content, padding will be blue */
        margin: 12px 12px 12px 12px;
        padding: 12px 0px 12px 12px; /* Note 0px padding right */
        list-style: none             /* no glyphs before a list item */
                                     /* No borders set */
      }
      LI.withborder {
        border-style: dashed;
        border-width: medium;        /* sets border width on all sides */
        border-color: lime;
      }
    </STYLE>
  </HEAD>
  <BODY>
    <UL>
      <LI>First element of list
      <LI class="withborder">Second element of list is
           a bit longer to illustrate wrapping.
    </UL>
  </BODY>
</HTML>

产生的 文档树(除了其他关系外)包含一个 UL 元素,该元素有两个 LI 子元素。

下面的第一幅图示例展示了该示例的渲染结果。第二幅图示例展示了 UL 元素的外边距、内边距、边框与其子元素 LI 的外边距、内边距、边框之间的关系。(图形未按比例绘制。)

展示父子元素外边距、边框和内边距之间关系的图示   [D]

注意

8.3 外边距属性'margin-top', 'margin-right', 'margin-bottom', 'margin-left', 和 'margin'

外边距属性指定盒子外边距区域的宽度。'margin'简写属性一次性设置四侧外边距,而其它外边距属性只设置各自对应的侧。该属性适用于所有元素,但垂直外边距对非替换的行内元素不起作用。

本节定义的属性使用 <margin-width> 值类型,该类型可以取以下值之一:

<length>(长度)
指定固定宽度。
<percentage>(百分比)
百分比是相对于生成盒子的包含块宽度来计算的。注意这同样适用于'margin-top''margin-bottom'如果包含块的宽度依赖于此元素,则在 CSS 2.1 中布局结果未定义。
auto
有关行为,请参阅计算宽度和外边距章节。

允许外边距属性使用负值,但可能存在实现相关的限制。

'margin-top', 'margin-bottom'
  <margin-width> | inherit
初始值  0
应用于  所有元素,除了表显示类型不是 table-caption、table 和 inline-table 的元素
可继承  
百分比  参考包含块的宽度
媒体  视觉
计算值  按指定的百分比或绝对长度

这些属性对非替换的行内元素没有影响。

'margin-right', 'margin-left'
  <margin-width> | inherit
初始值  0
应用于  所有元素,除了表显示类型不是 table-caption、table 和 inline-table 的元素
可继承  
百分比  参考包含块的宽度
媒体  视觉
计算值  按指定的百分比或绝对长度

这些属性设置盒子的上、右、下、左外边距。

示例

h1 { margin-top: 2em }
'margin'
  <margin-width>{1,4} | inherit
初始值  见各个属性
应用于  所有元素,除了表显示类型不是 table-caption、table 和 inline-table 的元素
可继承  
百分比  参考包含块的宽度
媒体  视觉
计算值  见各个属性

'margin'属性是一个简写属性,用于在样式表的同一位置一次性设置'margin-top''margin-right''margin-bottom''margin-left'

如果只有一个组件值,则该值适用于四侧。若有两个值,则上、下外边距使用第一个值,右、左外边距使用第二个值。若有三个值,则上使用第一个值,左、右使用第二个值,底使用第三个值。若有四个值,则分别对应上、右、下、左。

示例

body { margin: 2em }         /* all margins set to 2em */
body { margin: 1em 2em }     /* top & bottom = 1em, right & left = 2em */
body { margin: 1em 2em 3em } /* top=1em, right=2em, bottom=3em, left=2em */

上例的最后一条规则等价于下面的示例:

body {
  margin-top: 1em;
  margin-right: 2em;
  margin-bottom: 3em;
  margin-left: 2em;        /* copied from opposite side (right) */
}

8.3.1 外边距合并

在 CSS 中,两个或更多盒子的相邻外边距(它们可能是兄弟也可能不是)可以合并为单一外边距。以这种方式合并的外边距称为合并,合并后的外边距称为合并外边距

相邻的垂直边距会折叠,但除外情况如下

水平外边距永不合并。

当且仅当满足下列条件时,两个外边距被视为相邻

如果合并外边距的任意组成外边距与另一外边距相邻,则该合并外边距被视为与另一外边距相邻。

注意。相邻外边距可以由并非兄弟或祖先关系的元素产生。

注意 上述规则意味着:

当两个或更多外边距合并时,合并后外边距的宽度为所有合并外边距宽度的最大值。若出现负值外边距,则先取负外边距绝对值的最大值,从正外边距的最大值中减去该值。如果没有正外边距,则把所有相邻外边距绝对值的最大值从 0 中减去。

如果一个盒子的上下外边距相邻,则可以出现外边距“穿透合并”。此时,元素的位置取决于它与那些正被合并外边距的其他元素的相对关系。

请注意,被“穿透合并”的元素的位置对那些与之合并外边距的其他元素的位置没有影响;顶部边框边缘位置仅在布局这些元素的后代时才需要。

8.4 填充属性'padding-top', 'padding-right', 'padding-bottom', 'padding-left', 和 'padding'

填充属性指定盒子 填充区的宽度。'padding'简写属性一次性设置四侧填充,而其它填充属性仅设置对应的一侧。

本节定义的属性使用 <padding-width> 值类型,可取以下值:

<length>(长度)
指定固定宽度。
<percentage>(百分比)
百分比是相对于生成盒子的包含块宽度来计算的,即使是'padding-top''padding-bottom'也是如此。如果包含块的宽度依赖于此元素,则在 CSS 2.1 中布局结果未定义。

与外边距属性不同,内边距的值不能为负。与外边距一样,内边距的百分比值同样相对于生成盒子的包含块宽度。

'padding-top', 'padding-right', 'padding-bottom', 'padding-left'
  <padding-width> | inherit
初始值  0
应用于  所有元素,除了 table-row-group、table-header-group、table-footer-group、table-row、table-column-group 和 table-column
可继承  
百分比  参考包含块的宽度
媒体  视觉
计算值  按指定的百分比或绝对长度

这些属性设置盒子的上、右、下、左填充。

示例

blockquote { padding-top: 0.3em }
'padding'
  <padding-width>{1,4} | inherit
初始值  见各个属性
应用于  所有元素,除了 table-row-group、table-header-group、table-footer-group、table-row、table-column-group 和 table-column
可继承  
百分比  参考包含块的宽度
媒体  视觉
计算值  见各个属性

'padding'属性是一个简写属性,用于在样式表的同一位置一次性设置'padding-top''padding-right''padding-bottom'以及'padding-left'

若只有一个组件值,则该值适用于四侧。若有两个值,则上、下填充使用第一个值,右、左填充使用第二个值。若有三个值,则上使用第一个值,左、右使用第二个值,底使用第三个值。若有四个值,则分别对应上、右、下、左。

内边距区域的表面颜色或图像通过 'background' 属性指定。

示例

h1 { 
  background: white; 
  padding: 1em 2em;
} 

上面的示例指定了“1em”的垂直填充('padding-top''padding-bottom')以及“2em”的水平填充('padding-right''padding-left')。“em”单位是相对于元素的字体大小的:1 em 等于正在使用的字体大小。

8.5 边框属性

边框属性指定盒子边框区域的宽度、颜色和样式。这些属性适用于所有元素。

注意。特别是对于 HTML,用户代理可能会对某些用户界面元素(例如按钮、菜单等)的边框渲染方式与“普通”元素不同。

8.5.1 边框宽度'border-top-width', 'border-right-width', 'border-bottom-width', 'border-left-width', 和 'border-width'

边框宽度属性指定边框区域的宽度。本节定义的属性涉及 <border-width> 值类型,该类型可以取下列值之一:

thin
细边框。
medium
中等边框。
thick
粗边框。
<length>(长度)
边框厚度有一个明确的值。明确的边框宽度不能为负值。

前三个值的解释取决于用户代理。但是,必须满足以下关系

‘thin’ <=‘medium’ <= ‘thick’。

此外,这些宽度在整个文档中必须保持一致。

'border-top-width', 'border-right-width', 'border-bottom-width', 'border-left-width'
  <border-width> | inherit
初始值  medium
应用于  所有元素
可继承  
百分比  不适用
媒体  视觉
计算值  绝对长度;如果边框样式为 'none' 或 'hidden',则为 '0'

这些属性设置盒子顶部、右侧、底部和左侧边框的宽度。

'border-width'
  <border-width>{1,4} | inherit
初始值  见各个属性
应用于  所有元素
可继承  
百分比  不适用
媒体  视觉
计算值  见各个属性

此属性是一个简写属性,用于在样式表的同一位置一次性设置'border-top-width''border-right-width''border-bottom-width'以及'border-left-width'

若只有一个组件值,则该值适用于四侧。若有两个值,则上、下边框使用第一个值,右、左使用第二个值。若有三个值,则上使用第一个值,左、右使用第二个值,底使用第三个值。若有四个值,则分别对应上、右、下、左。

示例

在下面的示例中,注释指示了上、右、下、左四条边框的实际宽度。

h1 { border-width: thin }                   /* thin thin thin thin */
h1 { border-width: thin thick }             /* thin thick thin thick */
h1 { border-width: thin thick medium }      /* thin thick medium thick */

8.5.2 边框颜色'border-top-color', 'border-right-color', 'border-bottom-color', 'border-left-color', 和 'border-color'

边框颜色属性指定盒子边框的颜色。

'border-top-color', 'border-right-color', 'border-bottom-color', 'border-left-color'
  <color> | transparent | inherit
初始值  'color' 属性的值
应用于  所有元素
可继承  
百分比  不适用
媒体  视觉
计算值  若取自 'color' 属性,则为计算得到的 color 值;否则按声明的值。
'border-color'
  [ <color> | transparent ]{1,4} | inherit
初始值  见各个属性
应用于  所有元素
可继承  
百分比  不适用
媒体  视觉
计算值  见各个属性

'border-color'属性设置四条边框的颜色。取值含义如下:

<color>(颜色)
指定一个颜色值。
transparent
边框是透明的(尽管它可能具有宽度)。

'border-color'属性可以有 1 到 4 个组件值,且这些值会像'border-width'那样分别对应各侧。

如果元素未通过边框属性指定边框颜色,用户代理必须使用元素的 'color' 属性值作为边框颜色的 计算值

示例

在本例中,边框将是一条实心的黑线。

p { 
  color: black; 
  background: white; 
  border: solid;
}

8.5.3 边框样式'border-top-style', 'border-right-style', 'border-bottom-style', 'border-left-style', 和 'border-style'

边框样式属性指定盒子边框的线型(实线、双线、虚线等)。本节定义的属性涉及 <border-style> 值类型,该类型可以取下列值之一:

none(无)
无边框;计算得到的边框宽度为 0。
该组件可以在本包或其他任何使用包的其他组件中被引用;它不能在使用包中被不同的组件覆盖。
等同于 'none',但在边框冲突解决(针对表格元素)时行为不同。
dotted
边框是一系列点。
dashed
边框是一系列短线段。
solid
边框是一条单线段。
double
双实线边框。两条线与它们之间的间距之和等于 'border-width' 的值。
groove
边框看起来像是刻在画布上。
ridge
'groove' 的反面:边框看起来像是从画布上凸出来的。
inset
边框看起来像是嵌入在画布中。
outset
与 'inset' 相反:边框看起来像是凸出于画布。

所有边框都会绘制在盒子的背景之上。对于值为 'groove'、'ridge'、'inset'、'outset' 的边框,其颜色取决于元素的边框颜色属性,但用户代理可以自行采用算法来计算实际使用的颜色。例如,如果 'border-color' 的值为 'silver',则 UA 可以使用从白色到深灰的颜色渐变来表示斜面边框。

'border-top-style', 'border-right-style', 'border-bottom-style', 'border-left-style'
  <border-style> | inherit
初始值  none(无)
应用于  所有元素
可继承  
百分比  不适用
媒体  视觉
计算值  按指定值
'border-style'
  <border-style>{1,4} | inherit
初始值  见各个属性
应用于  所有元素
可继承  
百分比  不适用
媒体  视觉
计算值  见各个属性

'border-style'属性设置四条边框的样式。它可以有 1 到 4 个组件值,且这些值会像'border-width'那样分别对应各侧。

示例

#xy34 { border-style: solid dotted }

在上述示例中,水平边框为“solid”,垂直边框为“dotted”。

由于边框样式的初始值是“none”,除非显式设置样式,否则边框不可见。

8.5.4 边框简写属性'border-top', 'border-right', 'border-bottom', 'border-left', 和 'border'

'border-top', 'border-right', 'border-bottom', 'border-left'
  [ <border-width> || <border-style> || <'border-top-color'> ] | inherit
初始值  见各个属性
应用于  所有元素
可继承  
百分比  不适用
媒体  视觉
计算值  见各个属性

这是一个简写属性,用于一次性设置盒子上、右、下、左四条边框的宽度、样式和颜色。

示例

h1 { border-bottom: thick solid red }

上述规则会为 H1 元素下方的边框设置宽度、样式和颜色。未指定的值将使用其初始值。因为后面的规则未指定边框颜色,边框将使用'color'属性所定义的颜色。

H1 { border-bottom: thick solid }
'border'
  [ <border-width> || <border-style> || <'border-top-color'> ] | inherit
初始值  见各个属性
应用于  所有元素
可继承  
百分比  不适用
媒体  视觉
计算值  见各个属性

'border'属性是一个简写属性,用于一次性为盒子四条边框设置相同的宽度、颜色和样式。与简写的'margin''padding'属性不同,'border'属性不能为四条边框指定不同的值。如需分别设置,必须使用其它单独的边框属性。

示例

例如,下面第一条规则等价于随后显示的四条规则集合。

p { border: solid red }
p {
  border-top: solid red;
  border-right: solid red;
  border-bottom: solid red;
  border-left: solid red
}

由于这些属性在某种程度上具有重叠的功能,因此指定规则的顺序非常重要。

示例

考虑下面的示例

blockquote {
  border: solid red;
  border-left: double;
  color: black;
}

在上面的示例中,左边框的颜色为黑色,其他边框为红色。这是因为 'border-left' 同时设置了宽度、样式和颜色。由于该属性未指定颜色值,颜色会从'color'属性中获取。'color'属性在 'border-left' 之后声明,这一点并不影响结果。

8.6 双向上下文中内联元素的盒模型

对于每个行盒,用户代理必须取得为每个元素生成的行内盒,并按照视觉顺序(而非逻辑顺序)渲染外边距、边框和填充。

当元素的'direction'属性为 'ltr' 时,元素所在的第一个行盒中生成的最左侧盒拥有左外边距、左边框和左填充;元素所在的最后一个行盒中生成的最右侧盒拥有右填充、右边框和右外边距。

当元素的'direction'属性为 'rtl' 时,元素所在的第一个行盒中生成的最右侧盒拥有右填充、右边框和右外边距;元素所在的最后一个行盒中生成的最左侧盒拥有左外边距、左边框和左填充。