10 可视化格式模型细节

内容

10.1 “包含块”的定义

元素框的定位和大小有时是相对于某个矩形计算的,该矩形称为该元素的包含块。元素的包含块定义如下:

  1. 根元素所处的包含块是一个矩形,称为初始包含块。对于连续媒体,它的尺寸等同于视口,锚定于画布的原点;对于分页媒体,它的尺寸等同于页面区域。初始包含块的'direction'属性与根元素相同。
  2. 对于其他元素,如果元素的定位是'relative'或'static',则包含块由最近的祖先框的内容边缘形成,该祖先框是块容器或建立了格式化上下文。
  3. 如果元素的'position'属性为'fixed',则在连续媒体中,包含块由视口建立;在分页媒体中,包含块由页面区域建立。
  4. 如果元素的'position'属性为'absolute',则包含块由最近的具有'absolute'、'relative'或'fixed'定位属性的祖先元素建立,具体如下:
    1. 如果该祖先是一个内联元素,则包含块是该元素生成的第一个和最后一个内联框的填充框的边界框。在CSS 2.2中,如果内联元素跨多行,包含块未定义。
    2. 否则,包含块由祖先元素的填充边缘形成。

    如果没有这样的祖先,包含块就是初始包含块。

在分页媒体中,绝对定位元素相对于其包含块进行定位,而忽略任何分页符(就像文档是连续的一样)。该元素随后可能被分布在多个页面上。

对于解析到非当前页面(即已经为打印呈现的页面)上的位置的绝对定位内容,打印机可能会将内容放置在以下位置:

注意:跨多个页面的块级元素在每个页面上可能具有不同的宽度,并且可能存在设备特定的限制。

示例:

在没有定位的情况下,以下文档中的包含块(C.B.)被建立如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML>
   <HEAD>
      <TITLE>包含块示例</TITLE>
   </HEAD>
   <BODY id="body">
      <DIV id="div1">
      <P id="p1">这是第一段中的文本...</P>
      <P id="p2">这是<EM id="em1">第二段<STRONG id="strong1">中的</STRONG>文本。</EM></P>
      </DIV>
   </BODY>
</HTML>

包含块的建立如下:

生成的框 包含块由以下元素建立
html 初始包含块(UA-依赖)
body html
div1 body
p1 div1
p2 div1
em1 p2
strong1 p2

如果我们为“div1”设置定位:

   #div1 { position: absolute; left: 50px; top: 50px }

它的包含块不再是“body”;而是初始包含块(因为没有其他已定位的祖先框)。

如果我们也为“em1”设置定位:

   #div1 { position: absolute; left: 50px; top: 50px }
   #em1  { position: absolute; left: 100px; top: 100px }

包含块表变为:

生成的框 包含块由以下元素建立
html 初始包含块(UA-依赖)
body html
div1 初始包含块
p1 div1
p2 div1
em1 div1
strong1 em1

通过为“em1”设置定位,它的包含块变为最近的已定位祖先框(即由“div1”生成的框)。

10.2 内容宽度'width'属性

名称: width
值: <长度> | <百分比> | auto | inherit
初始值: auto
适用于: 所有元素,但不适用于非替换的内联元素、表格行和行组
继承:
百分比: 相对于包含块的宽度
媒体: 视觉
计算值: 指定的百分比或'auto',或绝对长度

此属性指定框的内容宽度

此属性不适用于非替换的内联元素。非替换的内联元素框的内容宽度是其内渲染内容的宽度(在任何子元素的相对偏移之前)。请记住,内联框会流入行框。行框的宽度由其包含块决定,但可能会因存在浮动元素而缩短。

这些值具有以下含义:

<长度>
使用长度单位指定内容区域的宽度。
<百分比>
指定百分比宽度。百分比是相对于生成的框的包含块的宽度计算的。如果包含块的宽度依赖于该元素的宽度,那么在CSS 2.2中,生成的布局是未定义的。 注意:对于包含块基于块容器元素的绝对定位元素,百分比是相对于该元素的填充框宽度计算的。这是与CSS1的变化,CSS1中百分比宽度总是相对于父元素的内容框计算的。
auto
宽度取决于其他属性的值。详见下文相关章节。

'width'的负值是非法的。

示例:

例如,以下规则将段落的内容宽度固定为100像素:

p { width: 100px }

10.3 计算宽度和边距

元素的'width''margin-left''margin-right''left''right'属性的值在布局中依赖于生成的框的类型和相互之间的关系。(用于布局的值有时被称为实际值。)原则上,使用的值与计算值相同,'auto'被替换为一些合适的值,并且根据包含块计算百分比,但也有例外情况。需要区分以下情况:

  1. 内联,非替换元素
  2. 内联,替换元素
  3. 正常流中的块级,非替换元素
  4. 正常流中的块级,替换元素
  5. 浮动,非替换元素
  6. 浮动,替换元素
  7. 绝对定位的,非替换元素
  8. 绝对定位的,替换元素
  9. 正常流中的'inline-block',非替换元素
  10. 正常流中的'inline-block',替换元素

对于第1-6点和第9-10点,相对定位元素中'left'和'right'的值由第9.4.3节中的规则确定。

注意。 下面计算的'width'的实际值是一个暂定值,可能需要根据'min-width''max-width'多次计算,详见下面的最小和最大宽度章节。

10.3.1 内联,非替换元素

'width' 属性不适用。对于 'margin-left''margin-right' 计算值为 'auto' 的情况,实际值为 '0'。

10.3.2 内联,替换元素

对于 'margin-left''margin-right' 计算值为 'auto' 的情况,实际值为 '0'。

如果 'height''width' 的计算值均为 'auto' 且元素有固有宽度,则该固有宽度即为 'width' 的实际值。

如果 'height''width' 的计算值均为 'auto' 且元素没有固有宽度,但有固有高度和固有比例;或者如果 'width' 的计算值为 'auto','height' 有其他计算值,且元素有固有比例;则 'width' 的实际值为:

(实际高度) * (固有比例)

如果 'height' 和 'width' 的计算值均为 'auto' 且元素有固有比例但没有固有高度或宽度,则在 CSS 2.2 中 'width' 的实际值是未定义的。然而,建议如果包含块的宽度不依赖于替换元素的宽度,则 'width' 的实际值应通过用于正常流中块级非替换元素的约束方程来计算。

否则,如果 'width' 的计算值为 'auto' 且元素有固有宽度,则该固有宽度即为 'width' 的实际值。

否则,如果 'width' 的计算值为 'auto',但不满足上述条件,则 'width' 的实际值为 300px。如果 300px 太宽而无法适应设备,用户代理应使用宽高比为 2:1 且适合设备的最大矩形的宽度。

10.3.3 块级,非替换元素在正常流中

以下约束条件必须适用于其他属性的实际值:

'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' = 包含块的宽度。

如果 'width' 不是 'auto',且 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width'(加上任何非 'auto' 的 'margin-left' 或 'margin-right')大于包含块的宽度,则以下规则将把任何 'auto' 值的 'margin-left' 或 'margin-right' 视为零。

如果上述所有属性的计算值都不是 'auto',则这些值被称为“过度约束”,其中一个实际值必须与其计算值不同。如果包含块的 'direction' 属性值为 'ltr',则指定的 'margin-right' 值将被忽略,并计算该值以使等式成立。如果 'direction' 的值为 'rtl',则这种情况发生在 'margin-left'

如果正好有一个值被指定为 'auto',则其实际值由等式得出。

如果 'width' 被设置为 'auto',则任何其他 'auto' 值变为 '0','width' 由结果等式得出。

如果 'margin-left''margin-right' 都是 'auto',它们的实际值相等。这会使元素相对于包含块的边缘水平居中。

10.3.4 块级、替换元素在正常流中的宽度

对于替换元素,'width' 的使用值的确定方式与 行内替换元素 相同。 然后应用 块级非替换元素 的规则来确定边距。

10.3.5 浮动的、非替换元素的宽度

如果 'margin-left''margin-right' 被计算为 'auto',它们的使用值为 '0'。

如果 'width' 被计算为 'auto',使用值为“缩小适应”宽度。

缩小适应宽度的计算类似于使用自动表格布局算法计算表格单元格的宽度。大致上:通过格式化内容来计算首选宽度,不在显式换行之外进行换行,同时计算首选的最小宽度,例如,通过尝试所有可能的换行来实现。CSS 2.2 并未定义确切的算法。第三步,找到可用宽度:在这种情况下,这是包含块的宽度减去 'margin-left'、'border-left-width'、'padding-left'、'padding-right'、'border-right-width'、'margin-right' 的使用值,以及任何相关滚动条的宽度。

然后缩小适应宽度为:min(max(首选最小宽度, 可用宽度), 首选宽度)。

10.3.6 浮动的、替换元素

如果 'margin-left''margin-right' 被计算为 'auto',它们的使用值为 '0'。'width' 的使用值如 行内替换元素 的情况一样确定。

10.3.7 绝对定位的、非替换元素

为了本节和下一节的目的,术语 "static position"(元素的静态位置)大致指元素在正常流中应有的位置。更准确地说:

但用户代理可以自由地猜测其可能的位置,而无需实际计算该假设框的尺寸。

在计算静态位置时,固定定位元素的包含块是初始包含块,而不是视口,并且应假定所有可滚动的框都滚动到其原点。

确定这些元素的使用值的约束条件是:

'left' + 'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' + 'right' = 包含块的宽度

如果 'left'、'width' 和 'right' 都是 'auto':首先将 'margin-left' 和 'margin-right' 的任何 'auto' 值设置为 0。然后,如果建立静态位置包含块的元素的 'direction' 属性为 'ltr',则将 'left' 设置为静态位置并应用下面的第三条规则;否则,将 'right' 设置为静态位置并应用下面的第一条规则。

如果三者都不是 'auto':如果 'margin-left' 和 'margin-right' 都是 'auto',则在附加约束下求解该方程,即两个边距获得相等的值,除非这会使它们变为负值,在这种情况下,当包含块的方向为 'ltr'('rtl')时,将 'margin-left'('margin-right')设置为零并求解 'margin-right'('margin-left')。如果 'margin-left' 或 'margin-right' 中有一个是 'auto',则求解该值的方程。如果这些值过度约束,则忽略 'left' 的值(如果包含块的 'direction' 属性为 'rtl')或 'right'(如果 'direction' 为 'ltr')的值并求解该值。

否则,将 'margin-left' 和 'margin-right' 的 'auto' 值设置为 0,然后选择以下适用的六条规则之一。

  1. 'left' 和 'width' 是 'auto' 而 'right' 不是 'auto',则宽度是缩小适应宽度。然后求解 'left'
  2. 'left' 和 'right' 是 'auto' 而 'width' 不是 'auto',则如果建立静态位置包含块的元素的 'direction' 属性为 'ltr',则将 'left' 设置为 静态位置,否则将 'right' 设置为 静态位置。然后求解 'left'(如果 'direction' 是 'rtl')或 'right'(如果 'direction' 是 'ltr')。
  3. 'width' 和 'right' 是 'auto' 而 'left' 不是 'auto',则宽度是缩小适应宽度。然后求解 'right'
  4. 'left' 是 'auto','width' 和 'right' 不是 'auto',则求解 'left'
  5. 'width' 是 'auto','left' 和 'right' 不是 'auto',则求解 'width'
  6. 'right' 是 'auto','left' 和 'width' 不是 'auto',则求解 'right'

缩小适应宽度的计算类似于使用自动表格布局算法计算表格单元格的宽度。大致上:通过格式化内容来计算首选宽度,不在显式换行之外进行换行,并且还计算首选的最小宽度,例如,通过尝试所有可能的换行。CSS 2.2 未定义确切的算法。第三步,计算可用宽度:通过在设置 'left'(在情况 1 中)或 'right'(在情况 3 中)为 0 之后求解 'width' 来找到它。

然后缩小适应宽度为:min(max(首选最小宽度, 可用宽度), 首选宽度)。

10.3.8 绝对定位的替换元素

在这种情况下,第 10.3.7 节适用于约束方程式的前半部分,但剩余部分由以下规则替代:

  1. 使用值'width'的确定方式与行内替换元素相同。如果'margin-left''margin-right'被指定为'auto',则其使用值由以下规则确定。
  2. 如果'left''right'都为'auto',那么如果建立静态位置包含块的元素的'direction'属性为'ltr',将'left'设置为静态位置;如果'direction'为'rtl',则将'right'设置为静态位置。
  3. 如果'left''right'为'auto',将'margin-left''margin-right'中的任何'auto'替换为'0'。
  4. 如果此时'margin-left''margin-right'仍然为'auto',则在附加约束条件下求解方程,即两个边距必须获得相等的值,除非这会使它们变为负值。在这种情况下,当包含块的方向为'ltr'('rtl')时,将'margin-left''margin-right')设置为零,并求解'margin-right''margin-left')。
  5. 如果此时仍有一个'auto'值,则为该值求解方程。
  6. 如果此时这些值过度约束,忽略'left'的值(如果包含块的'direction'属性为'rtl')或'right'的值(如果'direction'为'ltr'),并求解该值。

10.3.9 “行内块”正常流中的非替换元素

如果'width'为'auto',则使用的值为缩小以适应的宽度,如浮动元素。

对于'margin-left''margin-right'的计算值为'auto',使用的值为'0'。

10.3.10 “行内块”正常流中的替换元素

行内替换元素完全相同。

10.4 最小和最大宽度'min-width''max-width'

名称: min-width
值: <length> | <percentage> | inherit
初始值: 0
适用于: 所有元素,但非替换行内元素、表格行和行组除外
继承:
百分比: 参考包含块的宽度
媒体: 视觉
计算值: 按指定的百分比或绝对长度计算
名称: max-width
值: <length> | <percentage> | none | inherit
初始值: none
适用于: 所有元素,但非替换行内元素、表格行和行组除外
继承:
百分比: 参考包含块的宽度
媒体: 视觉
计算值: 按指定的百分比或绝对长度或“none”计算

这两个属性允许作者将内容宽度限制在一定范围内。其值有以下含义:

<length>
指定固定的最小或最大使用宽度。
<percentage>
指定用于确定使用值的百分比。百分比是根据生成的框的包含块的宽度计算的。如果包含块的宽度为负,则使用值为零。如果包含块的宽度取决于此元素的宽度,则 CSS 2.2 中的布局结果是未定义的。
none
(仅在'max-width'上使用)没有对框宽度的限制。

'min-width''max-width'的负值是非法的。

在 CSS 2.2 中,'min-width'和'max-width'对表格、行内表格、表格单元格、表格列和列组的影响是未定义的。

以下算法描述了这两个属性如何影响使用值'width'属性:

  1. 根据上述“计算宽度和边距”规则(不考虑'min-width''max-width'),计算初步使用的宽度。
  2. 如果初步使用的宽度大于'max-width',则再次应用上述规则,但这次使用'max-width'的计算值作为'width'的计算值。
  3. 如果得到的宽度小于'min-width',则再次应用上述规则,但这次使用'min-width'的计算值作为'width'的计算值。

这些步骤不会影响上述属性的实际计算值。

然而,对于具有固有比例并且'a'和'b'均指定为'auto'的替换元素,算法如下:

从表中选择适当约束违反情况下的解决宽度和高度值。将max-widthmax-height作为max(min, max),以便保持minmax。在此表中,wh表示忽略'min-width''min-height''max-width''max-height'属性的宽度和高度计算结果。

注意:在设置了显式宽度或高度且另一侧为自动的情况下,应用最小或最大限制可能会导致约束过多的情况。规范对此行为有明确规定,但可能与作者的预期不符。在这种情况下,可以使用 CSS3 object-fit 属性来获得不同的结果。

约束违反 解决宽度 解决高度
w h
w > max-width max-width max(max-width * h/w, min-height)
w < min-width min-width min(min-width * h/w, max-height)
h > max-height max(max-height * w/h, min-width) max-height
h < min-height min(min-height * w/h, max-width) min-height
(w > max-width) 和 (h > max-height), 其中(max-width/w ≤ max-height/h) max-width max(min-height, max-width * h/w)
(w > max-width) 和 (h > max-height), 其中(max-width/w > max-height/h) max(min-width, max-height * w/h) max-height
(w < min-width) 和 (h < min-height), 其中(min-width/w ≤ min-height/h) min(max-width, min-height * w/h) min-height
(w < min-width) 和 (h < min-height), 其中(min-width/w > min-height/h) min-width min(max-height, min-width * h/w)
(w < min-width) 和 (h > max-height) min-width max-height
(w > max-width) 和 (h < min-height) max-width min-height

然后按照上述“计算宽度和边距”规则进行操作,就好像'width'是根据该值计算的一样。

10.5 内容高度'height' 属性

名称: height
值: <length> | <percentage> | auto | inherit
初始值: auto
适用于: 所有元素,但非替换行内元素、表格列和列组除外
继承:
百分比: 见下文
媒体: 视觉
计算值: 按指定的百分比或“auto”或绝对长度计算

此属性指定盒子的内容高度

此属性不适用于非替换的行内元素。有关用于此类元素的规则,请参见计算高度和边距的章节。

值的含义如下:

<length>
使用长度值指定内容区域的高度。
<percentage>
指定百分比高度。百分比是相对于生成的盒子的包含块的高度计算的。如果包含块的高度没有明确指定(即取决于内容高度),并且此元素不是绝对定位的,则使用高度按“auto”来计算。根元素上的百分比高度是相对于初始包含块的。
auto
高度取决于其他属性的值。详见下文。

请注意,绝对定位元素的包含块的高度独立于元素本身的大小,因此可以始终解析此类元素上的百分比高度。然而,可能在处理文档中的后续元素之前,高度尚未确定。

负值的'height'是非法的。

示例:

例如,以下规则将段落的内容高度设置为100像素:

p { height: 100px }

内容高度超过100像素的段落将根据溢出属性按'overflow'属性处理。

10.6 计算高度和边距

在计算'top''margin-top''height''margin-bottom''bottom'的值时,必须区分不同类型的盒子:

  1. 行内、非替换元素
  2. 行内、替换元素
  3. 常规流中的块级、非替换元素
  4. 常规流中的块级、替换元素
  5. 浮动、非替换元素
  6. 浮动、替换元素
  7. 绝对定位的非替换元素
  8. 绝对定位的替换元素
  9. 常规流中的‘行内块’、非替换元素
  10. 常规流中的‘行内块’、替换元素

对于第1-6和第9-10项,‘top’和‘bottom’的使用值由第9.4.3节的规则确定。

注意:这些规则同样适用于根元素,如同其他元素一样。

注意:下面计算出的‘height’使用值是一个初步值,可能需要多次计算,具体取决于'min-height''max-height',详见最小和最大高度章节。

10.6.1 行内、非替换元素

'height' 属性不适用。内容区域的高度应基于字体,但本规范未指定如何计算。用户代理(UA)可以例如使用 em-box 或字体的最大升序线和降序线来确定高度。(后者可以确保字符的部分位于 em-box 之外时仍在内容区域内,但会导致不同字体的盒子大小不同;前者则可以确保作者可以相对于 'line-height' 控制背景样式,但会导致字符绘制在其内容区域之外。)

注意:CSS 的第三级可能会包含一个属性,用于选择字体的哪一部分用于内容高度的计算。

行内非替换盒子的垂直填充、边框和边距从内容区域的顶部和底部开始,与'line-height'无关。但计算行框高度时,仅使用'line-height'

如果使用了多个字体(例如当字符在不同字体中找到时可能发生),本规范未定义内容区域的高度。然而,我们建议选择的高度应使内容区域刚好足以容纳所有字体的(1)em-box 或(2)最大升序线和降序线。请注意,根据字体的基线对齐方式,这可能比任何涉及的字体大小都要大。

10.6.2 行内替换元素,常规流中的块级替换元素,常规流中的‘行内块’替换元素以及浮动替换元素

如果'margin-top''margin-bottom'为 'auto',则其使用值为 0。

如果'height''width'的计算值均为 'auto',且元素具有内在高度,则该内在高度为'height'的使用值。

否则,如果'height'的计算值为 'auto',且元素具有内在比例,则'height'的使用值为:

(使用宽度) / (内在比例)

否则,如果'height'的计算值为 'auto',且元素具有内在高度,则该内在高度为'height'的使用值。

否则,如果'height'的计算值为 'auto',但不满足上述任何条件,则'height'的使用值必须设置为具有2:1比例、高度不超过150px且宽度不超过设备宽度的最大矩形的高度。

10.6.3 正常流中 'overflow' 计算为 'visible' 时的块级非替换元素

本节也适用于在正常流中当 'overflow' 未计算为 'visible' 但已传播到视口的块级非替换元素。

如果'margin-top''margin-bottom'为 'auto',则它们的使用值为 0。如果'height'为 'auto',高度取决于该元素是否有任何块级子元素以及是否具有填充或边框:

该元素的高度是从其顶部内容边缘到以下第一个适用条件的距离:

  1. 最后一个行框的底边缘,如果该框建立了一个或多个行的内联格式化上下文
  2. 其最后一个流内子元素的底部(可能合并的)边距的底边缘,如果该子元素的底边距未与该元素的底边距合并
  3. 最后一个流内子元素的底部边框边缘,其顶部边距未与该元素的底边距合并
  4. 否则为零

仅考虑正常流中的子元素(即,忽略浮动框和绝对定位的框,相对定位的框在不考虑其偏移的情况下进行考虑)。请注意,子框可能是匿名块框。

10.6.4 绝对定位的非替换元素

在本节和下一节中,术语“静态位置”(元素的静态位置)大致指的是元素在正常流中本应具有的位置。更确切地说,‘top’ 的静态位置是包含块的顶部边缘到假设框顶部边距边缘的距离,该假设框本应是元素的第一个框,如果它的指定 'position' 值是 'static',其指定的 'float' 是 'none',并且其指定的 'clear' 是 'none'。 (请注意,由于第9.7节中的规则,这可能还需要假设一个不同的 'display' 计算值。) 如果假设框位于包含块上方,则该值为负。

但用户代理可以自由地猜测其可能的位置,而不是实际计算该假设框的尺寸。

为了计算静态位置,固定定位元素的包含块是初始包含块,而不是视口。

对于绝对定位的元素,垂直尺寸的使用值必须满足以下约束:

'top' + 'margin-top' + 'border-top-width' + 'padding-top' + 'height' + 'padding-bottom' + 'border-bottom-width' + 'margin-bottom' + 'bottom' = 包含块的高度

如果 'top'、'height' 和 'bottom' 都是 auto,请将 'top' 设置为静态位置并应用以下第三条规则。

如果三者都不是 'auto':如果 'margin-top' 和 'margin-bottom' 都是 'auto',则在附加约束下求解方程,使两个边距的值相等。如果 'margin-top' 或 'margin-bottom' 之一为 'auto',则求解该值。如果值超出约束范围,请忽略 'bottom' 的值并求解该值。

否则,选择以下适用的六条规则之一。

  1. 'top' 和 'height' 为 'auto','bottom' 不是 'auto',则高度 根据内容基于 10.6.7,将 'margin-top' 和 'margin-bottom' 的 'auto' 值设为 0,并求解 'top'
  2. 'top' 和 'bottom' 为 'auto','height' 不是 'auto',则将 'top' 设置为静态位置,将 'margin-top' 和 'margin-bottom' 的 'auto' 值设为 0,并求解 'bottom'
  3. 'height' 和 'bottom' 为 'auto','top' 不是 'auto',则高度 根据内容基于 10.6.7,将 'margin-top' 和 'margin-bottom' 的 'auto' 值设为 0,并求解 'bottom'
  4. 'top' 为 'auto','height' 和 'bottom' 不是 'auto',则将 'margin-top' 和 'margin-bottom' 的 'auto' 值设为 0,并求解 'top'
  5. 'height' 为 'auto','top' 和 'bottom' 不是 'auto',则将 'margin-top' 和 'margin-bottom' 的 'auto' 值设为 0,并求解 'height'
  6. 'bottom' 为 'auto','top' 和 'height' 不是 'auto',则将 'margin-top' 和 'margin-bottom' 的 'auto' 值设为 0,并求解 'bottom'

10.6.5 绝对定位的替换元素

这种情况与前一种情况类似,不同之处在于该元素具有固有高度。替换顺序如下:

  1. 'height' 的使用值按照内联替换元素的规则确定。如果 'margin-top' 或 'margin-bottom' 指定为 'auto',其使用值将按照以下规则确定。
  2. 如果 'top''bottom' 都为 'auto',则用元素的静态位置替换 'top'
  3. 如果 'bottom' 为 'auto',则将 'margin-top''margin-bottom' 上的任何 'auto' 替换为 '0'。
  4. 如果此时 'margin-top''margin-bottom' 都仍为 'auto',则在附加约束条件下求解方程,使两个边距的值相等。
  5. 如果此时只剩下一个 'auto',则为该值求解方程。
  6. 如果此时值超出了约束范围,则忽略 'bottom' 的值并求解该值。

10.6.6 复杂情况

本节适用于:

如果 'margin-top''margin-bottom' 的值为 'auto',则其使用值为 0。如果 'height' 的值为 'auto',则 高度取决于该元素的后代,参见 10.6.7

对于 '内联块级'元素,计算行框高度时使用外边距框。

10.6.7 块级格式化上下文根元素的 'Auto' 高度

在某些情况下(例如,参见上述的 10.6.410.6.6 部分),建立块级格式化上下文的元素的高度按如下计算:

如果它只有内联级子元素,高度为最顶行框的顶部与最底行框的底部之间的距离。

如果它有块级子元素,高度为最顶块级子元素框的上外边距边缘与最底块级子元素框的下外边距边缘之间的距离。

绝对定位的子元素被忽略,相对定位的框不考虑它们的偏移。注意,子元素框可以是匿名块级框

此外,如果该元素有任何浮动的后代,其下外边距边缘低于元素的下内容边缘,则高度增加以包括这些边缘。仅考虑参与此块级格式化上下文的浮动元素,例如,绝对定位的后代或其他浮动元素内的浮动元素不予考虑。

10.7 最小高度和最大高度'min-height''max-height'

有时需要将元素的高度限制在某个范围内。以下两个属性提供了这种功能:

Name: min-height
Value: <length> | <percentage> | inherit
Initial: 0
Applies to: 所有元素,但非替换的内联元素、表格列和列组除外
Inherited:
Percentages: 见说明
Media: 视觉
Computed value: 指定的百分比或绝对长度
Name: max-height
Value: <length> | <percentage> | none | inherit
Initial: none
Applies to: 所有元素,但非替换的内联元素、表格列和列组除外
Inherited:
Percentages: 见说明
Media: 视觉
Computed value: 指定的百分比或绝对长度或'none'

这两个属性允许作者将框的高度限制在某个范围内。其值的含义如下:

<length>
指定固定的最小或最大计算高度。
<percentage>
指定用于确定使用值的百分比。该百分比是相对于生成的框的包含块的高度计算的。如果包含块的高度未明确指定(即,它取决于内容高度),并且此元素未绝对定位,则百分比值被视为 '0'(对于'min-height')或 'none'(对于'max-height')。
none
(仅限于'max-height')对框的高度没有限制。

'min-height''max-height'的负值是非法的。

在 CSS 2.2 中,'min-height' 和 'max-height' 对表格、内联表格、表格单元格、表格行和行组的影响是未定义的。

以下算法描述了这两个属性如何影响使用值的计算'height'属性:

  1. 首先计算暂定的使用高度(不考虑'min-height''max-height'),按照上文“计算高度和边距”中的规则。
  2. 如果此暂定高度大于 'max-height',则重新应用上文的规则,但这次使用 'max-height' 的值作为 'height' 的计算值。
  3. 如果结果高度小于 'min-height',则再次应用上述规则,但这次使用 'min-height' 的值作为 'height' 的计算值。

这些步骤不会影响 'height' 属性的实际计算值。因此,例如,它们不会影响依赖于计算值的边距折叠。

但是,对于同时计算 'width''height' 为 'auto' 的替换元素,请使用上述“最小和最大宽度”中的算法来确定使用的宽度和高度。然后应用上文“计算高度和边距”中的规则,使用结果的宽度和高度作为计算值。

10.8 行高计算'line-height''vertical-align' 属性

内联格式化上下文一节中所述,用户代理将内联级别的框流入垂直堆叠的行框中。行框的高度确定如下:

  1. 计算行框中每个内联级别框的高度。 对于替换元素、内联块级元素和内联表格元素,这是它们的外边距框的高度;对于内联框,这是它们的 'line-height'。 (参见“计算高度和边距”“行间距与半行间距”中的内联框高度。)
  2. 根据它们的'vertical-align'属性垂直对齐内联级别框。 如果它们对齐为 'top' 或 'bottom',则必须对齐以最小化行框高度。如果这些框足够高,则可能存在多种解决方案,而 CSS 2.2 并未定义行框基线的位置(即支柱的位置,见下文)。
  3. 行框的高度是从最上面的框顶到最下面的框底的距离。(这包括支柱,如'line-height'一节中所述。)

空的内联元素生成空的内联框,但这些框仍然有外边距、内边距、边框和行高,因此像有内容的元素一样影响这些计算。

10.8.1 行间距与半行间距

CSS 假定每个字体都有字体度量,它们指定了基线之上的特征高度和基线下的深度。在本节中,我们使用 A 表示该高度(对于给定字体在给定大小下)和 D 表示深度。我们还定义 AD = A + D,即从顶部到底部的距离。(有关如何找到 AD 的说明,请参阅下面的 注释)。请注意,这些是整个字体的度量,不一定对应于任何单个字形的上升部和下降部。

用户代理必须将非替换内联框中的字形按照它们的相关基线对齐。然后,对于每个字形,确定 AD。请注意,单个元素中的字形可能来自不同的字体,因此它们不一定都具有相同的 AD。如果内联框根本不包含字形,则认为它包含一个支柱(一个零宽度的不可见字形),其 AD 取自元素的第一个可用字体。

仍然针对每个字形,确定要添加的行间距 L,其中 L = 'line-height' - AD。将一半的行间距添加到 A 之上,另一半添加到 D 之下,从而使字形及其行间距的总高度为 A' = A + L/2,总深度为 D' = D + L/2。

注意: L 可能为负值。

内联框的高度包含所有字形及其每侧的半行间距,因此恰好为 'line-height'。子元素的框不会影响此高度。

尽管非替换元素的边距、边框和内边距不会影响行框计算,但它们仍会围绕内联框进行渲染。这意味着如果 'line-height' 指定的高度小于所包含框的内容高度,则内边距和边框的背景和颜色可能会“溢出”到相邻的行框中。用户代理应按照文档顺序渲染框。这将导致后续行上的边框覆盖之前行的边框和文本。

注意: CSS 2.2 并未定义内联框的内容区域是什么(参见上面的 10.6.1),因此不同的用户代理可能会在不同位置绘制背景和边框。

注意: 建议使用 OpenType 或 TrueType 字体的实现使用字体 OS/2 表中的 "sTypoAscender" 和 "sTypoDescender" 度量作为 A 和 D(缩放到当前元素的字体大小后)。如果没有这些度量,应使用 HHEA 表中的 "Ascent" 和 "Descent" 度量。

名称: line-height
值: normal | <number> | <length> | <percentage> | inherit
初始值: normal
适用于: 所有元素
继承:
百分比: 相对于元素本身的字体大小
媒体: 视觉
计算值: 对于 <length><percentage> 为绝对值;否则按指定计算

在内容由内联级元素组成的块容器元素上,'line-height' 指定了元素中行框的 最小 高度。最小高度由基线上方的最小高度和基线下方的最小深度组成,完全如同每个行框都从一个带有元素字体和行高属性的零宽度内联框开始。我们将这个假想的框称为“支柱”。(该名称受到 TeX 的启发)。

假定字体的高度和基线之下的深度是字体中包含的度量。(更多细节,请参见 CSS level 3)。

在非替换内联元素上,'line-height' 指定了用于计算行框高度的高度。

该属性的值有以下含义:

normal
告诉用户代理将使用值设置为基于元素字体的“合理”值。该值的含义与<number>相同。我们建议 'normal' 的使用值在 1.0 到 1.2 之间。计算值为 'normal'。
<length>
指定的长度用于计算行框的高度。负值是非法的。
<number>
该属性的使用值是该数值乘以元素的字体大小。负值是非法的。计算值与指定值相同。
<percentage>
该属性的计算值是该百分比乘以元素的计算字体大小。负值是非法的。

示例:

下面示例中的三个规则具有相同的最终行高:

div { line-height: 1.2; font-size: 10pt }     /* 数字 */
div { line-height: 1.2em; font-size: 10pt }   /* 长度 */
div { line-height: 120%; font-size: 10pt }    /* 百分比 */

当元素包含以多个字体呈现的文本时,用户代理可以根据最大字体大小确定 'normal' 'line-height' 值。

注意: 当所有内联框在块容器框中都只有一个 'line-height' 值,并且它们都使用相同的字体(且没有替换元素、内联块级元素等),上述规则将确保连续行的基线之间的距离正好是 'line-height'。当需要对齐不同字体的文本列时,例如在表格中,这一点非常重要。

名称: vertical-align
值: baseline | sub | super | top | text-top | middle | bottom | text-bottom | <percentage> | <length> | inherit
初始值: baseline
适用于: 内联级元素和 'table-cell' 元素
继承:
百分比: 相对于元素本身的 'line-height'
媒体: 视觉
计算值: 对于 <percentage><length> 为绝对值,否则按指定计算

此属性影响内联级元素生成的框在行框内的垂直定位。

注意: 此属性的值在表格的上下文中有不同的含义。有关详细信息,请查阅表格高度算法部分。

以下值仅在与父内联元素或父块容器元素的支柱有关时才有意义。

在以下定义中,对于非替换内联元素,用于对齐的框是高度为 'line-height' 的框(包含框的字形及其每侧的半行距,参见上文)。对于所有其他元素,用于对齐的框是外边距框。

baseline
将框的基线与父框的基线对齐。如果框没有基线,则将底部外边距边缘与父框的基线对齐。
middle
将框的垂直中点与父框基线加上父框一半 x-height 的高度对齐。
sub
将框的基线降低到父框的下标位置。(此值不影响元素文本的字体大小。)
super
将框的基线提高到父框的上标位置。(此值不影响元素文本的字体大小。)
text-top
将框的顶部与父框的内容区域顶部对齐(参见10.6.1)。
text-bottom
将框的底部与父框的内容区域底部对齐(参见10.6.1)。
<percentage>
根据此距离(为'line-height'值的百分比)上升(正值)或下降(负值)框。值 '0%' 意味着与 'baseline' 相同。
<length>
根据此距离上升(正值)或下降(负值)框。值 '0cm' 意味着与 'baseline' 相同。

以下值相对于行框对齐元素。由于该元素可能有相对于它对齐的子元素(它们可能有相对于它们对齐的后代),这些值使用对齐子树的边界。内联元素的对齐子树包含该元素和所有子内联元素的对齐子树,这些子元素的计算 'vertical-align' 值不是 'top' 或 'bottom'。对齐子树的顶部是子树中框的最高点,底部也是类似的。

top
将对齐子树的顶部与行框的顶部对齐。
bottom
将对齐子树的底部与行框的底部对齐。

'inline-table' 的基线是表格第一行的基线。

'inline-block' 的基线是其正常流中最后一个行框的基线,除非它没有流内行框或其 'overflow' 属性的计算值不是 'visible',在这种情况下,基线是底部外边距边缘。