Contents
The position and size of an element's box(es) are sometimes computed relative to a certain rectangle, called the containing block of the element. The containing block of an element is defined as follows:
If there is no such ancestor, the content edge of the root element's box establishes the containing block.
With no positioning, the containing blocks (C.B.) in the following document:
<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 |
---|---|
body | initial C.B. (UA-dependent) |
div1 | body |
p1 | div1 |
p2 | div1 |
em1 | p2 |
strong1 | p2 |
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 |
---|---|
body | initial C.B. |
div1 | initial C.B. |
p1 | div1 |
p2 | div1 |
em1 | div1 |
strong1 | em1 |
By positioning "em1", its containing block becomes the nearest positioned ancestor box (i.e., that generated by "div1").
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 |
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 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:
Negative values for 'width' are illegal.
For example, the following rule fixes the content width of paragraphs at 100 pixels:
P { width: 100px }
The computed values of an element's 'width', 'margin-left', 'margin-right', 'left' and 'right' properties depend on the type of box generated and on each other. In principle, the computed values are the same as the specified values, with 'auto' replaced by some suitable value, but there are exceptions. The following situations need to be distinguished:
Points 1-6 include relative positioning.
The 'width' property does not apply. A specified value of 'auto' for 'left', 'right', 'margin-left' or 'margin-right' becomes a computed value of '0'.
A specified value of 'auto' for 'left', 'right', 'margin-left' or 'margin-right' becomes a computed value of '0'. A specified value of 'auto' for 'width' gives the element's intrinsic width as the computed value.
If 'left' or 'right' are given as 'auto', their computed value is 0. The following constraints must hold between 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 style is 'none', use '0' as the border width.) If all of the above have a specified value other than 'auto', the values are said to be "over-constrained" and one of the computed values will have to be different from its specified value. If the 'direction' property has the value 'ltr', the specified value of 'margin-right' is ignored and the value is computed so as to make the equality true. If the value of 'direction' is 'ltr', this happens to 'margin-left' instead.
If there is exactly one value specified as 'auto', its computed 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 computed values are equal.
If 'left' or 'right' are 'auto', their computed value is 0. If 'width' is specified as 'auto', its value is the element's intrinsic width. If one of the margins is 'auto', its computed value is given by the constraints above. Furthermore, if both margins are 'auto', their computed values are equal.
If 'left', 'right', 'width', 'margin-left', or 'margin-right' are specified as 'auto', their computed value is '0'.
If 'left', 'right', 'margin-left' or 'margin-right' are specified as 'auto', their computed value is '0'. If 'width' is 'auto', its value is the element's intrinsic width.
The constraint that determines the computed values for these elements is:
'left' + 'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' + 'right' = width of containing block
(If the border style is 'none', use '0' as the border width.) The solution to this constraint is reached through a number of substitutions in the following order:
This situation is similar to the previous one, except that the element has an intrinsic width. The sequence of substitutions is now:
Value: | <length> | <percentage> | inherit |
Initial: | UA dependent |
Applies to: | all elements except non-replaced inline elements and table elements |
Inherited: | no |
Percentages: | refer to width of containing block |
Media: | visual |
Value: | <length> | <percentage> | none | inherit |
Initial: | none |
Applies to: | all elements except non-replaced inline elements and table 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. Values have the following meanings:
The following algorithm describes how the two properties influence the computed value of the 'width' property:
The user agent may define a non-negative minimum value for the 'min-width' property, which may vary from element to element and even depend on other properties. If 'min-width' goes below this limit, either because it was set explicitly, or because it was 'auto' and the rules below would make it too small, the user agent may use the minimum value as the computed value.
Value: | <length> | <percentage> | auto | inherit |
Initial: | auto |
Applies to: | all elements but non-replaced inline elements, table columns, and column groups |
Inherited: | no |
Percentages: | see prose |
Media: | visual |
This property specifies the content height of boxes generated by block-level and replaced elements.
This property does not apply to non-replaced inline-level elements. The height of a non-replaced inline element's boxes is given by the element's (possibly inherited) 'line-height' value.
Values have the following meanings:
Negative values for 'height' are illegal.
For example, the following rule fixes the height of paragraphs to 100 pixels:
P { height: 100px }
Paragraphs that require more than 100 pixels of height will overflow according to the 'overflow' property.
For computing the values of 'top', 'margin-top', 'height', 'margin-bottom', and 'bottom' a distinction must be made between various kinds of boxes:
Points 1-6 include relative positioning.
If 'top', 'bottom', 'margin-top', or 'margin-bottom' are 'auto', their computed value is 0. The 'height' property doesn't apply, but the height of the box is given by the 'line-height' property.
If 'top', 'bottom', 'margin-top', or 'margin-bottom' are 'auto', their computed value is 0. If 'height' is 'auto', the computed value is the intrinsic height.
If 'top', 'bottom', 'margin-top', or 'margin-bottom' are 'auto', their computed value is 0. If 'height' is 'auto', the height depends on whether the element has any block-level children. If it only has inline-level children, the height is from the top of the topmost line box to the bottom of the bottommost line box. If it has block-level children, it is the distance from the top border-edge of the topmost block-level child box, to the bottom border-edge of the bottommost block-level child box. 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 box.
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' = height of containing block
(If the border style is 'none', use '0' as the border width.) The solution to this constraint is reached through a number of substitutions in the following order:
This situation is similar to the previous one, except that the element has an intrinsic height. The sequence of substitutions is now:
It is sometimes useful to constrain the height of elements to a certain range. Two properties offer this functionality:
Value: | <length> | <percentage> | inherit |
Initial: | 0 |
Applies to: | all elements except non-replaced inline elements and table elements |
Inherited: | no |
Percentages: | refer to height of containing block |
Media: | visual |
Value: | <length> | <percentage> | none | inherit |
Initial: | none |
Applies to: | all elements except non-replaced inline elements and table elements |
Inherited: | no |
Percentages: | refer to height of containing block |
Media: | visual |
These two properties allow authors to constrain box heights to a certain range. Values have the following meanings:
The following algorithm describes how the two properties influence the computed value of the 'height' property:
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:
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.
Since the height of an inline box may be different from the font size of text in the box (e.g., 'line-height' > 1em), there may be space above and below rendered glyphs. The difference between the font size and the computed 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' high and the 'line-height' value is '14pt', 2pts of extra space should be added: 1pt above and 1pt below the letters. (This applies to empty boxes as well, as if the empty box contained an infinitely narrow letter.)
When the 'line-height' value is less than the font size, 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 adjacent line box.
Although margins, borders, and padding of non-replaced elements do not enter into inline box height calculation (and thus the line box calculation), they are still rendered around inline boxes. This means that if the height of a line box is shorter than the outer edges of the boxes it contains, backgrounds and colors of padding and borders may "bleed" into adjacent line boxes. However, in this case, some user agents may use the line box to "clip" the border and padding areas (i.e., not render them).
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 |
If the property is set on a block-level element whose content is composed of inline-level elements, it specifies the minimal height of each generated inline box.
If the property is set on an inline-level element, it specifies the exact height of each box generated by the element. (Except for inline replaced elements, where the height of the box is given by the 'height' property.)
Values for this property have the following meanings:
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 should 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, and the 'line-height' has a role in the 'vertical-align' property.
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 |
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 remaining values refer to the line box in which the generated box appears: