Movatterモバイル変換


[0]ホーム

URL:


previous  next  contents  properties  index  


9 Visual formatting model

Contents

9.1Introduction to the visual formatting model

This chapter and the next describe thevisual formatting model: how useragents process thedocument treefor visualmedia.

In the visual formatting model, each element in the document treegenerates zero or more boxes according to theboxmodel. The layout of these boxes is governed by:

The properties defined in this chapter and the next apply to bothcontinuous media andpaged media.However, themeanings of themarginproperties vary when applied to paged media (see thepage model for details).

The visual formatting model does not specify all aspects offormatting (e.g., it does not specify a letter-spacing algorithm).Conforming user agents may behavedifferently for those formatting issues not covered by thisspecification.

9.1.1The viewport

User agents forcontinuous mediagenerally offer users aviewport (a window or otherviewing area on the screen) through which users consult adocument. User agents may change the document's layout when theviewport is resized (see theinitial containing block).

When the viewport is smaller than the area of the canvas on whichthe document is rendered, the user agent should offer a scrollingmechanism.There is at mostone viewport percanvas, but useragents may render to more than one canvas (i.e., provide differentviews of the same document).

9.1.2Containing blocks

In CSS 2.1, many box positions and sizes are calculated with respectto the edgesof a rectangular box called acontaining block. Ingeneral, generated boxes act as containing blocks for descendantboxes; we say that a box "establishes" the containing block for itsdescendants. The phrase "a box's containing block" means "thecontaining block in which the box lives," not the one it generates.

Each box is given a position with respect to its containing block,but it is not confined by this containing block; it mayoverflow.

Thedetails ofhow a containing block's dimensions are calculated are described inthenext chapter.

9.2Controlling box generation

The following sections describe the types of boxes that may begenerated in CSS 2.1. A box's type affects, in part, its behavior in thevisual formatting model. The'display' property, described below,specifies a box's type.

9.2.1Block-level elements and block boxes

Block-level elements are those elements of the source document that are formatted visually asblocks (e.g., paragraphs). Several values of the'display' property make an elementblock-level: 'block', 'list-item', and 'run-in' (part of thetime; seerun-in boxes), and 'table'.

Block-level elements (except for display 'table' elements, which are described in a later chapter) generate aprincipalblock box that contains either onlyblockboxes or onlyinline boxes. The principal block box establishes thecontaining block for descendant boxes andgenerated content and is also the box involved in any positioningscheme. Principal block boxes participate in ablock formatting context.

Some block-level elements generate additional boxes outside of theprincipal box: 'list-item' elements. These additional boxes areplaced with respect to the principal box.

9.2.1.1Anonymous block boxes

In a document like this:

<DIV>  Some text  <P>More text</DIV>

(and assuming the DIV and the P both have 'display: block'), theDIV appears to have both inline content and block content. To make iteasier to define the formatting, we assume that there is ananonymous block boxaround "Some text".

diagram showing the threeboxes for the example above   [D]

Diagram showing thethree boxes, of which one is anonymous, for the example above.

In other words: if a block box (such as that generated for the DIVabove) has another block box or run-in box inside it (such as the Pabove), then we force it to haveonly block boxes and run-inboxes inside it.

When an inline box contains a block box, the inline box (and its inline ancestors within the same line box) are broken around the block. The line boxes before the break and after the break are enclosed in anonymous boxes, and the block box becomes a sibling of those anonymous boxes.When such an inline box is affected by relative positioning,the relative positioning also affects the block box.

Example(s):

This model would apply in the following example if the followingrules:

body { display: inline }p    { display: block }

were used with this HTML document:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"><HEAD><TITLE>Anonymous text interrupted by a block</TITLE></HEAD><BODY>This is anonymous text before the P.<P>This is the content of P.</P>This is anonymous text after the P.</BODY>

The BODY element contains a chunk (C1) of anonymous text followedby a block-level element followed by another chunk (C2) of anonymoustext. The resulting boxes would be an anonymous block box around the BODY,containing an anonymous block box around C1, the P block box, andanother anonymous block box around C2.

The properties of anonymous boxes are inherited from theenclosing non-anonymous box (e.g., in the example just below the subsection heading "Anonymous block boxes", the one for DIV). Non-inherited properties have their initial value. For example,the font of the anonymous box is inherited from the DIV, but themargins will be 0.

Properties set on elements that cause anonymous block boxes to be generated still apply to the boxes and content of that element. For example, if a border had been set on the BODY element in the above example, the border would be drawn around C1 (open at the end of the line) and C2 (open at the start of the line).

Some user agents have implemented borders on inlines containing blocks in other ways, e.g., by wrapping such nested blocks inside "anonymous line boxes" and thus drawing inline borders around such boxes. As CSS1 and CSS2 did not define this behavior, CSS1-only and CSS2-only user agents may implement this alternative model and still claim conformance to this part of CSS 2.1. This does not apply to UAs developed after this specification was released.

9.2.2Inline-level elements and inline boxes

Inline-levelelements are those elements of the source document thatdo not form new blocks of content; the content is distributed in lines (e.g., emphasized pieces of textwithin a paragraph, inline images,etc.). Several values of the'display' property make an elementinline: 'inline', 'inline-table', 'inline-block' and 'run-in' (part of the time; seerun-in boxes). Inline-level elements generateinlineboxes.

9.2.2.1Anonymous inline boxes

In a document with HTML markup like this:

<p>Some <em>emphasized</em> text</p>

the<p> generates a block box, with several inline boxes insideit. The box for "emphasized" is an inline box generated by an inlineelement (<em>), but the other boxes ("Some" and "text") are inline boxes generated by a block-level element (<p>). The latter are calledanonymous inlineboxes, because they do not have an associated inline-level element.

Such anonymous inline boxes inherit inheritable properties fromtheir block parent box. Non-inherited properties have their initialvalue. In the example, the color of the anonymous inline boxes isinherited from the P, but the background is transparent.

White space content that would subsequently be collapsed away according to the'white-space' property does not generate any anonymous inline boxes.

If it is clear from the context which type of anonymous box ismeant, both anonymous inline boxes and anonymous block boxes aresimply called anonymous boxes in this specification.

There are more types of anonymous boxes that arise when formattingtables.

9.2.3Run-in boxes

Arun-inbox behaves as follows:

  1. If the run-in box contains ablockbox, the run-in box becomes a block box.
  2. If a siblingblockbox (that does not float and is notabsolutely positioned) follows the run-inbox, the run-in box becomes the first inline box of the block box.A run-in cannot run in to a block that already starts with arun-in or that itself is a run-in.
  3. Otherwise, the run-in box becomes a block box.

A 'run-in' box is useful for run-in headers, asin this example:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"><HTML>  <HEAD>    <TITLE>A run-in box example</TITLE>    <STYLE type="text/css">      H3 { display: run-in }    </STYLE>  </HEAD>  <BODY>    <H3>A run-in heading.</H3>    <P>And a paragraph of text that       follows it.  </BODY></HTML>

This example might be formatted as:

A run-in heading. And a  paragraph of text that   follows it.

Despite appearing visually part of the following block box, a run-in element still inherits properties from its parent in the source tree.

Please consult the section ongenerated contentfor information about how run-in boxes interact with generatedcontent.

9.2.4The'display' property

'display'
Value:  inline | block | list-item | run-in | inline-block |table | inline-table | table-row-group | table-header-group |table-footer-group | table-row | table-column-group | table-column |table-cell | table-caption | none |inherit
Initial:  inline
Applies to:  all elements
Inherited:  no
Percentages:  N/A
Media:  all
Computed value:  see text

The values of this property have the following meanings:

block
This value causes an element to generate a block box.
inline-block
This value causes an element to generate a block box, which itself is flowed as a single inline box, similar to a replaced element. The inside of an inline-block is formatted as a block box, and the element itself is formatted as an inline replaced element.
inline
This value causes an element to generate one or more inline boxes.
list-item
This value causes an element (e.g., LI in HTML) to generate aprincipal block box and a list-item inline box. For information aboutlists and examples of list formatting, please consult the section onlists.
none
Thisvalue causes an element to not appear in theformatting structure (i.e.,in visual media the element generates no boxes and has no effect onlayout). Descendant elements do not generate any boxes either; theelement and its content are removed from the formatting structureentirely. This behaviorcannot be overridden bysetting the'display' propertyon the descendants.

Please note that a display of 'none' does not create an invisiblebox; it creates no box at all. CSS includes mechanisms that enable anelement to generate boxes in the formatting structure that affectformatting but are not visible themselves. Please consult the sectiononvisibility for details.

run-in
This value creates either block or inline boxes, depending on context. Properties apply to run-in boxes based on theirfinal status (inline-level or block-level).
table,inline-table,table-row-group,table-column,table-column-group,table-header-group,table-footer-group,table-row,table-cell, andtable-caption
These values cause an element to behave like a table element(subject to restrictions described in the chapter ontables).

The computed value is the same as the specified value, except forpositioned and floating elements (seeRelationships between 'display', 'position', and'float') and for the root element. For the root element, the computed value is changed as described in the section on therelationships between 'display', 'position', and 'float'.

Note that although theinitialvalue of'display' is'inline', rules in the user agent'sdefault style sheet mayoverride this value. See thesample style sheet for HTML 4 in theappendix.

Example(s):

Here are some examples of the'display' property:

p   { display: block }em  { display: inline }li  { display: list-item } img { display: none }      /* Do Not display images */

9.3Positioning schemes

In CSS 2.1, a box may be laid out according to threepositioningschemes:

  1. Normal flow. In CSS 2.1, normalflow includesblock formattingofblock boxes,inline formattingofinline boxes,relative positioning ofblock or inline boxes, and positioning ofrun-in boxes.
  2. Floats. In the float model,a box is first laid out according to the normal flow, then taken out of the flow and shiftedto the left or right as far as possible. Content mayflow along the side of a float.
  3. Absolute positioning. In the absolute positioning model, a box is removed fromthe normal flow entirely (it has no impact on later siblings)and assigned a position with respect to a containing block.
Note.CSS 2.1's positioning schemes help authors make their documentsmore accessible by allowing them to avoid mark-up tricks(e.g., invisible images) used for layout effects.

9.3.1Choosing a positioning scheme:'position' property

The'position' and'float' properties determine which of the CSS 2.1 positioning algorithms is used to calculate the position of a box.

'position'
Value:  static | relative | absolute | fixed |inherit
Initial:  static
Applies to:  all elements
Inherited:  no
Percentages:  N/A
Media:  visual
Computed value:  as specified

The values of this property have the following meanings:

static
The box is a normal box, laid out according to thenormal flow. The'top','right','bottom',and'left'properties do not apply.
relative
The box's position is calculated according to thenormal flow (this is called the position innormal flow). Then the box is offsetrelative to its normal position. Whena box B is relatively positioned, the position of the following box iscalculated as though B were not offset. The effect of 'position:relative' on table-row-group, table-header-group, table-footer-group, table-row, table-column-group, table-column, table-cell, and table-caption elements is undefined.
absolute
The box's position (and possibly size) is specifiedwith the'top','right','bottom', and'left'properties.These properties specify offsets with respect to the box'scontaining block. Absolutelypositioned boxes are taken out of the normal flow. This meansthey have no impact on the layout of later siblings. Also,thoughabsolutely positioned boxes have margins, theydo notcollapsewith any other margins.
fixed
The box's position is calculated according to the 'absolute'model, but in addition, the box isfixed with respect to some reference. As with the 'absolute' model, the box's margins do not collapse with any other margins.In the case of handheld, projection, screen, tty, and tv media types, the box is fixed with respect to theviewport and does not move when scrolled. In the case of the print media type, the box is rendered on every page, and is fixed with respect to the page box, even if the page is seen through aviewport (in the case of a print-preview, for example). For other media types, the presentation is undefined. Authors may wish to specify 'fixed' in amedia-dependent way. For instance, an author may want a box to remainat the top of theviewport on the screen, butnot at the top of each printed page. The two specifications may beseparated by using an@mediarule, as in:

Example(s):

   @media screen {   h1#first { position: fixed } }@media print {   h1#first { position: static }}

UAs must not paginate the content of fixed boxes.Note that UAs may print invisible content in otherways. See"Content outside thepage box" in chapter 13.

User agents may treat position as 'static' on the root element.

9.3.2Box offsets:'top','right','bottom','left'

An element is said to bepositionedif its'position' property hasa value other than 'static'. Positioned elements generatepositioned boxes, laid out according to four properties:

'top'
Value:  <length> |<percentage> | auto |inherit
Initial:  auto
Applies to:  positioned elements
Inherited:  no
Percentages:  refer to height of containing block
Media:  visual
Computed value:  for 'position:relative', see sectionRelative Positioning. For 'position:static', 'auto'. Otherwise: if specified as a length, the corresponding absolute length; if specified as a percentage, the specified value; otherwise, 'auto'.

This property specifies how far anabsolutely positioned box's topmargin edge is offset below the top edge of the box'scontaining block. For relativelypositioned boxes, the offset is with respect to the top edges of thebox itself (i.e., the box is given a position in the normal flow, thenoffset from that position according to these properties).

'right'
Value:  <length> |<percentage> | auto |inherit
Initial:  auto
Applies to:  positioned elements
Inherited:  no
Percentages:  refer to width of containing block
Media:  visual
Computed value:  for 'position:relative', see sectionRelative Positioning. For 'position:static', 'auto'. Otherwise: if specified as a length, the corresponding absolute length; if specified as a percentage, the specified value; otherwise, 'auto'.

Like 'top', but specifies how far a box's right margin edge isoffset to the left of the right edge of the box'scontaining block. For relativelypositioned boxes, the offset is with respect to the right edge of thebox itself.

'bottom'
Value:  <length> |<percentage> | auto |inherit
Initial:  auto
Applies to:  positioned elements
Inherited:  no
Percentages:  refer to height of containing block
Media:  visual
Computed value:  for 'position:relative', see sectionRelative Positioning. For 'position:static', 'auto'. Otherwise: if specified as a length, the corresponding absolute length; if specified as a percentage, the specified value; otherwise, 'auto'.

Like 'top', but specifies how far a box's bottom margin edge isoffset above the bottom of the box'scontaining block. For relativelypositioned boxes, the offset is with respect to the bottom edge of thebox itself.

'left'
Value:  <length> |<percentage> | auto |inherit
Initial:  auto
Applies to:  positioned elements
Inherited:  no
Percentages:  refer to width of containing block
Media:  visual
Computed value:  for 'position:relative', see sectionRelative Positioning. For 'position:static', 'auto'. Otherwise: if specified as a length, the corresponding absolute length; if specified as a percentage, the specified value; otherwise, 'auto'.

Like 'top', but specifies how far a box's left margin edge isoffset to the right of the left edge of the box'scontaining block. For relativelypositioned boxes, the offset is with respect to the left edge of thebox itself.

The values for the four properties have the following meanings:

<length>
The offset is a fixed distance from the reference edge. Negative values are allowed.
<percentage>
The offset is a percentage of the containing block's width (for'left' or'right') or height (for'top' and'bottom'). Negative values are allowed.
auto
For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' aswell. See the sections on thewidthandheightofabsolutely positioned, non-replaced elements for details. For replaced elements, theeffect of this value depends only on the intrinsic dimensions of thereplaced content. See the sections on thewidth andheight of absolutelypositioned, replaced elements for details.

9.4Normal flow

Boxes in the normal flow belong to aformatting context, which may beblock or inline, but not both simultaneously.Block boxes participate in ablock formatting context.Inline boxes participate in aninline formatting context.

9.4.1Block formatting contexts

Floats, absolutely positioned elements, inline-blocks, table-cells,table-captions, and elements with 'overflow' other than 'visible'(except when that value has been propagated to the viewport) establishnew block formatting contexts.

In a block formatting context, boxes are laid out one after theother, vertically, beginning at the top of a containing block. Thevertical distance between two sibling boxes is determined by the'margin' properties. Vertical marginsbetween adjacent block boxes in a block formatting contextcollapse.

In a block formatting context, each box's left outer edge touches theleft edge of the containing block (for right-to-left formatting, rightedges touch). This is true even in the presence of floats (although abox'sline boxes may shrink due to the floats), unless the boxestablishes a new block formatting context (in which case the box itselfmay become narrower due tothe floats).

For information about page breaks in paged media, please consultthe section onallowedpage breaks.

9.4.2Inline formatting context

In an inline formatting context, boxes are laid out horizontally,one after the other, beginning at the top of a containingblock. Horizontal margins, borders, and padding are respected betweenthese boxes. The boxes may be aligned vertically in different ways: theirbottoms or tops may be aligned, or the baselines of text within themmay be aligned. The rectangular area that contains the boxes that forma line is called aline box.

The width of a line box is determined by acontaining block and the presence of floats. The height of a linebox is determined by the rules given in the section online height calculations.

A line box is always tall enough for all of the boxes it contains. However, it may be taller than the tallest box it contains (if, for example, boxes are aligned so that baselines line up). When the height of a box B is less than the height of the line box containing it, the vertical alignment of B within the line box is determined by the'vertical-align' property.When several inline boxes cannot fit horizontally within a singleline box, they are distributed among two or more vertically-stackedline boxes. Thus, a paragraph is a vertical stack of line boxes. Lineboxes are stacked with no vertical separation and they never overlap.

In general, the left edge of a line box touches the left edgeof its containing block and the right edge touches the right edge ofits containing block. However, floating boxes may come between thecontaining block edge and the line box edge. Thus, although lineboxes in the same inline formatting context generally have the samewidth (that of the containing block), they may vary in width ifavailable horizontal space is reduced due tofloats. Line boxes in the same inline formattingcontext generally vary in height (e.g., one line might contain a tallimage while the others contain only text).

When the total width of the inline boxes on a line is less than thewidth of the line box containing them, their horizontal distributionwithin the line box is determined by the'text-align' property. If thatproperty has the value 'justify', the user agent may stretch spacesand words in inline boxes (except for inline-table and inline-blockboxes) as well.

When an inline box exceeds the width of a line box, it is split into several boxes and these boxes are distributed across several line boxes. If an inline box cannot be split (e.g., if the inline box contains a single character, or language specific word breaking rules disallow a break within the inline box, or if the inline box is affected by a white-space value of nowrap or pre), then the inline box overflows the line box.

When an inline box is split, margins,borders, and padding have no visual effect where the split occurs (orat any split, when there are several).

Inline boxes may also be split into several boxeswithin thesame line box due tobidirectional textprocessing.

Line boxes that contain no text, no preserved white space, noinline elements with non-zero margins, padding, or borders, and noother in-flow content (such as images, inline blocks or inlinetables), and do not end with a line feed must be treated as zero-heightline boxes. For the purposes of margin collapsing, this line box mustbe ignored.

Here is an example of inline box construction. The following paragraph(created by the HTML block-level element P) contains anonymous textinterspersed with the elements EM and STRONG:

<P>Several <EM>emphasized words</EM> appear<STRONG>in this</STRONG> sentence, dear.</P>

The P element generates a block box that contains five inlineboxes, three of which are anonymous:

To format the paragraph, the user agent flows the five boxes intoline boxes. In this example, the box generated for the P elementestablishes the containing block for the line boxes. If the containingblock is sufficiently wide, all the inline boxes will fit into asingle line box:

 Severalemphasized words appearin this sentence, dear.

If not, the inline boxes will be split up and distributed acrossseveral line boxes. The previous paragraph might be split as follows:

Severalemphasized words appearin this sentence, dear.
or like this:
Severalemphasizedwords appearin this sentence, dear.

In the previous example, the EM box was split into two EM boxes(call them "split1" and "split2"). Margins, borders,padding, or text decorations have no visible effect after split1 orbefore split2.

Consider the following example:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"><HTML>  <HEAD>    <TITLE>Example of inline flow on several lines</TITLE>    <STYLE type="text/css">      EM {        padding: 2px;         margin: 1em;        border-width: medium;        border-style: dashed;        line-height: 2.4em;      }    </STYLE>  </HEAD>  <BODY>    <P>Several <EM>emphasized words</EM> appear here.</P>  </BODY></HTML>

Depending on the width of the P, the boxes may be distributed asfollows:

Image illustrating the effect of line breaking on thedisplay of margins, borders, and padding.   [D]

9.4.3Relative positioning

Once a box has been laid out according to thenormal flow or floated, it may be shifted relative tothis position. This is calledrelative positioning. Offsetting a box(B1) in this way has no effect on the box (B2) that follows: B2 isgiven a position as if B1 were not offset and B2 is not re-positionedafter B1's offset is applied. This implies that relative positioningmay cause boxes to overlap.However, if relative positioning causes an 'overflow:auto' or'overflow:scroll' box to haveoverflow, the UA must allow the user to access this content (at its offsetposition), which, through the creation of scrollbars, may affect layout.

A relatively positioned box keeps its normal flow size, includingline breaks and the space originally reserved for it. The section oncontaining blocks explains when arelatively positioned box establishes a new containing block.

For relatively positioned elements, 'left' and 'right' move thebox(es) horizontally, without changing their size. 'left' moves theboxes to the right, and 'right' moves them to the left. Since boxesare not split or stretched as a result of 'left' or 'right', thecomputed values are always: left = -right.

If both 'left' and 'right' are 'auto' (their initial values), thecomputed values are '0' (i.e., the boxes stay in their originalposition).

If 'left' is 'auto', its computed value is minus the value of 'right'(i.e., the boxes move to the left by the value of 'right').

If 'right' is specified as 'auto', its computed value is minus thevalue of 'left'.

If neither 'left' nor 'right' is 'auto', the position isover-constrained, and one of them has to be ignored. If the 'direction' property of the containing block is 'ltr, the value of 'left' wins and 'right'becomes -'left'. If 'direction' of the containing block is 'rtl', 'right' wins and 'left' is ignored.

Example(s):

Example. The following three rules are equivalent:

div.a8 { position: relative; direction: ltr; left: -1em; right: auto }div.a8 { position: relative; direction: ltr; left: auto; right: 1em }div.a8 { position: relative; direction: ltr; left: -1em; right: 5em }

The 'top' and 'bottom' properties move relatively positionedelement(s) up or down without changing their size. 'top' moves theboxes down, and 'bottom' moves them up. Since boxesare not split or stretched as a result of 'top' or 'bottom', thecomputed values are always: top = -bottom.If both are 'auto', their computed values are both '0'. If one of them is'auto', it becomes the negative of the other. If neither is 'auto','bottom' is ignored (i.e., the computed value of 'bottom' will beminus the value of 'top').

Note. Dynamic movement of relatively positioned boxes can produceanimation effects in scripting environments (see also the'visibility' property). Although relative positioning may be used as a form of superscripting and subscripting, the line height is not automatically adjusted to take the positioning into consideration. See the description ofline height calculations for moreinformation.

Examples of relative positioning are provided in the sectioncomparing normal flow, floats, and absolutepositioning.

9.5Floats

A float is a box that is shifted to the left or right on thecurrent line. The most interesting characteristic of a float (or"floated" or "floating" box) is that content may flow along its side(or be prohibited from doing so by the'clear' property). Content flows downthe right side of a left-floated box and down the left side of aright-floated box. The following is an introduction to floatpositioning and content flow; the exactrules governing float behavior are given inthe description of the'float'property.

A floated box isshifted to the left or right until its outer edge touches thecontaining block edge or the outer edge of another float. If there's a line box, the top of the floated box is aligned with the top of the current line box.

If there is not enough horizontal room for thefloat, it is shifted downward until either it fits or there are nomore floats present.

Since a float is not in the flow, non-positioned block boxescreated before and after the float box flow vertically as if the floatdid not exist. However, line boxes created next to the float areshortened to make room for the margin box of the float. If a shortened line box is too small to contain any further content, then it is shifted downward until either it fits or there are no more floats present.Any content in the current line before a floated box is reflowed in the first available line on the other side of the float.In other words, if inline boxes are placed on the line before a left float is encountered that fits in the remaining line box space, the left float is placed on that line, aligned with the top of the line box, and then the inline boxes already on the line are moved accordingly to the right of the float (the right being the other side of the left float) and vice versa for rtl and right floats.

The border box of a table, a block-level replaced element, or an element in the normal flow that establishes a newblock formatting context (such as an element with 'overflow' other than 'visible')must not overlap any floats in the same block formatting context asthe element itself. If necessary, implementations should clear thesaid element by placing it below any preceding floats, but may placeit adjacent to such floats if there is sufficient space.They may even make the border box of said element narrower thandefined bysection 10.3.3.CSS2 does not define when a UA may put said element next to the floator by how much said element may become narrower.

Example(s):

Example. In the following document fragment, the containing block is too narrow to contain the content next to the float, so the content gets moved to below the floats where it is aligned in the line box according to the text-align property.

p { width: 10em; border: solid aqua; }span { float: left; width: 5em; height: 5em; border: solid blue; }...<p>  <span> </span>  Supercalifragilisticexpialidocious</p>

This fragment might look like this:

Image illustrating the effect of an unbreakable piece of content  being reflowed to just after a float which left insufficient room next to it  for the content to fit.

Several floats may be adjacent, and this model also applies toadjacent floats in the same line.

Example(s):

The following rule floats all IMG boxes withclass="icon" to the left (andsets the left margin to '0'):

img.icon {   float: left;  margin-left: 0;}

Consider the following HTML source and style sheet:

  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"><HTML>  <HEAD>    <TITLE>Float example</TITLE>    <STYLE type="text/css">      IMG { float: left }      BODY, P, IMG { margin: 2em }    </STYLE>  </HEAD>  <BODY>    <P><IMG src=img.png alt="This image will illustrate floats">       Some sample text that has no other...  </BODY></HTML>

The IMG box is floated to the left. The content that follows isformatted to the right of the float, starting on the same line as thefloat. The line boxes to the right of the float are shortened due tothe float's presence, but resume their "normal" width (that of thecontaining block established by the P element) after the float. Thisdocument might be formatted as:

Image illustrating how floating boxes interact withmargins.   [D]

Formatting would have been exactly the same if the document hadbeen:

<BODY>  <P>Some sample text   <IMG src=img.png alt="This image will illustrate floats">           that has no other...</BODY>

because the content to the left of the float is displaced bythe float and reflowed down its right side.

As stated insection 8.3.1, the margins of floating boxes nevercollapse with margins ofadjacent boxes. Thus, in the previous example, vertical margins do notcollapse between the P boxand the floated IMG box.

The contents of floats are stacked as if floats generated new stacking contexts, except that any positioned elements and elementsthat actually create newstacking contexts take part in the float's parent stacking context. A float can overlap other boxes in the normal flow (e.g., when a normal flow box next to a float has negative margins). When this happens, floats are rendered in front of non-positioned in-flow blocks, but behind in-flow inlines.

Example(s):

Here is another illustration, showing what happens when a floatoverlaps borders of elements in the normal flow.

Image showing a floating imagethat overlaps the borders of two paragraphs: the borders areinterrupted by the image.   [D]

A floating image obscures bordersof block boxes it overlaps.

The following example illustrates the use of the'clear' property to prevent contentfrom flowing next to a float.

Example(s):

Assuming a rule such as this:

p { clear: left }

formatting might look like this:

Image showing a floatingimage and the effect of 'clear: left' on the two paragraphs.   [D]

Both paragraphs have set 'clear: left', whichcauses the second paragraph to be "pushed down" to a position belowthe float — "clearance" is added above its top margin toaccomplish this (see the'clear' property).

9.5.1Positioning the float: the'float' property

'float'
Value:  left | right | none |inherit
Initial:  none
Applies to:  all, but see9.7
Inherited:  no
Percentages:  N/A
Media:  visual
Computed value:  as specified

This property specifies whether a box should float to the left,right, or not at all. It may be set for any element, but only applies to elements that generate boxes that are notabsolutely positioned. The values of this property havethe following meanings:

left
The element generates ablock box that isfloated to the left. Content flows on the right side of the box,starting at the top (subject to the'clear' property).
right
Similar to 'left', except the box is floated to the right, and content flows on the left side of the box, starting at the top.
none
The box is not floated.

User agents may treat float as 'none' on the root element.

Here are the precise rules thatgovern the behavior of floats:

  1. The leftouter edge of aleft-floating box may not be to the left of the left edge of itscontaining block. Ananalogous rule holds for right-floating elements.
  2. If the current box is left-floating, and there are any left-floating boxes generated by elements earlier in the source document,then for each such earlier box, either the leftouter edge of the current box must beto the right of the rightouter edgeof the earlier box, or its top must be lower than the bottom of theearlier box. Analogous rules hold for right-floating boxes.
  3. The rightouter edge of aleft-floating box may not be to the right of the leftouter edge of any right-floatingbox that is to the right of it. Analogous rules hold forright-floating elements.
  4. A floating box'souter topmay not be higher than the top of itscontaining block.When the float occurs between two collapsing margins, thefloat is positioned as if it had an otherwise emptyanonymous block parent taking part inthe flow. The position of such a parent is defined bythe rules in the section on margincollapsing.
  5. Theouter top of a floating boxmay not be higher than the outer top of anyblock orfloated box generated by an elementearlier in the source document.
  6. Theouter top of an element'sfloating box may not be higher than the top of anyline-box containing a boxgenerated by an element earlier in the source document.
  7. A left-floating box that has another left-floating box to its leftmay not have its right outer edge to the right of its containingblock's right edge. (Loosely: a left float may not stick out at theright edge, unless it is already as far to the left as possible.) Ananalogous rule holds for right-floating elements.
  8. A floating box must be placed as high as possible.
  9. A left-floating box must be put as far to the left aspossible, a right-floating box as far to the right as possible. Ahigher position is preferred over one that is further to theleft/right.

References to other elements in these rules refer only to other elements in the sameblock formatting context as the float.

Example(s):

This HTML fragment results in the b floating to the right.

<P>a<SPAN>b</SPAN></P>

If the P element's width is enough, the a and the b will be side byside. It might look like this:

An a at the left side of a box and a b at the right side

9.5.2Controlling flow next to floats:the'clear' property

'clear'
Value:  none | left | right | both |inherit
Initial:  none
Applies to:  block-level elements
Inherited:  no
Percentages:  N/A
Media:  visual
Computed value:  as specified

This property indicates which sides of an element's box(es) maynot be adjacent to an earlier floating box. The 'clear'property does not consider floats inside the element itself or inotherblock formattingcontexts.

Forrun-in boxes,this property applies to the final block box to which the run-in box belongs.

Clearance is introduced as spacing above the margin-top of an element. It is used to push the element vertically (typically downward), past the float.

Values have the following meanings when applied to non-floatingblock boxes:

left
The clearance of the generated box is set to the amount necessary to place thetop border edge below the bottom outer edge of any left-floatingboxes that resulted from elements earlier in the source document.
right
The clearance of the generated box is set to the amount necessary to place thetop border edge below the bottom outer edge of any right-floatingboxes that resulted from elements earlier in the source document.
both
The clearance of the generated box is set to the amount necessary to place thetop border edge below the bottom outer edge of any right-floatingand left-floating boxes that resulted from elements earlier in thesource document.
none
No constraint on the box's position with respect to floats.

Computing the clearance of an element on which 'clear' is set is done by first determining the hypothetical position of the element's top border edge within its parent block. This position is determined after the top margin of the element has been collapsed with previous adjacent margins (including the top margin of the parent block).

If this hypothetical position of the element's top border edge is notpast the relevant floats, then its clearance must be set to thegreater of:

  1. The amount necessary to place the border edge of the block even with the bottom outer edge of the lowest float that is to be cleared.
  2. The amount necessary to make the sum of the following equal to the distance to which these margins collapsed when the hypothetical position was calculated:

Note: The clearance can be negative.

Example(s):

An example of negative clearance is this situation, in which theclearance is -1em. (Assume none of the elements have borders orpadding):

<p>  First paragraph.<p>  Floating paragraph.<p>  Last paragraph.

Explanation: Without the 'clear', the first and last paragraphs'margins would collapse and the last paragraph's top border edge wouldbe flush with the top of the floating paragraph. But the 'clear'requires the top border edge to bebelow the float, i.e., 2emlower. That means that the margins must not collapse and clearancemust be added such thatclearance +margin-top =2em, i.e.,clearance = 2em -margin-top = 2em -3em = -1em.

When the property is set on floating elements, it results in amodification of therules forpositioning the float. An extra constraint (#10) is added:

Note.This propertyapplied to all elements in CSS1. Implementations may therefore have supported this property on all elements. In CSS2 and CSS 2.1 the 'clear' property only applies to block-level elements. Therefore authors should only use this property on block-levelelements. If an implementation does support clear on inline elements, rather than setting a clearance as explained above, the implementation should force a break and effectively insert one or more empty line boxes (or shifting the new line box downward as described insection 9.5) to move the top of the cleared inline's line box to below the respective floating box(es).

9.6Absolute positioning

In the absolute positioning model, a box is explicitly offset withrespect to its containing block. It is removed from the normal flowentirely (it has no impact on later siblings). An absolutelypositioned box establishes a new containing block for normal flowchildren and absolutely (but not fixed) positioned descendants. However, the contents of anabsolutely positioned element do not flow around any other boxes. Theymay obscure the contents of another box (or be obscured themselves), depending on thestack levels of the overlapping boxes.

References in this specification to anabsolutely positionedelement (or its box) imply that the element's'position' property has the value'absolute' or 'fixed'.

9.6.1Fixed positioning

Fixed positioning is a subcategory of absolute positioning. Theonly difference is that for a fixed positioned box, the containingblock is established by theviewport. Forcontinuous media, fixedboxes do not move when the document is scrolled. In this respect, theyare similar tofixedbackground images. Forpaged media, boxeswith fixed positions are repeated on every page. This is useful forplacing, for instance, a signature at the bottom of each page.Boxes with fixed position that are larger than the page area areclipped. Parts of the fixed position box that are not visible in theinitial containing block will not print.

Authors may use fixed positioning to create frame-like presentations.Consider the following frame layout:

Image illustrating a frame-like layout with position='fixed'.   [D]

This might be achieved with the following HTML document andstyle rules:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"><HTML>  <HEAD>    <TITLE>A frame document with CSS 2.1</TITLE>    <STYLE type="text/css" media="screen">      BODY { height: 8.5in } /* Required for percentage heights below */      #header {        position: fixed;        width: 100%;        height: 15%;        top: 0;        right: 0;        bottom: auto;        left: 0;      }      #sidebar {        position: fixed;        width: 10em;        height: auto;        top: 15%;        right: auto;        bottom: 100px;        left: 0;      }      #main {        position: fixed;        width: auto;        height: auto;        top: 15%;        right: 0;        bottom: 100px;        left: 10em;      }      #footer {        position: fixed;        width: 100%;        height: 100px;        top: auto;        right: 0;        bottom: 0;        left: 0;      }    </STYLE>  </HEAD>  <BODY>    <DIV> ...  </DIV>    <DIV> ...  </DIV>    <DIV> ...  </DIV>    <DIV> ...  </DIV>  </BODY></HTML>

9.7Relationships between 'display', 'position',and 'float'

The three properties that affect box generation and layout —'display','position', and'float' — interact as follows:

  1. If'display'has the value 'none', then'position' and'float' do not apply. In this case, the element generates no box.
  2. Otherwise, if'position'has the value 'absolute' or 'fixed', the box is absolutely positioned, the computedvalue of'float' is 'none', and display is set according to the table below. The position of the box will be determined by the'top','right','bottom' and'left' properties and the box's containing block.
  3. Otherwise, if 'float' has a value other than 'none', the box isfloated and 'display' is set according to the table below.
  4. Otherwise, if the element is the root element, 'display' is set according to the table below.
  5. Otherwise, the remaining'display' property values applyas specified.
Specified valueComputed value
inline-tabletable
inline, run-in, table-row-group, table-column,table-column-group, table-header-group, table-footer-group, table-row,table-cell, table-caption, inline-blockblock
otherssame as specified

9.8Comparison of normal flow, floats, and absolute positioning

To illustrate the differences between normal flow, relativepositioning, floats, and absolute positioning, we provide a series ofexamples based on the following HTML:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"><HTML>  <HEAD>    <TITLE>Comparison of positioning schemes</TITLE>  </HEAD>  <BODY>    <P>Beginning of body contents.      <SPAN> Start of outer contents.      <SPAN> Inner contents.</SPAN>      End of outer contents.</SPAN>      End of body contents.    </P>  </BODY></HTML>

In this document, we assume the following rules:

body { display: block; font-size:12px; line-height: 200%;        width: 400px; height: 400px }p    { display: block }span { display: inline }

The final positions of boxes generated by theouter andinner elements vary in each example. In each illustration,the numbers to the left of the illustration indicate thenormal flow position of the double-spaced (forclarity) lines.

Note. The diagrams in this section are illustrative and not to scale. They are meant to highlight the differences between the various positioning schemes in CSS 2.1, and are not intended to be reference renderings of the examples given.

9.8.1Normal flow

Consider the following CSS declarations forouter andinner that do not alter thenormalflow of boxes:

#outer { color: red }#inner { color: blue }

The P element contains all inline content:anonymous inline text and two SPANelements. Therefore, all of the content will be laid outin an inline formatting context, within a containing blockestablished by the P element, producing something like:

Image illustrating the normal flow of text between parent and sibling boxes.   [D]

9.8.2Relative positioning

To see the effect ofrelativepositioning, we specify:

#outer { position: relative; top: -12px; color: red }#inner { position: relative; top: 12px; color: blue }

Text flows normally up to theouter element. Theouter text is then flowed into its normal flow position anddimensions at the end of line 1. Then, the inline boxes containing thetext (distributed over three lines) are shifted as a unit by '-12px'(upwards).

The contents ofinner, as a child ofouter, wouldnormally flow immediately after the words "of outer contents" (on line1.5). However, theinner contents are themselves offsetrelative to theouter contents by '12px' (downwards), back totheir original position on line 2.

Note that the content followingouter is not affected by therelative positioning ofouter.

Image illustrating the effects of relative positioning on abox's content.   [D]

Note also that had the offset ofouter been '-24px', thetext ofouter and the body text would have overlapped.

9.8.3Floating a box

Now consider the effect offloating theinner element's text to the right by means of the followingrules:

#outer { color: red }#inner { float: right; width: 130px; color: blue }

Text flows normally up to theinner box, which is pulledout of the flow and floated to the right margin (its'width' has been assigned explicitly).Line boxes to the left of the float are shortened, and the document's remaining text flows into them.

Image illustrating the effects of floating a box.   [D]

To show the effect of the'clear' property, we add asiblingelement to the example:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"><HTML>  <HEAD>    <TITLE>Comparison of positioning schemes II</TITLE>  </HEAD>  <BODY>    <P>Beginning of body contents.      <SPAN id=outer> Start of outer contents.      <SPAN id=inner> Inner contents.</SPAN>      <SPAN id=sibling> Sibling contents.</SPAN>      End of outer contents.</SPAN>      End of body contents.    </P>  </BODY></HTML>

The following rules:

#inner { float: right; width: 130px; color: blue }#sibling { color: red }

cause theinner box to float to the right as before and thedocument's remaining text to flow into the vacated space:

Image illustrating the effects of floating a box withoutsetting the clear property to control the flow of text around thebox.   [D]

However, if the'clear'property on thesibling element is set to 'right' (i.e., thegeneratedsibling box will not accept a position next tofloating boxes to its right), thesibling content begins toflow below the float:

#inner { float: right; width: 130px; color: blue }#sibling { clear: right; color: red }

Image illustrating the effects of floating an element with setting the clear property to control the flow of text around the element.   [D]

9.8.4Absolute positioning

Finally, we consider the effect ofabsolute positioning.Consider the following CSS declarations forouter andinner:

#outer {     position: absolute;     top: 200px; left: 200px;     width: 200px;     color: red;}#inner { color: blue }

which cause the top of theouter box to be positioned withrespect to its containing block. The containing block for a positionedbox is established by the nearest positioned ancestor (or, if noneexists, theinitial containingblock, as in our example). The top side of theouter boxis '200px' below the top of the containing block and the left side is'200px' from the left side. The child box ofouter is flowednormally with respect to its parent.

Image illustrating the effects of absolutely positioning a box.   [D]

The following example shows an absolutely positioned box that is achild of a relatively positioned box. Although the parentouter box is not actually offset, setting its'position' property to 'relative'means that its box may serve as the containing block for positioneddescendants. Since theouter box is an inline box that issplit across several lines, the first inline box's top and left edges(depicted by thick dashed lines in the illustration below)serve as references for'top' and'left' offsets.

#outer {   position: relative;   color: red }#inner {   position: absolute;   top: 200px; left: -100px;   height: 130px; width: 130px;   color: blue;}

This results in something like the following:

Image illustrating the effects of absolutely positioning abox with respect to a containing block.   [D]

If we do not position theouter box:

#outer { color: red }#inner {  position: absolute;   top: 200px; left: -100px;   height: 130px; width: 130px;   color: blue;}

the containing block forinner becomes theinitial containing block (in ourexample). The following illustration shows where theinnerbox would end up in this case.

Image illustrating the effects of absolutely positioning a box with respect to a containing block established by a normally positioned parent.   [D]

Relative and absolute positioning may be used to implement changebars, as shown in the following example. The following fragment:

<P style="position: relative; margin-right: 10px; left: 10px;">I used two red hyphens to serve as a change bar. Theywill "float" to the left of the line containing THIS<SPAN style="position: absolute; top: auto; left: -1em; color: red;">--</SPAN>word.</P>

might result in something like:

Image illustrating the use of floats to create a changebar effect.   [D]

First, the paragraph (whose containing block sides are shown in theillustration) is flowed normally. Then it is offset '10px' from theleft edge of the containing block (thus, a right margin of '10px' hasbeen reserved in anticipation of the offset). The two hyphens actingas change bars are taken out of the flow and positioned at the currentline (due to 'top: auto'), '-1em' from the left edge of its containingblock (established by the P in its final position). The result isthat the change bars seem to "float" to the left of the currentline.

9.9Layered presentation

9.9.1Specifying the stack level: the'z-index' property

'z-index'
Value:  auto |<integer> |inherit
Initial:  auto
Applies to:  positioned elements
Inherited:  no
Percentages:  N/A
Media:  visual
Computed value:  as specified

For a positioned box, the'z-index' property specifies:

  1. The stack level of the box in the current stacking context.
  2. Whether the box establishes a local stacking context.

Values have the following meanings:

<integer>
This integer is the stack level of the generated boxin the current stacking context. The box also establishes a local stacking context in which its stacklevel is '0'.
auto
The stack level of the generated box in the current stackingcontext is the same as its parent's box. Thebox does not establish a new local stacking context.

In this section, the expression "in front of" means closer to the user as the user faces the screen.

In CSS 2.1, each box has a position in three dimensions. In additionto their horizontal and vertical positions, boxes lie along a "z-axis"and are formatted one on top of the other. Z-axis positions areparticularly relevant when boxes overlap visually. This sectiondiscusses how boxes may be positioned along the z-axis.

The order in which the rendering tree is painted onto the canvas is described in terms of stacking contexts. Stacking contexts can contain further stacking contexts. A stacking context is atomic from the point of view of its parent stacking context; boxes in other stacking contexts may not come between any of its boxes.

Each box belongs to onestacking context. Each box in a givenstacking context has an integerstack level, whichis its position on the z-axis relative to other boxes in the samestacking context. Boxes with greater stack levels are always formattedin front of boxes with lower stack levels. Boxes may have negativestack levels. Boxes with the same stack level in a stacking contextare stacked back-to-front according to document tree order.

The root element forms the root stacking context. Other stacking contexts are generated by any positioned element (including relatively positioned elements) having a computed value of 'z-index' other than 'auto'. Stacking contexts are not necessarily related to containing blocks. In future levels of CSS, other properties may introduce stacking contexts, for example 'opacity'[CSS3COLOR].

Each stacking context consists of the followingstacking levels (from back to front):

  1. the background and borders of the element forming the stacking context.
  2. the stacking contexts of descendants with negative stack levels.
  3. a stacking level containing in-flow non-inline-level non-positioned descendants.
  4. a stacking level for non-positioned floats and their contents.
  5. a stacking level for in-flow inline-level non-positioned descendants.
  6. a stacking level for positioned descendants with 'z-index: auto', and any descendant stacking contexts with 'z-index: 0'.
  7. the stacking contexts of descendants with positive stack levels.

For a more thorough explanation of the stacking order, please seeAppendix E.

The contents of inline blocks and inline tables are stacked as ifthey generated new stacking contexts, except that any positionedelements and any elements thatactually create new stacking contexts take part in the parentstacking context. They are then painted atomically in the inlinestacking level.

In the following example, the stack levels ofthe boxes (named with their "id" attributes) are:"text2"=0, "image"=1, "text3"=2, and "text1"=3. The"text2" stack level is inherited from the root box. Theothers are specified with the'z-index' property.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"><HTML>  <HEAD>    <TITLE>Z-order positioning</TITLE>    <STYLE type="text/css">      .pile {         position: absolute;         left: 2in;         top: 2in;         width: 3in;         height: 3in;       }    </STYLE>  </HEAD>  <BODY>    <P>      <IMG            src="butterfly.png" alt="A butterfly image"          >    <DIV         >      This text will overlay the butterfly image.    </DIV>    <DIV>      This text will be beneath everything.    </DIV>    <DIV         >      This text will underlay text1, but overlay the butterfly image    </DIV>  </BODY></HTML>

This example demonstrates the notion oftransparency. The default behavior of the background is to allow boxes behind it to be visible. In the example, each box transparently overlays the boxes below it. Thisbehavior can be overridden by using one of the existingbackground properties.

9.10Text direction:the'direction'and'unicode-bidi'properties

Conforming user agents that donot support bidirectional text may ignore the'direction' and'unicode-bidi' propertiesdescribed in this section. This exception includes UAs that renderright-to-left characters simply because a font on the system contains thembut do not support the concept of right-to-left text direction.

The characters in certain scripts are written from right toleft. In some documents, in particular those written with the Arabicor Hebrew script, and in some mixed-language contexts, text in asingle (visually displayed) block may appear with mixeddirectionality. This phenomenon is calledbidirectionality, or"bidi" for short.

The Unicode standard ([UNICODE], section 3.11) defines a complexalgorithm for determining the proper directionality of text. Thealgorithm consists of an implicit part based on character properties,as well as explicit controls for embeddings and overrides. CSS 2.1 relieson this algorithm to achieve proper bidirectional rendering. The'direction' and'unicode-bidi' properties allowauthors to specify how the elements and attributes of a documentlanguage map to this algorithm.

User agents that support bidirectional text must apply the Unicodebidirectional algorithm to every sequence of inline boxes uninterruptedby a forced line break or block boundary. This sequence forms the"paragraph" unit in the bidirectional algorithm. The paragraph embeddinglevel is set according to the value of the'direction' property of the containingblock rather than by the heuristic given in steps P2 and P3 of the Unicodealgorithm.

Because the directionality of a text depends on the structure andsemantics of the document language, these properties should in mostcases be used only by designers of document type descriptions (DTDs),or authors of special documents. If a default style sheet specifiesthese properties, authors and users should not specify rules tooverride them.

The HTML 4 specification ([HTML4], section 8.2) definesbidirectionality behavior for HTML elements. The style sheetrules that would achieve the bidi behavior specified in[HTML4] aregiven inthe sample style sheet. TheHTML 4 specification also contains more information onbidirectionality issues.

'direction'
Value:  ltr | rtl |inherit
Initial:  ltr
Applies to:  all elements, but see prose
Inherited:  yes
Percentages:  N/A
Media:  visual
Computed value:  as specified

This property specifies the base writing direction of blocks andthe direction of embeddings and overrides (see'unicode-bidi') for the Unicodebidirectional algorithm. In addition, it specifies the direction oftable column layout, the direction ofhorizontaloverflow, and theposition of an incomplete last line in a block in case of 'text-align:justify'.

Values for this property have the following meanings:

ltr
Left-to-right direction.
rtl
Right-to-left direction.

For the'direction'property to affect reordering in inline-level elements, the'unicode-bidi' property's valuemust be 'embed' or 'override'.

Note. The'direction' property, whenspecified for table column elements, is not inherited by cells in thecolumn since columns are not the ancestors of the cells in the document tree. Thus, CSS cannot easily capture the "dir" attribute inheritance rules describedin[HTML4], section 11.3.2.1.

'unicode-bidi'
Value:  normal | embed | bidi-override |inherit
Initial:  normal
Applies to:  all elements, but see prose
Inherited:  no
Percentages:  N/A
Media:  visual
Computed value:  as specified

Values for this property have the following meanings:

normal
The element does not open an additional level of embedding withrespect to the bidirectional algorithm. For inline-level elements,implicit reordering works across element boundaries.
embed
If the element is inline-level, this valueopens an additional level of embedding with respect to thebidirectional algorithm. The direction of this embedding level isgiven by the'direction'property. Inside the element, reordering is done implicitly. Thiscorresponds to adding a LRE (U+202A; for 'direction: ltr') or RLE(U+202B; for 'direction: rtl') at the start of the element and a PDF(U+202C) at the end of the element.
bidi-override
For inline-level elements this creates an override. For block-level, table-cell, table-caption, or inline-block elements this creates an override for inline-level descendants not within another block-level, table-cell, table-caption, or inline-block element.This means that inside the element, reordering is strictly in sequenceaccording to the'direction'property; the implicit part of the bidirectional algorithm isignored. This corresponds to adding a LRO (U+202D; for 'direction:ltr') or RLO (U+202E; for 'direction: rtl') at the start of theelement or at the start of each anonymous child block box, if any, anda PDF (U+202C) at the end of the element.

The final order of characters in each block-level element is thesame as if the bidi control codes had been added as described above,markup had been stripped, and the resulting character sequence hadbeen passed to an implementation of the Unicode bidirectionalalgorithm for plain text that produced the same line-breaks as thestyled text. In this process, non-textual entities such as images aretreated as neutral characters, unless their'unicode-bidi' property has avalue other than 'normal', in which case they are treated as strongcharacters in the'direction'specified for the element.

Please note that in order to be able to flow inline boxes in auniform direction (either entirely left-to-right or entirelyright-to-left), more inline boxes (including anonymous inline boxes)may have to be created, and some inline boxes may have to be split upand reordered before flowing.

Because the Unicode algorithm has a limit of61 levels ofembedding, care should be taken not to use'unicode-bidi' with a value otherthan 'normal' unless appropriate. In particular, a value of 'inherit'should be used with extreme caution. However, for elements that are,in general, intended to be displayed as blocks, a setting of'unicode-bidi: embed' is preferred to keep the element together incase display is changed to inline (see example below).

The following example shows an XML document with bidirectionaltext. It illustrates an important design principle:DTD designers should take bidiinto account both in the language proper (elements and attributes) andin any accompanying style sheets. The style sheets should be designedso that bidi rules are separate from other style rules. The bidi rulesshould not be overridden by other style sheets so that the documentlanguage's or DTD's bidi behavior is preserved.

Example(s):

In this example, lowercase letters stand for inherently left-to-right characters anduppercase letters represent inherently right-to-left characters:

<HEBREW>  <PAR>HEBREW1 HEBREW2 english3 HEBREW4 HEBREW5</PAR>  <PAR>HEBREW6 <EMPH>HEBREW7</EMPH> HEBREW8</PAR></HEBREW><ENGLISH>  <PAR>english9 english10 english11 HEBREW12 HEBREW13</PAR>  <PAR>english14 english15 english16</PAR>  <PAR>english17 <HE-QUO>HEBREW18 english19 HEBREW20</HE-QUO></PAR></ENGLISH>

Since this is XML, the style sheet is responsible for setting thewriting direction. This is the style sheet:

/* Rules for bidi */HEBREW, HE-QUO  {direction: rtl; unicode-bidi: embed}ENGLISH         {direction: ltr; unicode-bidi: embed} /* Rules for presentation */HEBREW, ENGLISH, PAR  {display: block}EMPH                  {font-weight: bold}

The HEBREW element is a block with a right-to-left base direction,the ENGLISH element is a block with a left-to-right basedirection. The PARs are blocks that inherit the base direction fromtheir parents. Thus, the first two PARs are read starting at the topright, the final three are read starting at the top left. Please notethat HEBREW and ENGLISH are chosen as element names for explicitnessonly; in general, element names should convey structure withoutreference to language.

The EMPH element is inline-level, and since its value for'unicode-bidi' is 'normal' (theinitial value), it has no effect on the ordering of the text. TheHE-QUO element, on the other hand, creates an embedding.

The formatting of this text might look like this if the line lengthis long:

               5WERBEH 4WERBEH english3 2WERBEH 1WERBEH                                8WERBEH7WERBEH 6WERBEHenglish9 english10 english11 13WERBEH 12WERBEHenglish14 english15 english16english17 20WERBEH english19 18WERBEH

Note that the HE-QUO embedding causes HEBREW18 to be to the rightof english19.

If lines have to be broken, it might be more like this:

       2WERBEH 1WERBEH  -EH 4WERBEH english3                 5WERB   -EH7WERBEH 6WERBEH                 8WERBenglish9 english10 en-glish11 12WERBEH13WERBEHenglish14 english15english16english17 18WERBEH20WERBEH english19

Because HEBREW18 must be read before english19, it is on the lineabove english19. Just breaking the long line from the earlierformatting would not have worked. Note also that the first syllablefrom english19 might have fit on the previous line, but hyphenation ofleft-to-right words in a right-to-left context, and vice versa, isusually suppressed to avoid having to display a hyphen in the middleof a line.


previous  next  contents  properties  index  


[8]ページ先頭

©2009-2025 Movatter.jp