10 Visual formatting model details

Contents

10.1 Definition of "containing block"

The position and size of an element's box(es) are sometimes computedcalculated relative to a certain rectangle, called the containing block of the element. The containing block of an element is defined as follows:

  1. The containing block (called the initial containing block)in which the root element lives is chosen bya rectangle with the user agent.dimensions of the viewport, anchored at the canvas origin for continuous media, and the page area for paged media. This containing block is called the initial containing block. The 'direction' property of the initial containing block is the same as for the root element.
  2. For other elements, unlessif the elementelement's position is absolutely positioned ,'relative' or 'static', the containing block is formed by the content edge of the nearest block-level, table cell or inline-block ancestor box.
  3. If the element has 'position: fixed', the containing block is established by the viewport .in the case of continuous media or the page box in the case of paged media
  4. If the element has 'position: absolute', the containing block is established by the nearest ancestor with a 'position' other than 'static',of 'absolute', 'relative' or 'fixed', in the following way:
    1. In the case that the ancestor is block-level, the containing block is formed by the padding edge of the ancestor. In the case that the ancestor isinline-level, the containing block depends on the 'direction' property of the ancestor:
      1. If the 'direction' is 'ltr', the top and left of the containing block are the top and left contentpadding edges of the first box generated by the ancestor, and the bottom and right are the bottom and right contentpadding edges of the last box of the ancestor.
      2. If the 'direction' is 'rtl', the top and right are the top and right padding edges of the first box generated by the ancestor, and the bottom and left are the bottom and left contentpadding edges of the last box of the ancestor.

      Note: This may cause the containing block's width to be negative.

    2. Otherwise, the containing block is formed by the padding edge of the ancestor.

    If there is no such ancestor, the content edge of the root element's box establishes thecontaining block. Example(s): With no positioning,block is the initial containing blocks (C.B.)block.

In the following document: <HTML> <HEAD> <TITLE>Illustration of containing blocks</TITLE> </HEAD> <BODY id="body"> <DIV id="div1"> <P id="p1">Thispaged media, an absolutely positioned element is text inpositioned relative to its containing block ignoring any page breaks (as if the first paragraph...</P> <P id="p2">This is text <EM id="em1"> indocument were continuous). The <STRONG id="strong1">second</STRONG> paragraph.</EM></P> </DIV> </BODY> </HTML>element may subsequently be broken over several pages.

For absolutely positioned content that resolves to a position on a page other than the page being laid out (the current page), or resolves to a position on the current page which has already been rendered for printing, printers may place the content

Note that a block-level element that is split over several pages may have a different width on each page and that there may be device-specific limits.

Example(s):

With no positioning, the containing blocks (C.B.) in the following document:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML>
   <HEAD>
      <TITLE>Illustration of containing blocks</TITLE>
   </HEAD>
   <BODY id="body">
      <DIV id="div1">
      <P id="p1">This is text in the first paragraph...</P>
      <P id="p2">This is text <EM id="em1"> in the 
      <STRONG id="strong1">second</STRONG> paragraph.</EM></P>
      </DIV>
   </BODY>
</HTML>

are established as follows:

For box generated by C.B. is established by
bodyhtmlinitial C.B. (UA-dependent)
bodyhtml
div1body
p1div1
p2div1
em1p2
strong1p2

If we position "div1":

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

its containing block is no longer "body"; it becomes the initial containing block (since there are no other positioned ancestor boxes).

If we position "em1" as well:

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

the table of containing blocks becomes:

For box generated by C.B. is established by
bodyhtmlinitial C.B. (UA-dependent)
bodyhtml
div1initial C.B.
p1div1
p2div1
em1div1
strong1em1

By positioning "em1", its containing block becomes the nearest positioned ancestor box (i.e., that generated by "div1").

10.2 Content width: the 'width' property

'width'
Value:  <length> | <percentage> | auto | inherit
Initial:  auto
Applies to:  all elements but non-replaced inline elements, table rows, and row groups
Inherited:  no
Percentages:  refer to width of containing block
Media:  visual
Computed value:  the percentage or 'auto' as specified or the absolute length; 'auto' if the property does not apply

This property specifies the content width of boxes generated by block-level and replaced elements.

This property does not apply to non-replaced inline-level elements. The content width of a non-replaced inline element's boxes is that of the rendered content within them (before any relative offset of children). Recall that inline boxes flow into line boxes. The width of line boxes is given by the their containing block, but may be shorted by the presence of floats.

The width of a replaced element's box is intrinsic and may be scaled by the user agent if the value of this property is different than 'auto'.

Values have the following meanings:

<length>
Specifies the width of the content area using a fixed width.length unit.
<percentage>
Specifies a percentage width. The percentage is calculated with respect to the width of the generated box's containing block. If the containing block's width depends on this element's width, then the resulting layout is undefined in CSS 2.1. Note: For absolutely positioned elements whose containing block is based on a block-level element, the percentage is calculated with respect to the width of the padding box of that element. This is a change from CSS1, where the percentage width was always calculated with respect to the content box of the parent element.
auto
The width depends on the values of other properties. See the sections below.

Negative values for 'width' are illegal.

Example(s):

For example, the following rule fixes the content width of paragraphs at 100 pixels:

p { width: 100px }

10.3 ComputingCalculating widths and margins

The computedvalues of an element's 'width', 'margin-left', 'margin-right', 'left' and 'right' properties as used for layout depend on the type of box generated and on each other. (The value used for layout is sometimes referred to as the used value.) In principle, the computedvalues used are the same as the specifiedcomputed values, with 'auto' replaced by some suitable value, and percentages calculated based on the containing block, but there are exceptions. The following situations need to be distinguished:

  1. inline, non-replaced elements
  2. inline, replaced elements
  3. block-level, non-replaced elements in normal flow
  4. block-level, replaced elements in normal flow
  5. floating, non-replaced elements
  6. floating, replaced elements
  7. absolutely positioned, non-replaced elements
  8. absolutely positioned, replaced elements
  9. 'inline-block', non-replaced elements in normal flow
  10. 'inline-block', replaced elements in normal flow

For Points 1-6 include relative positioning.and 9-10, the values of 'left' and 'right' used for layout are determined by the rules in section 9.4.3.

10.3.1 Inline, non-replaced elements

The 'width' property does not apply. A specifiedcomputed value of 'auto' for 'left', 'right', 'margin-left' or 'margin-right' becomes a computedused value of '0'.

10.3.2 Inline, replaced elements

A specifiedcomputed value of 'auto' for 'left' , 'right' ,'margin-left' or 'margin-right' becomes a computedused value of '0'.

If 'width' has a specifiedcomputed value of 'auto' for 'width' givesand 'height' also has a computed value of 'auto', the element's intrinsic width asis the used value of 'width', if it has one.

If 'width' has a computed value of 'auto' and 'height' has some other computed value, and the replaced element has an intrinsic ratio, or, if both 'width' and 'height' have computed value.values of 'auto', and the element has no intrinsic width but does have an intrinsic height and intrinsic ratio, then the used value of 'width' is:

(intrinsic ratio) * (used height)

Otherwise, if 'width' has a computed value of 'auto', but none of the conditions above are met, then the used value of 'width' becomes 300px. If 300px is too wide to fit the device, UAs should use the width of the largest rectangle that has a 2:1 ratio and fits the device instead.

Percentage intrinsic widths are first evaluated with respect to the containing block's width, if that width doesn't itself depend on the replaced element's width. If it does, then a percentage intrinsic width on that element can't be resolved and the element is assumed to have no intrinsic width.

10.3.3 Block-level, non-replaced elements in normal flow

If 'left' or 'right' are given as 'auto', their computed value is 0.The following constraints must hold betweenamong the used values of the other properties:

'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' = width of containing block

(If the border styleIf 'width' is 'none', use '0' asnot 'auto' and 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' (plus any of 'margin-left' or 'margin-right' that are not 'auto') is larger than the border width.)width of the containing block, then any 'auto' values for 'margin-left' or 'margin-right' are, for the following rules, treated as zero.

If all of the above have a specifiedcomputed value other than 'auto', the values are said to be "over-constrained" and one of the computedused values will have to be different from its specifiedcomputed value. If the 'direction' property of the containing block has the value 'ltr', the specified value of 'margin-right' is ignored and the value is computedcalculated so as to make the equality true. If the value of 'direction' is 'ltr','rtl', this happens to 'margin-left' instead.

If there is exactly one value specified as 'auto', its computedused value follows from the equality.

If 'width' is set to 'auto', any other 'auto' values become '0' and 'width' follows from the resulting equality.

If both 'margin-left' and 'margin-right' are 'auto', their computedused values are equal. This horizontally centers the element with respect to the edges of the containing block.

10.3.4 Block-level, replaced elements in normal flow

If 'left' or 'right' are 'auto', their computedThe used value is 0. Ifof 'width' is specifieddetermined as 'auto', its value is the element's intrinsic width. If one of the margins is 'auto', its computed value is given byfor inline replaced elements. Then the constraints above. Furthermore, if both margins are 'auto', their computed valuesrules for non-replaced block-level elements are equal.applied to determine the margins.

10.3.5 Floating, non-replaced elements

If 'left' , 'right' , 'width' ,'margin-left', or 'margin-right' are specifiedcomputed as 'auto', their computedused value is '0'.

If 'width' is computed as 'auto', the used value is the "shrink-to-fit" width.

Calculation of the shrink-to-fit width is similar to calculating the width of a table cell using the automatic table layout algorithm. Roughly: calculate the preferred width by formatting the content without breaking lines other than where explicit line breaks occur, and also calculate the preferred minimum width, e.g., by trying all possible line breaks. CSS 2.1 does not define the exact algorithm. Thirdly, find the available width: in this case, this is the width of the containing block minus the used values of 'margin-left', 'border-left-width', 'padding-left', 'padding-right', 'border-right-width', 'margin-right', and the widths of any relevant scroll bars.

Then the shrink-to-fit width is: min(max(preferred minimum width, available width), preferred width).

10.3.6 Floating, replaced elements

If 'left' , 'right' ,'margin-left' or 'margin-right' are specifiedcomputed as 'auto', their computedused value is '0'. If 'width' is 'auto', itsThe used value of 'width' is the element's intrinsic width.determined as for inline replaced elements.

10.3.7 Absolutely positioned, non-replaced elements

The constraint that determines the computed valuesFor these elements is: 'left' + 'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' + 'right' = width of containing block (Ifthe border style is 'none', use '0' aspurposes of this section and the border width.)next, the solutionterm "static position" (of an element) refers, roughly, to this constraint is reached through a number of substitutionsthe position an element would have had in the following order: If 'left' hasnormal flow. More precisely:

If 'width'But rather than actually calculating the dimensions of that hypothetical box, user agents are free to make a guess at its probable position.

For the purposes of calculating the static position, the containing block of fixed positioned elements is 'auto', replace any remaining 'auto'the initial containing block instead of the viewport, and all scrollable boxes should be assumed to be scrolled to their origin.

The constraint that determines the used values for these elements is:

'left' or+ 'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' + 'right' with '0'.= width of containing block

If 'left' ,all three of 'left', 'width', and 'right' or 'width'are (still) 'auto', replace'auto': First set any 'auto' onvalues for 'margin-left' orand 'margin-right' with '0'.to 0. Then, if the 'direction' property of the containing block is 'ltr' set 'left' to the static position and apply rule number three below; otherwise, set 'right' to the static position and apply rule number one below.

If none of the three is 'auto': If at this pointboth 'margin-left' and 'margin-right' are still'auto', solve the equation under the extra constraint that the two margins mustget equal values. If atvalues, unless this point therewould make them negative, in which case when direction of the containing block is only'ltr' ('rtl'), set 'margin-left' ('margin-right') to zero and solve for 'margin-right' ('margin-left'). If one 'auto' left,of 'margin-left' or 'margin-right' is 'auto', solve the equation for that value. If at this pointthe values are over-constrained, ignore the value for either'left' (in case the 'direction' property of the containing block is 'rtl') or 'right' (in case 'direction' is 'ltr') and solve for that value.

10.3.8 Absolutely positioned, replaced elements This situation is similarOtherwise, set 'auto' values for 'margin-left' and 'margin-right' to 0, and pick the previous one, except that the element has an intrinsic width. The sequenceone of substitutions is now: Ifthe following six rules that applies.

  1. 'left' and 'width' are 'auto' and 'right' is not 'auto', substitutethen the element's intrinsic width. Ifwidth is shrink-to-fit. Then solve for 'left'
  2. has the value'left' and 'right' are 'auto' while 'direction'and 'width' is 'ltr', replace 'auto' with the distance fromnot 'auto', then if the left edge'direction' property of the containing block is 'ltr' set 'left' to the left margin edge of a hypothetical box that would have been the first box of the element if its 'position' property had been 'static'. (But rather than actually computing that box, user agents are freestatic position, otherwise set 'right' to make a guess at its probable position.) The value is negative ifthe hypothetical boxstatic position. Then solve for 'left' (if 'direction is to the left of the containing block. If'rtl') or 'right' has the value 'auto' while(if 'direction' is 'rtl', replace'ltr').
  3. 'width' and 'right' are 'auto' with the distance from the right edge of the containing block to the right margin edge of the same hypothetical box as above. The valueand 'left' is positive ifnot 'auto', then the hypothetical boxwidth is to the left of the containing block's edge. Ifshrink-to-fit . Then solve for 'right'
  4. 'left' oris 'auto', 'width' and 'right' are not 'auto', replace any 'auto' on 'margin-left' or 'margin-right' with '0'. If at this point both 'margin-left'then solve for 'left'
  5. 'width' is 'auto', 'left' and 'margin-right''right' are stillnot 'auto', then solve the equation under the extra constraint that the two margins must get equal values. If at this point therefor 'width'
  6. 'right' is only one 'auto' left,'auto', 'left' and 'width' are not 'auto', then solve the equationfor that value. If at this point the values are over-constrained, ignore'right'

Calculation of the shrink-to-fit width is similar to calculating the width of a table cell using the automatic table layout algorithm. Roughly: calculate the preferred width by formatting the content without breaking lines other than where explicit line breaks occur, and also calculate the preferred minimum width, e.g., by trying all possible line breaks. CSS 2.1 does not define the exact algorithm. Thirdly, calculate the available width: this is found by solving for 'width' after setting 'left' (in case 1) or 'right' (in case 3) to 0.

Then the shrink-to-fit width is: min(max(preferred minimum width, available width), preferred width).

10.3.8 Absolutely positioned, replaced elements

This situation is similar to the previous one, except that the element has an intrinsic width. The sequence of substitutions is now:

  1. The used value of 'width' is determined as for inline replaced elements.
  2. If both 'left' and 'right' have the value 'auto', then if 'direction' of the containing block is 'ltr', set 'left' to the static position; else if 'direction' is 'rtl', set 'right' to the static position.
  3. If 'left' or 'right' are 'auto', replace any 'auto' on 'margin-left' or 'margin-right' with '0'.
  4. If at this point both 'margin-left' and 'margin-right' are still 'auto', solve the equation under the extra constraint that the two margins must get equal values, unless this would make them negative, in which case when the direction of the containing block is 'ltr' ('rtl'), set 'margin-left' ('margin-right') to zero and solve for 'margin-right' ('margin-left').
  5. If at this point there is an 'auto' left, solve the equation for that value.
  6. If at this point the values are over-constrained, ignore the value for either 'left' (in case the 'direction' property of the containing block is 'rtl') or 'right' (in case 'direction' is 'ltr')'direction' is 'ltr') and solve for that value.

10.3.9 'Inline-block', non-replaced elements in normal flow

If 'width' is 'auto', the used value is the shrink-to-fit width as for floating elements.

A computed value of 'auto' for 'margin-left' or 'margin-right' becomes a used value of '0'.

10.3.10 'Inline-block', replaced elements in normal flow

Exactly as inline replaced elements.

10.4 Minimum and maximum widths: 'min-width' and 'max-width'

'min-width'
Value:  <length> | <percentage> | inherit
Initial:  0
Applies to:  all elements but non-replaced inline elements, table rows, and row groups
Inherited:  no
Percentages:  refer to width of containing block
Media:  visual
Computed value:  the percentage as specified or the absolute length
'max-width'
Value:  <length> | <percentage> | none | inherit
Initial:  none
Applies to:  all elements but non-replaced inline elements, table rows, and row groups
Inherited:  no
Percentages:  refer to width of containing block
Media:  visual
Computed value:  the percentage as specified or the absolute length or 'none'

These two properties allow authors to constrain content widths to a certain range. Values have the following meanings:

<length>
Specifies a fixed minimum or maximum used width.
<percentage>
Specifies a percentage for determining the used value. The percentage is calculated with respect to the width of the generated box's containing block. If the containing block's width is negative, the used value is zero. If the containing block's width depends on this element's width, then the resulting layout is undefined in CSS 2.1.
none
(Only on 'max-width') No limit on the width of the box.

Negative values for 'min-width' and 'max-width' are illegal.

The following algorithm describes how the two properties influence the used value of the 'width' property:

  1. The tentative used width is calculated (without 'min-width' and 'max-width') following the rules under "Calculating widths and margins" above.
  2. If the tentative used width is greater than 'max-width', the rules above are applied again, but this time using the computed value of 'max-width' as the computed value for 'width'.
  3. If the resulting width is smaller than 'min-width', the rules above are applied again, but this time using the value of 'min-width' as the computed value for 'width'.

However, for replaced elements with an intrinsic ratio and both 'width' and 'height' specified as 'auto', the algorithm is as follows:

Select from the table the resolved height and width values for the appropriate constraint violation. Take the max-width and max-height as max(min, max) so that min max holds true. In this table w and h stand for the results of the width and height computations ignoring the 'min-width', 'min-height', 'max-width' and 'max-height' properties. Normally these are the intrinsic width and height, but they may not be in the case of replaced elements with intrinsic ratios.

Constraint ViolationResolved WidthResolved Height
none w h
w > max-width max-width max(max-width * h/w, min-height)
< min-width min-width min(min-width * h/w, max-height)
h > max-height max(max-height * w/h, min-width) max-height
< min-height min(min-height * w/h, max-width) min-height
(w > max-width) and solve for that value. 10.4 Minimum(h > max-height), where (max-width/w ≤ max-height/h) max-width max(min-height, max-width * h/w)
(w > max-width) and maximum(h > max-height), where (max-width/w > max-height/h) max(min-width, max-height * w/h) max-height
(< min-width) and (< min-height), where (min-width/w ≤ min-height/h) min(max-width, min-height * w/h) min-height
(< min-width) and (< min-height), where (min-width/w > min-height/h) min-width min(max-height, min-width * h/w)
(< min-width) and (h > max-height) min-width max-height
(w > max-width) and (< min-height) max-width min-height

Then apply the rules under "Calculating widths : 'min-width'and 'max-width' 'min-width'margins" above, as if 'width' were computed as this value.

10.5 Content height: the 'height' property

'height'
Value:  <length> | <percentage> | auto | inherit
Initial:   UA dependentauto
Applies to:  all elements exceptbut non-replaced inline elements andelements, table elementscolumns, and column groups
Inherited:  no
Percentages:   refer to width of containing blocksee prose
Media:  visual
'max-width' Value:Computed value:   <length> |the percentage or 'auto' (see prose under <percentage> | none | inherit Initial:    none Applies to:    all elements except) or the absolute length; 'auto' if the property does not apply

This property specifies the content height of boxes generated by block-level, inline-block and replaced elements.

This property does not apply to non-replaced inline elementsinline-level elements. See the section on computing heights and tablemargins for non-replaced inline elements Inherited:    no Percentages:    refer to width of containing block Media:    visual These two properties allow authors to constrain box widths to a certain range.for the rules used instead.

Values have the following meanings:

<length>
Specifies the height of the content area using a fixed minimum or maximum computed width.length value.
<percentage>
Specifies a percentage for determining the computed value.height. The percentage is calculated with respect to the height of the generated box's containing block. If the height of the containing block is not specified explicitly (i.e., it depends on content height), and this element is not absolutely positioned, the value computes to 'auto'. A percentage height on the percentageroot element is calculated with respectrelative to the width of the generated box'sinitial containing block.
none (Only on 'max-width' ) No limitauto
The height depends on the widthvalues of other properties. See the box.prose below.

Note that the following algorithm describes howheight of the two properties influencecontaining block of an absolutely positioned element is independent of the computed valuesize of the 'width' property:element itself, and thus a percentage height on such an element can always be resolved. However, it may be that the widthheight is computed (without 'min-width' and 'max-width' ) followingnot known until elements that come later in the rules under "Computing widths and margins" above. Ifdocument have been processed.

Negative values for 'height' are illegal.

Example(s):

For example, the computed value of 'min-width' is greater thanfollowing rule sets the valuecontent height of 'max-width' , 'max-width' is setparagraphs to 100 pixels:

p { height: 100px }

Paragraphs of which the valueheight of 'min-width' . Ifthe computed width is greater than 'max-width' ,contents exceeds 100 pixels will overflow according to the rules above are applied again, but this time using'overflow' property.

10.6 Calculating heights and margins

For calculating the valuevalues of 'max-width' as the specified value'top', 'margin-top', 'height', 'margin-bottom', and 'bottom' a distinction must be made between various kinds of boxes:

  1. inline, non-replaced elements
  2. inline, replaced elements
  3. block-level, non-replaced elements in normal flow
  4. block-level, replaced elements in normal flow
  5. floating, non-replaced elements
  6. floating, replaced elements
  7. absolutely positioned, non-replaced elements
  8. absolutely positioned, replaced elements
  9. 'inline-block', non-replaced elements in normal flow
  10. 'inline-block', replaced elements in normal flow

For 'width' . IfPoints 1-6 and 9-10, the computed width is smaller than 'min-width' ,used values of 'top' and 'bottom' are determined by the rules above are applied again, but this time usingin section 9.4.3.

Note: these rules apply to the value of 'min-width'root element just as to any other element.

10.6.1 Inline, non-replaced elements

The specified value for 'width' .'height' property doesn't apply. The user agent may define a non-negative minimum value forheight of the 'min-width' property, which may vary from element to element and even dependcontent area should be based on other properties. If 'min-width' goes belowthe font, but this limit, either because it was set explicitly,specification does not specify how. A UA may, e.g., use the em-box or because it was 'auto'the maximum ascender and descender of the rules belowfont. (The latter would make it too small, the user agent may useensure that glyphs with parts above or below the minimum value asem-box still fall within the computed value. 10.5content height : the 'height' property 'height' Value:    <length> | <percentage> | auto | inherit Initial:    auto Applies to:    all elementsarea, but non-replaced inline elements, table columns, and column groups Inherited:    no Percentages:    see prose Media:    visual This property specifiesleads to differently sized boxes for different fonts; the former would ensure authors can control background styling relative to the 'line-height', but leads to glyphs painting outside their content heightarea.)

Note: level 3 of boxes generated by block-level and replaced elements. ThisCSS will probably include a property does not applyto non-replaced inline-level elements. The heightselect which measure of a non-replaced inline element's boxes is given bythe element's (possibly inherited) 'line-height' value. Values havefont is used for the following meanings: <length> Specifies a fixed height. <percentage> Specifies a percentagecontent height.

The percentagevertical padding, border and margin of an inline, non-replaced box start at the top and bottom of the content area, not the 'line-height'. But only the 'line-height' is calculated with respect toused when calculating the height of the generated box's containing block .line box.

If more than one font is used (this could happen when glyphs are found in different fonts), the height of the containing block is not specified explicitly (i.e., it depends oncontent height), the valuearea is interpreted like 'auto'. autonot defined by this specification. However, we suggest that the height depends on the values of other properties. Seeis chosen such that the prose below. Negative values for 'height' are illegal. Example(s):content area is just high enough for example,either (1) the following rule fixesem-boxes, or (2) the heightmaximum ascenders and descenders, of paragraphs to 100 pixels: P { height: 100px } Paragraphsall the fonts in the element. Note that require morethis may be larger than 100 pixelsany of height will overflow according tothe 'overflow' property. 10.6 Computing heights and margins For computingfont sizes involved, depending on the values of 'top' , 'margin-top' , 'height' , 'margin-bottom' , and 'bottom' a distinction must be made between various kindsbaseline alignment of boxes: inline, non-replaced elements inline,the fonts.

10.6.2 Inline replaced elements block-level, non-replaced, block-level replaced elements in normal flow block-level,flow, 'inline-block' replaced elements in normal flow floating, non-replaced elements floating, replaced elements absolutely positioned, non-replaced elements absolutely positioned,and floating replaced elements

Points 1-6 include relative positioning. 10.6.1 Inline, non-replaced elementsIf 'top' , 'bottom' , 'margin-top' , or 'margin-bottom' are'margin-top', or 'margin-bottom' are 'auto', their used value is 0.

If 'height' has a computed value of 'auto' and 'width' also has a computed value of 'auto', the element's intrinsic height is the used value of 'height', it has one.

If 'height' has a computed value of 'auto' and 'width' has some other computed value, and the replaced element has an intrinsic ratio, or, if both 'height' and 'width' have computed values of 'auto', theirand the element has no intrinsic height but does have an intrinsic width and intrinsic ratio, then the used value of 'height' is:

(used width) / (intrinsic ratio)

Otherwise, if 'height' has a computed value is 0.of 'auto', but none of the conditions above are met, then the used value of 'height' property doesn't apply, butmust be set to 150px. If 300px is too wide to fit the device width, UAs should use the height of the boxlargest rectangle that has a 2:1 ratio and fits the device width instead.

Percentage intrinsic heights are evaluated with respect to the containing block's height, if that height is given byspecified explicitly, or if the 'line-height' property. 10.6.2 Inline,replaced elements block-level,element is absolutely positioned. If neither of these conditions is met, then percentage values on such replaced elements in normal flow,can't be resolved and floating, replacedsuch elements If 'top' , 'bottom' , 'margin-top' , or 'margin-bottom'are 'auto', their computed value is 0. If 'height' is 'auto',assumed to have no intrinsic height.

For 'inline' and 'inline-block' elements, the computed valuemargin box is used when calculating the intrinsic height.height of the line box.

10.6.3 Block-level,Block-level non-replaced elements in normal flow, and floating, non-replaced elementsflow when 'overflow' computes to 'visible'

If 'top' , 'bottom' ,'margin-top', or 'margin-bottom' are 'auto', their computedused value is 0. If 'height' is 'auto', the height depends on whether the element has any block-level children.children and whether it has padding or borders:

If it only has inline-level children, the heightheight is the distance between the top of the topmost line box and the bottom of the bottommost line box.

If it has block-level children, the height is the distance between the top border-edge of the topmost block-level child box that doesn't have margins collapsed through it and the bottom border-edge of the bottommost block-level child box that doesn't have margins collapsed through it. However, if the element has a non-zero top padding and/or top border, or is fromthe root element, then the content starts at the top margin edge of the topmost line box tochild. (The first case expresses the fact that the top and bottom margins of the element collapse with those of the topmost and bottommost line box. If it has block-levelchildren, it iswhile in the distance fromsecond case the top border-edgepresence of the topmost block-level child box, topadding/border prevents the top margins from collapsing.) Similarly, if the element has a non-zero bottom border-edgepadding and/or bottom border, then the content ends at the bottom margin edge of the bottommost block-level child box.child.

Only children in the normal flow are taken into account (i.e., floating boxes and absolutely positioned boxes are ignored, and relatively positioned boxes are considered without their offset). Note that the child box may be an anonymous block box.

10.6.4 Absolutely positioned, non-replaced elements

For absolutely positioned elements,the vertical dimensions must satisfy this constraint: 'top' + 'margin-top' + 'border-top-width' + 'padding-top' + 'height' + 'padding-bottom' + 'border-bottom-width' + 'margin-bottom' + 'bottom' = heightpurposes of containing block (If the border style is 'none', use '0' asthis section and the border width.)next, the solutionterm "static position" (of an element) refers, roughly, to this constraint is reached through a number of substitutionsthe position an element would have had in the following order: If 'top' hasnormal flow. More precisely, the value 'auto' replace it withstatic position for 'top' is the distance from the top edge of the containing block to the top margin edge of a hypothetical box that would have been the first box of the element if its 'position' property had been 'static'. (But'static' and 'float' had been 'none'. The value is negative if the hypothetical box is above the containing block.

But rather than actually computingcalculating the dimensions of that hypothetical box, user agents are free to make a guess at its probable position.)position.

For the value is negative ifpurposes of calculating the hypothetical boxstatic position, the containing block of fixed positioned elements is abovethe initial containing block. If bothblock instead of the viewport.

For absolutely positioned elements, the used values of the vertical dimensions must satisfy this constraint:

'top' + 'margin-top' + 'border-top-width' + 'padding-top' + 'height' + 'padding-bottom' + 'border-bottom-width' + 'margin-bottom' + 'bottom' = height of containing block

If all three of 'top', 'height', and 'bottom' are 'auto', replace 'bottom' with 0.auto, set 'top' to the static position and apply rule number three below.

If 'bottom' or 'height'none of the three are (still) 'auto', replace any 'auto' on 'margin-top' or 'margin-bottom' with '0'.'auto': If at this pointboth 'margin-top' and 'margin-bottom' are still'auto', solve the equation under the extra constraint that the two margins mustget equal values. If at this point there is onlyone 'auto' left,of 'margin-top' or 'margin-bottom' is 'auto', solve the equation for that value. If at this pointthe values are over-constrained, ignore the value for 'bottom' and solve for that value.

10.6.5 Absolutely positioned, replaced elements This situation is similar toOtherwise, pick the previous one, except thatone of the element has an intrinsic height.following six rules that applies.

  1. 'top' and 'height' are 'auto' and 'bottom' is not 'auto', then the sequence of substitutionsheight is now: Ifbased on the content, set 'auto' values for 'margin-top' and 'margin-bottom' to 0, and solve for 'top'
  2. 'top' and 'bottom' are 'auto' and 'height' is not 'auto', substitute the element's intrinsic height. Ifthen set 'top' hasto the valuestatic position, set 'auto' values for 'margin-top' and 'margin-bottom' to 0, and solve for 'bottom'
  3. 'height' and 'bottom' are 'auto' and 'top' is not 'auto', replace it with the distance fromthen the top edge ofheight is based on the containing blockcontent, set 'auto' values for 'margin-top' and 'margin-bottom' to the top margin edge of a hypothetical box that would have been the first box of the element if its 'position' property had been 'static'. (But rather than actually computing that box, user agents0, and solve for 'bottom'
  4. 'top' is 'auto', 'height' and 'bottom' are freenot 'auto', then set 'auto' values for 'margin-top' and 'margin-bottom' to 0, and solve for 'top'
  5. 'height' is 'auto', 'top' and 'bottom' are not 'auto', then 'auto' values for 'margin-top' and 'margin-bottom' are set to 0 and solve for 'height'
  6. 'bottom' is 'auto', 'top' and 'height' are not 'auto', then set 'auto' values for 'margin-top' and 'margin-bottom' to 0 and solve for 'bottom'

10.6.5 Absolutely positioned, replaced elements

This situation is similar to make a guess at its probable position.)the previous one, except that the element has an intrinsic height. The sequence of substitutions is now:

  1. The used value of 'height' is negativedetermined as for inline replaced elements.
  2. If both 'top' and 'bottom' have the hypothetical box is abovevalue 'auto', replace 'top' with the containing block.element's static position.
  3. If 'bottom' is 'auto', replace any 'auto' on 'margin-top' or 'margin-bottom' with '0'.
  4. If at this point both 'margin-top' and 'margin-bottom' are still 'auto', solve the equation under the extra constraint that the two margins must get equal values.
  5. If at this point there is only one 'auto' left, solve the equation for that value.
  6. If at this point the values are over-constrained, ignore the value for 'bottom' and solve for that value.over-constrained, ignore the value for 'bottom' and solve for that value.

10.6.6 Block-level, non-replaced elements in normal flow when 'overflow' does not compute to 'visible'; 'inline-block', non-replaced elements; and floating, non-replaced elements

If 'margin-top', or 'margin-bottom' are 'auto', their used value is 0. If 'height' is 'auto', the height depends on the element's descendants.

For 'inline-block' elements, the margin box is used when calculating the height of the line box.

10.6.7 'Auto' heights for block formatting context roots

In certain cases (see the preceding sections), the height of an element is computed as follows:

If it only has inline-level children, the height is the distance between the top of the topmost line box and the bottom of the bottommost line box.

If it has block-level children, the height is the distance between the top margin-edge of the topmost block-level child box and the bottom margin-edge of the bottommost block-level child box.

Absolutely positioned children are ignored, and relatively positioned boxes are considered without their offset. Note that the child box may be an anonymous block box.

In addition, if the element has any floating descendants whose bottom margin edge is below the bottom, then the height is increased to include those edges. Only floats that are children of the element itself or of descendants in the normal flow are taken into account, e.g., floats inside absolutely positioned descendants or other floats are not.

10.7 Minimum and maximum heights: 'min-height' and 'max-height'

It is sometimes useful to constrain the height of elements to a certain range. Two properties offer this functionality:

'min-height'
Value:  <length> | <percentage> | inherit
Initial:  0
Applies to:  all elements exceptbut non-replaced inline elements andelements, table elementscolumns, and column groups
Inherited:  no
Percentages:   refer to height of containing blocksee prose
Media:  visual
Computed value:  the percentage as specified or the absolute length
'max-height'
Value:  <length> | <percentage> | none | inherit
Initial:  none
Applies to:  all elements exceptbut non-replaced inline elements andelements, table elementscolumns, and column groups
Inherited:  no
Percentages:   refer to height of containing blocksee prose
Media:  visual
Computed value:  the percentage as specified or the absolute length or 'none'

These two properties allow authors to constrain box heights to a certain range. Values have the following meanings:

<length>
Specifies a fixed minimum or maximum computed height.
<percentage>
Specifies a percentage for determining the computedused value. The percentage is calculated with respect to the height of the generated box's containing block. If the height of the containing block is not specified explicitly (i.e., it depends on content height), and this element is not absolutely positioned, the percentage value is interpreted like 'auto'.treated as '0' (for 'min-height') or 'none' (for 'max-height').
none
(Only on 'max-height') No limit on the height of the box.

Negative values for 'min-height' and 'max-height' are illegal.

The following algorithm describes how the two properties influence the computed value of the 'height' property:

  1. The tentative used height is computedcalculated (without 'min-height' and 'max-height') following the rules under "Computing"Calculating heights and margins" above.
  2. If the computed value of 'min-height' is greater than the value of 'max-height' , 'max-height' is set to the value of 'min-height' . If the computedthis tentative height is greater than 'max-height', the rules above are applied again, but this time using the value of 'max-height' as the specifiedcomputed value for 'height'.
  3. If the computedresulting height is smaller than 'min-height', the rules above are applied again, but this time using the value of 'min-height' as the specifiedcomputed value for 'height'.

However, for replaced elements with both 'width' and 'height' computed as 'auto', use the algorithm under Minimum and maximum widths above to find the used width and height. Then apply the rules under "Computing heights and margins" above, using the resulting width and height as if they were the computed values.

10.8 Line height calculations: the 'line-height' and 'vertical-align' properties

As described in the section on inline formatting contexts, user agents flow inline boxes into a vertical stack of line boxes. The height of a line box is determined as follows:

  1. The height of each inline box in the line box is calculated (see "Computing"Calculating heights and margins" and the 'line-height' property).
  2. The inline boxes are aligned vertically according to their 'vertical-align' property.
  3. The line box height is the distance between the uppermost box top and the lowermost box bottom.
  4. If the resulting height is smaller than the minimal height of line boxes for this block, as specified by the line-height property, the height is increased to be that minimal height.

Empty inline elements generate empty inline boxes, but these boxes still have margins, padding, borders and a line height, and thus influence these calculations just like elements with content. Note that if all the boxes in the line box are aligned along their bottoms, the line box will be exactly the height of the tallest box. If, however, the boxes are aligned along a common baseline, the line box top and bottom may not touch the top and bottom of the tallest box.just like elements with content.

10.8.1 Leading and half-leading

Since the heightvalue of an inline box'line-height' may be different from the font sizeheight of text inthe box (e.g., 'line-height' > 1em),content area there may be space above and below rendered glyphs. The difference between the font sizecontent height and the computedused value of 'line-height' is called the leading. Half the leading is called the half-leading.

User agents center glyphs vertically in an inline box, adding half-leading on the top and bottom. For example, if a piece of text is '12pt''12px' high and the 'line-height' value is '14pt', 2pts'14px', 2pxs of extra space should be added: 1pt1px above and 1pt1px below the letters. (This applies to empty boxes as well, as if the empty box contained an infinitelyinfinitesimally narrow letter.)

When the 'line-height' value is less than the font size,content height, the final inline box height will be less than the font size and the rendered glyphs will "bleed" outside the box. If such a box touches the edge of a line box, the rendered glyphs will also "bleed" into the adjacentadjoining line box.

Although margins, borders, and padding of non-replaced elements do not enter into inline box height calculation (and thusthe line box calculation),calculation, they are still rendered around inline boxes. This means that if the height of a line boxspecified by 'line-height' is shorterless than the outer edgescontent height of the boxes it contains,contained boxes, backgrounds and colors of padding and borders may "bleed" into adjacentadjoining line boxes. However, in this case, someUser agents may useshould render the line boxboxes in document order. This will cause the borders on subsequent lines to "clip"paint over the borderborders and padding areas (i.e., not render them).text of previous lines.

'line-height'
Value:  normal | <number> | <length> | <percentage> | inherit
Initial:  normal
Applies to:  all elements
Inherited:  yes
Percentages:  refer to the font size of the element itself
Media:  visual
IfComputed value:  for <length> and <percentage> the property is setabsolute value; otherwise as specified

On a block-level, table-cell, table-caption or inline-block element whose content is composed of inline-level elements, it'line-height' specifies the minimal height of line boxes within the element. The minimum height consists of a minimum height above the block's baseline and a minimum depth below it, exactly as if each generatedline box starts with a zero-width inline box. Ifbox with the property is setblock's font and line height properties (what TEX calls a "strut").

On an inline-level element, it'line-height' specifies the exactheight that is used in the calculation of each box generated bythe element.line box height (except for inline replaced elements, where the height of the box is given by the 'height' property.)property).

Values for this property have the following meanings:

normal
Tells user agents to set the computedused value to a "reasonable" value based on the font sizeof the element. The value has the same meaning as <number>. We recommend a computedused value for 'normal' between 1.0 to 1.2. The computed value is 'normal'.
<length>
The box heightspecified length is set to this length.used in the calculation of the line box height. Negative values are illegal.
<number>
The computedused value of the property is this number multiplied by the element's font size. Negative values are illegal. However, the number, notThe computed value ,is inherited.the same as the specified value.
<percentage>
The computed value of the property is this percentage multiplied by the element's computed font size. Negative values are illegal.

Example(s):

The three rules in the example below have the same resultant line height:

div { line-height: 1.2; font-size: 10pt }     /* number */
div { line-height: 1.2em; font-size: 10pt }   /* length */
div { line-height: 120%; font-size: 10pt }    /* percentage */

When an element contains text that is rendered in more than one font, user agents shouldmay determine the 'line-height' value according to the largest font size.

Generally, when there is only one value of 'line-height' for all inline boxes in a paragraph (and no tall images), the above will ensure that baselines of successive lines are exactly 'line-height' apart. This is important when columns of text in different fonts have to be aligned, for example in a table. Note that replaced elements have a 'font-size' and a 'line-height' property, even if they are not used directly to determine the height of the box. The 'font-size' is, however, used to define the 'em' and 'ex' units, andimages), the above will ensure that baselines of successive lines are exactly 'line-height' has a roleapart. This is important when columns of text in the 'vertical-align' property.different fonts have to be aligned, for example in a table.

'vertical-align'
Value:  baseline | sub | super | top | text-top | middle | bottom | text-bottom | <percentage> | <length> | inherit
Initial:  baseline
Applies to:  inline-level and 'table-cell' elements
Inherited:  no
Percentages:  refer to the 'line-height' of the element itself
Media:  visual
Computed value:  for <percentage> and <length> the absolute length, otherwise as specified

This property affects the vertical positioning inside a line box of the boxes generated by an inline-level element.

The following values only have meaning with respect to a parent inline-level element, or to a parent block-level element, if that element generates anonymous inline boxes ; they have no effect if no such parent exists.Note. Values of this property have slightly different meanings in the context of tables. Please consult the section on table height algorithms for details.

The following values only have meaning with respect to a parent inline-level element, or to the strut of a parent block-level, table-cell, table-caption or inline-block element.

baseline
Align the baseline of the box with the baseline of the parent box. If the box doesn't have a baseline, align the bottom of the boxmargin edge with the parent's baseline.
middle
Align the vertical midpoint of the box with the baseline of the parent box plus half the x-height of the parent.
sub
Lower the baseline of the box to the proper position for subscripts of the parent's box. (This value has no effect on the font size of the element's text.)
super
Raise the baseline of the box to the proper position for superscripts of the parent's box. (This value has no effect on the font size of the element's text.)
text-top
Align the top of the box with the top of the parent element's font.parent's content area (see 10.6.1).
text-bottom
Align the bottom of the box with the bottom of the parent element's font.parent's content area (see 10.6.1).
<percentage>
Raise (positive value) or lower (negative value) the box by this distance (a percentage of the 'line-height' value). The value '0%' means the same as 'baseline'.
<length>
Raise (positive value) or lower (negative value) the box by this distance. The value '0cm' means the same as 'baseline'.

The remainingfollowing values referalign the element relative to the line boxbox. Since the element may have children aligned relative to it (which in whichturn may have descendants aligned relative to them), these values use the generated box appears:bounds of the aligned subtree. The aligned subtree of an inline element contains that element and the aligned subtrees of all children inline elements whose computed 'vertical-align' value is not 'top' or 'bottom'. The top of the aligned subtree is the highest of the tops of the boxes in the subtree, and the bottom is analogous.

top
Align the top of the boxaligned subtree with the top of the line box.
bottom
Align the bottom of the boxaligned subtree with the bottom of the line box.

The baseline of an 'inline-table' is the baseline of the first row of the table.

The baseline of an 'inline-block' is the baseline of its last line box in the normal flow, unless it has either no in-flow line boxes or if its 'overflow' property has a computed value other than 'visible', in which case the baseline is the bottom margin edge.