CSS PositioningReview the W3C CSS standard recommendation.
Inline boxes are wrapped as needed, moving down to a new line when the available width is exceeded. This can cause some ugly visuals if borders are used as seen below.
content content content content content content content content content contentcontent content content content content content content content content content
According to the standard, the two bordered segments above should display only three sides. No one said standards were pretty.
When an element specifies
position:relative; it is initially
positioned following the normal flow rules. Surrounding boxes are positioned
accordingly. Then, the box is moved according to its offset properties.
Note that the surrounding boxes above are positioned normally, including the collapsing of vertical margins, and that the repositioned box may overlap other boxes.
Browsers may differ in how they handle the display of relatively positioned elements when they overlap other content. Unfortunately, the standards specification appears unclear in how this should be dealt with.
Some, like Internet Explorer 5.5 and Netscape 6.0, will display the positioned element in front of all its siblings. Others, like Opera 5.0, use the default stacking order and will display it in front siblings that preceed it in source order but behind siblings that follow.
Stacking order is detailed in the discussion on absolute positioning. But
note that you can use the
z-index style property to explicitly
set the stacking order for relatively positioned elements.
The offset values are specified using a combination of the
bottom style properties. The value of each is
interpreted as the distance the box's corresponding outer edge should be moved
with respect to its original position in the normal flow.
Note that opposing offsets are constrained. For example, if you specify
right and the value of one is not the
exact negative of the other, the
right setting will be
ignored. A specific
width setting may also cause an offset to be
ignored. The same is true of the
top, bottom and
In practice, you'll probably want to specify only one of
right and one of
Relatively positioned elements may or may not establish a new containing block for positioned (relative or absolute) descendant elements. They follow the same rules as non-positioned elements.
If the relatively positioned element is a block element, it establishes a new containing block. Positioned elements within it will use the "offset" position of that element as a base for positioning. In other words, the offsets of descendant elements are compounded.
If the relatively positioned element is an inline element, its offsets are not combined with the offsets of its positioned descendants. Instead they are based on the same containing block used by the relatively positioned element.
The original standards specification declared that relatively positioned elements always created a new containing block. However, later corrections to the standard changed this to state that such boxes follow the rules of non-positioned elements.
Some browsers incorporate this correction but others do not. Due to these disparities, you may wish to avoid such situations or always use block elements for relative positioning.
Floating is achieved by setting the
float property on an
element's style to either
rules apply to floated elements.
When specified, the box is positioned vertically as it would be within the normal flow, its top aligned with the top of the current line box. But horizontally, it is shifted as far to the right or left of its containing block as possible, within that block's padding (just like other content). Surrounding inline content is then allowed to flow around the opposite side.
The illustration below shows the result of code like the following, where a floated element is defined as part of inline text (margin, border and padding styles have been omitted for brevity).
<p> <span style="float:right;width:40%;">content...</span> content content content content content content content content... </p>
float property can be set to one of