This section is not normative.
This specification adds new keywords on the float property.
This document allows to specify whether a float floats to align with a float reference inline box, column, region or page. In the case of floats with a reference fragmentation container, placement can be deferred to a subsequent fragmentation container with the float-defer properties.
New values on the clear property add further ways of refining layouts.
The way contents wrap around floats can be controlled by changing the value of the wrap-flow property which initially is set to both for page floats.
Page floats as defined here work with different types of fragmentation types (columns, regions, pages) as well as container elements. The specification is no longer specific to print or to pages. At the same time, inline floats and page floats differ in many ways, and it may (or may not) be a good idea to separate the two entirely. Therefore, the name CSS Page Floats should probably be replaced with a more appropriate name.
2. TerminologyFloating elements can float to the start or end of the float anchor’s line or block, specified by the float attribute. The floats are aligning to the start or end of a float reference, specified by the float-reference attribute. The float reference can be the float anchor’s line box, column, region or page.
3.1. The float-reference property Name: float-reference Value: inline | column | region | page Initial: inline Applies to: all elements. Inherited: no Percentages: N/A Media: visual Computed value: as specified. Animatable: noThe float containing block formatting context is the same as that of the float anchor.
The float containing block formatting context is a new block formatting context with the same dimensions and placement as the float reference.
The float containing block formatting context is a new block formatting context with the same dimensions and placement as the float reference.
The float containing block formatting context is a new block formatting context with the same dimensions and placement as the float reference
It is not possible to directly specify which element to use as the reference element. This may be of interest to have.
Maybe something like:
<style>
.float {
float-reference: float-container;
}
#container {
float-container: true;
}
</style>
<div id="container">
<p>First paragraph<span class="float">FLOAT</span></p>
<p>Second paragraph
<span class="inline-block">[<span class="float">FLOAT</span>] </span>
And some more text</p>
</div>
This should float both floats with reference to the <div id="container"> element, rather than the <P> and inline <SPAN> elements.
3.2. The float property Name: float Value: block-start | block-end | inline-start | inline-end | snap-block | snap-inline | left | right | top | bottom | none Initial: none Applies to: all elements. Inherited: no Percentages: N/A Media: visual Computed value: as specified. Animatable: noIf the float reference is not a line box, the element generates a box that is floated to the block-start and line-start outer edges of the float reference.
The initial value of the max-width or max-height property that refers to the inline size of the float is '100%'.
Content flows on the block-end side of the box.
If the float reference is not a line box, the element generates a box that is floated to the block-end and line-start outer edges of the float reference.
The initial value of the max-width or max-height property that refers to the inline size of the float is '100%'.
Content flows on the block-start side of the box.
Otherwise, behaves like block-end, inline-start or inline-end depending on the float containing block’s direction and writing-mode.
Otherwise, behaves like block-start, inline-start or inline-end depending on the float containing block’s direction and writing-mode.
The optional keyword value specifies where the element is floated: start, end, or the nearest of the two. The initial value is near. If near is in effect and the element is within the specified distance both from the start and the end, end wins.
An element is considered to be a float if it has a snap-block() value, even if the element does not appear within the specified distance. This way, it can be determined whether an element is float or not without laying out the document.
snap-block(2em, near)
The optional keyword value specifies where the element is floated: line start, line end, or the nearest of the two. The initial value is near. If near is in effect and the element is within the specified distance both from the start and the end, end wins.
An element is considered to be a float if it has a snap-inline() value, even if the element does not appear within the specified distance. This way, it can be determined whether an element is float or not without laying out the document.
snap-inline(2em, near)
There is currently no way to float into a combination of directions (top right, right top, left bottom, bottom left, etc.).
Float figure to top of reference column:
.figure { float-reference: column; float: top }
In this example a block-start float that does not fill the entire
inline sizeof the float reference is placed at the start of the block and line.
.figure { float-reference: column; float: block-start; width: 50% }
In this example, a figure naturally appears close to a column break. There is not enough space for the figure in the first column, and it is therefore placed in the second column, leaving white space at the bottom of the first column.
To avoid the white space, the image can be floated to the nearest edge (in the block direction):
.figure { float-reference: column; float: snap-block }
In this example, the figure is already at the nearest edge, so it does not move. However, floats allow subsequent content to be displayed before the float and the white space can therefore be filled:
In this example, two figures naturally appear in the text flow:
A typographer would typically try to avoid single lines of text above/below figures, which can be achieved with:
div.figure { float-reference: column; float: snap-block(1.5em) }
The length value specifies the reach of the snap function; in this example the second figure is affected, but not the first.
In this example, two figures naturally appear in the text flow:
To make the figures snap to the nearest edges, this code can be applied:
div.figure { float-reference: column; float: snap-block(2.5em) }
The resultant rendering is:
In this example, tables will snap to the top/bottom if the top/bottom of the border box is closer than
3emfrom the top/bottom of the float-reference which is a block element.
table { float: snap } table { float: snap-block(3em) } table { float: snap-block(3em, bottom) } table { float: snap-block(3em 2em, bottom) }4. The clear property Name: clear Value: inline-start | inline-end | block-start | block-end | left | right | top | bottom | none Initial: none Applies to: block-level elements, floats, regions, pages Inherited: no Percentages: N/A Media: visual Computed value: as specified. Animatable: no
To prevent stacking of floats, the clear property can be used:
If applied to a page float, the float reference in which the page float is placed will be seen as full when determining whether it can host subsequent page floats that float in the inline-start direction.
If applied to a page float, the float reference in which the page float is placed will be seen as full when determining whether it can host subsequent page floats that float in the inline-end direction.
If applied to a page float, the float reference in which the page float is placed will be seen as full when determining whether it can host subsequent page floats that float in the block-start direction.
If applied to a page float, the float reference in which the page float is placed will be seen as full when determining whether it can host subsequent page floats that float in the block-end direction.
In this example, the two figures may appear in the same column:
.figure { float-reference: column; float: bottom; clear: none } <div class=figure></div> <div class=figure></div>
In this example, the two figures will appear in different columns:
.figure { float-reference: column; float: bottom; clear: bottom } <div class=figure></div> <div class=figure></div>
In this example, the two figures may appear at the bottom of the same column due to clearing only at the top:
.figure { float-reference: column; float: bottom; clear: top } <div class=figure></div> <div class=figure></div>
In this example, the two figures will appear in different columns due to clearing at the bottom:
.figure { float-reference: column; float: bottom; clear: bottom } <div class=figure></div> <div class=figure></div>
In this example, the two figures end up the top corner of two different pages:
.figure { float-reference: page; float: top; clear: top } <div class=figure></div> <div class=figure></div>
In this example, the two figures request different positions, and they may therefore end up in the same column:
.figure.one { float-reference: column; float: top; clear: top } .figure.two { float-reference: column; float: bottom; clear: bottom } <div class="figure one"></div> <div class="figure two"></div>5. Deferring floats
Users can influence the placement of a page float by deferring them to another fragmentation container than where the float anchor is placed.
Float deferring assigns an initial float reference, yet float stacking can lead page floats being moved to a subsequent fragmentation container if their initial float reference lacks the space to host them.
The float-defer property is introduced to control deferring floats:
5.1. The float-defer property Name: float-defer Value: <integer> | last | none Initial: none Applies to: floats Inherited: no Percentages: N/A Media: visual Computed value: as specified. Animatable: noThis property specifies whether the initial float reference of a page float is the fragmentation container in which the float anchor is placed after previous page floats have been placed, or in another one. Values are:
A negative integer value indicates that the initial float reference of the page float should be a fragmentation container of the fragmentation context, counting backward from the end, so that -1 is the last fragmentation container, -2 is the next-to-last, etc. . In the case of a negative integer value, the initial float reference is the Nth fragmentation container of the fragmentation context, where N is 1 plus the order number of the last fragmentation container within the given fragmentation context after all previous page floats have been placed plus the value of the `float-defer` property.
Zero is the same as `none`.
If the value of the `float-defer` property would cause the initial float reference to be an inexistent fragmentation container, the property is interpreted as if it were zero.
Negative float-defer values put the initial float reference a certain number to be a certain amount of fragmentation containers from the last fragmentation container at the time of of the placement. Subsequent page float stacking can mean that a page float is being placed in a later fragmentation container (a page float with float-defer set to -3 can end up being placed in the last fragmentation container), and later page floats may mean that new fragmentation containers are added, so that the a fragmentation container that previously was Nth last fragmentation container within a fragmentation context now is the N+Xth last. Additional fragmentation container(s) that are added after the page float was placed, will not cause the page float to be moved.
Float figure to the top of the region that follows the region in which the
float anchoris placed:
.figure { float-reference: region } .figure { float: top } .figure { float-defer: 1 }
Float figure to the top of the next-to-last column:
.figure { float-reference: column; float: top; float-defer: -2 }
Float figure to the top of the last page:
.figure { float-reference: page } .figure { float: top } .figure { float-defer: -1 }
Float figure to the top of the last column:
.figure { float-reference: column } .figure { float: top } .figure { float-defer: last }
Float figure to top of the last column:
.figure { float-reference: column; float: top; float-defer: last }6. Wrapping around floats
Floats have their wrap-flow property set to both initially and are treated like exclusions. This specification does not make any further specification about wrapping contents around floats.
Should the
wrap-flowreally be set to both, or should the flow be restricted to only be on one side?
7. The float-offset property Name: float-offset Value: <length> | <percentage> Initial: 0 Applies to: floats Inherited: no Percentages: see prose Media: visual Computed value: one absolute length Animatable: noThis property pushes a float in direction opposite of the where it has been floated with float.
This property can only influence a page float along an axis along which it has been floated.
(containing-block-width - float-width) * percentage (containing-block-height - float-height) * percentage
img { float-reference: column; float: left; float-offset: 2em; }
In this example, the image is floated to the left. Therefore, float-offset may only push the element to the right.
img { float-reference: column; float: right; float-offset: 5px; }
Pull quotes are often centered in a column. In this example, the pull quote is floated to the right, and then pushed back into the center.
.pullquote { float-reference: region; float: right; float-offset: 50%; /* 50% centers the box */ }8. Page float placement
The order of page floats placement is determined by the following rules:
The placement of a single page float is a process that has to be terminated entirely before the placement of a subsequent page float can be initiated. The placement process consists of the following steps:
Float references can grow up to the their `max-height` and `max-width` or their `available size`, whichever is the lowest, in order to accommodate page floats.
8.2. Rules for Float stackingPage floats are stacked within a given float reference in the order of their placement and in the direction of the inline- and flow-directions of the fragmentation context while not overlapping with any other page floats with the same float reference and by keeping a distance N between the page float’s margin edge and the padding edge of the float reference as well as between the page float’s margin edge and the margin edge of the last previously placed page float with the same float reference and the same float value, where N is the float-offset value of the page float. For the placement it is assumed that the page floats in the block directions fill the entire line size of the float reference and page floats in the inline direction fill the entire block size of the float reference.
If the page float has a defined clear-value, then the float reference in which the page float is placed is closed for all subsequent page floats that floating in the direction specified by the clear-value.
This definition may be a bit too simple, as it does not allow for page floats that go in the line direction and block direction within the same fragmentation container.
9. Floats and absolutely positioned exclusionsFloats and absolutely positioned exclusions share some common traits, but in the case of inline floats they are not the same. Floats that are not inline floats should behave the same as absolutely positioned exclusions with positions and sizes manually set to prevent overlap between floats and to prevent floats from moving beyond the edges of the float reference, with the float reference being grown as much as needed up to its maximum extend to accommodate all containing floats.
9.1. Differences between inline floats and absolutely positioned elementsThis section is not normative.
Inline floats and absolutely positioned elements are both out-of-flow elements. Absolutely positioned elements that are also exclusions can imitate many of the features of floats.
However, in the case of inline floats, the block formatting context that contains them (the float containing block formatting context) is required to include the area occupied by the float, which is not a requirement for absolutely positioned elements.
An inline float inside a
float containing block formatting contextgiven by a display-inline-block element. The element, which has a green border, is expanded to include the brown float.
<style>
.float {
float: left;
margin: 5px;
}
.border {
border: 3px solid black;
margin: 5px;
}
#outer {
border: 1px solid green;
display: inline-block;
}
canvas {
background-color: brown;
}
p {
margin: 5px;
}
</style>
<div id="outer">
<p class="border">
<span class="float border">
<canvas width="100" height="100"/>
</span>
First paragraph.
</p>
<p class="border">
Second paragraph and some more text.
</p>
</div>
In comparison, the below is the same HTML, but the float is replaced by an absolutely positioned element that is also an exclusion. The float containing block formatting context is still given by a display-inline-block element. However, the element, marked by a green border, does not expand to include the brown, absolutely positioned element.
<style>
.float {
position: absolute;
top: 8px;
left: 8px;
wrap-flow: both;
}
.border {
border: 3px solid black;
margin: 5px;
}
#outer {
border: 1px solid green;
display: inline-block;
position: relative;
}
canvas {
background-color: brown;
}
</style>
<div id="outer">
<p class="border">
<span class="float border">
<canvas width="100" height="100"/>
</span>
First paragraph.
</p>
<p class="border">
Second paragraph and some more text.
</p>
</div>
10. Overconstrained floats
In many cases, the specified values on these properties cannot be honored.
The number of columns is limited, and high values therefore cannot be honored:
.figure { float-reference: column; float: top; float-defer: 1000 }
A narrow screen may only have room for one column, in which case this request cannot be honored:
.figure { float-reference: column; float: top; float-defer: -5 }
In long documents, all content cannot fit on the last page, and this rule therefore cannot be honored:
p { float-reference: page; float: top; float-defer: last }
Floats are processed in the order they appear in the source. However, the visual order of floats may not be the same as the source order.
Consider this code:
.one { float-reference: page; float: top; float-defer: last } .two { float-reference: column; float: top; clear: column } <div class=one></div> <div class=two></div>
In this example, the first element requests to appear on the last page, while the second element requests to appear in the natural column. If the natural column of the second element appears on a page before the last page, the second element will appear visually before the first.
Consider this code:
.one { float-reference: page; float: top; float-defer: last } .two { float-reference: page; float: top; clear: page; } <div class=one></div> <div class=two></div>
If all content can fit on one page, the first page will also be the last page. The first element is processed first and is placed on top of the first page. Then the second element is processed. It requests a clear top, something which is not possible on the first page. Therefore, a second page is created and the first element is moved there. Even if the first element requests to be on the last page, it will not appear there.
When resolving over-constrained layouts, the order of importance for defined goals are:
This specification is made possible by input from Tab Atkins Jr., David Baron, Lars Erik Bolstad, Bert Bos, Mike Bremford, Michael Day, Werner Donné, Brady Duga, James Elmore, Elika Etemad, Michel Fortin, Daniel Glazman, Melinda Grant, Ian Hickson, Laurens Holst, Brad Kemper, Toru Kawakubo, Rune Lillesveen, Peter Linss, Cameron McCormack, Paul E. Merrell, Del Merritt, Markus Mielke, Kelly Miller, Alex Mogilevsky, Peter Moulder, Shinyu Murakami, Michel Onoff, Anton Prowse, Liam R E Quin, Jacob Grundtvig Refstrup, Florian Rivoal, Christian Roth, Allan Sandfeld Jensen, Simon Sapin, Morten Stenshorne, Philip Taylor, Ian Tindale, Ladd Van Tol, Tarquin (Mark) Wilton-Jones, Steve Zilles, Tantek Çelik and the CSS Working Group members.
Conformance requirements are expressed with a combination of descriptive assertions and RFC 2119 terminology. The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in the normative parts of this document are to be interpreted as described in RFC 2119. However, for readability, these words do not appear in all uppercase letters in this specification.
All of the text of this specification is normative except sections explicitly marked as non-normative, examples, and notes. [RFC2119]
Examples in this specification are introduced with the words "for example" or are set apart from the normative text with class="example"
, like this:
Informative notes begin with the word "Note" and are set apart from the normative text with class="note"
, like this:
Note, this is an informative note.
Advisements are normative sections styled to evoke special attention and are set apart from other normative text with <strong class="advisement">
, like this: UAs MUST provide an accessible alternative.
A style sheet is conformant to this specification if all of its statements that use syntax defined in this module are valid according to the generic CSS grammar and the individual grammars of each feature defined in this module.
A renderer is conformant to this specification if, in addition to interpreting the style sheet as defined by the appropriate specifications, it supports all the features defined by this specification by parsing them correctly and rendering the document accordingly. However, the inability of a UA to correctly render a document due to limitations of the device does not make the UA non-conformant. (For example, a UA is not required to render color on a monochrome monitor.)
An authoring tool is conformant to this specification if it writes style sheets that are syntactically correct according to the generic CSS grammar and the individual grammars of each feature in this module, and meet all other conformance requirements of style sheets as described in this module.
So that authors can exploit the forward-compatible parsing rules to assign fallback values, CSS renderers must treat as invalid (and ignore as appropriate) any at-rules, properties, property values, keywords, and other syntactic constructs for which they have no usable level of support. In particular, user agents must not selectively ignore unsupported component values and honor supported values in a single multi-value property declaration: if any value is considered invalid (as unsupported values must be), CSS requires that the entire declaration be ignored.
To avoid clashes with future CSS features, the CSS2.1 specification reserves a prefixed syntax for proprietary and experimental extensions to CSS.
Prior to a specification reaching the Candidate Recommendation stage in the W3C process, all implementations of a CSS feature are considered experimental. The CSS Working Group recommends that implementations use a vendor-prefixed syntax for such features, including those in W3C Working Drafts. This avoids incompatibilities with future changes in the draft.
Once a specification reaches the Candidate Recommendation stage, non-experimental implementations are possible, and implementors should release an unprefixed implementation of any CR-level feature they can demonstrate to be correctly implemented according to spec.
To establish and maintain the interoperability of CSS across implementations, the CSS Working Group requests that non-experimental CSS renderers submit an implementation report (and, if necessary, the testcases used for that implementation report) to the W3C before releasing an unprefixed implementation of any CSS features. Testcases submitted to W3C are subject to review and correction by the CSS Working Group.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4