The 'timeline-trigger' [=shorthand property=]
diff --git a/css-align-3/Overview.bs b/css-align-3/Overview.bs
index f2300b7efb4d..023b07495c7c 100644
--- a/css-align-3/Overview.bs
+++ b/css-align-3/Overview.bs
@@ -2145,7 +2145,8 @@ Determining the Baselines of a Box
tables
The first/last [=baseline set=] of a table box
- is the first/last [=baseline set=] of its first/last row.
+ is the first/last [=baseline set=] of its first/last row
+ (after any reordering of [=table row groups=]).
When finding the first/last baseline set of an inline-block,
any baselines contributed by table boxes must be skipped.
@@ -2153,16 +2154,43 @@ Determining the Baselines of a Box
table rows
- If any cells in the row participate in
- ''first baseline''/''last baseline'' alignment
- along the [=inline axis=],
- the first/last [=baseline set=] of the row
- is generated from their shared alignment baseline
- and the row's first available font,
- after alignment has been performed.
- Otherwise, the first/last [=baseline set=] of the row
- is synthesized from the lowest and highest content edges of the cells in the row.
- [[!CSS2]]
+ The first [=baseline set=] of a [=table row box=]
+ is taken from the first available of:
+
+ 1. If any cells in the row participate in
+ first [=baseline alignment=] along the table’s [=inline axis=],
+ [=generate=] a [=baseline set=] from their shared [=alignment baseline=]
+ and the row’s [=first available font=],
+ after alignment has been performed.
+
+ 2. Otherwise, if any cells in the row participate in
+ last [=baseline alignment=] along the table’s [=inline axis=],
+ [=generate=] from that [=alignment baseline=].
+
+
+
+ 4. Otherwise, if the row is not empty,
+ [=synthesize=] from the lowest and highest [=content edges=]
+ of all the cells in the row.
+ See [[css2#height-layout]].
+
+ 5. Otherwise,
+ use the [=block-start=] [=content edge=] of the [=table row box=] itself
+ as the [=alignment baseline=].
+
+ For this purpose,
+ any [=table cell=] that spans multiple rows
+ is ignored if it’s span does not start in this row;
+ except that for step 2,
+ it's ignored if its span does not end in this row.
+
+ Last baselines are analogous
+ (with “first”/“last” and “start”/“end” inverted).
Spanning cells participate only in the first/last row that they span
for the purpose of ''first baseline''/''last baseline''.
diff --git a/css-anchor-position-1/Overview.bs b/css-anchor-position-1/Overview.bs
index cee9b4434598..8a8911346c51 100644
--- a/css-anchor-position-1/Overview.bs
+++ b/css-anchor-position-1/Overview.bs
@@ -458,7 +458,7 @@ in anchor positioning.
if all of the following are true:
* |possible anchor| is either an [=element=]
- or a fully styleable [=tree-abiding pseudo-element=].
+ or a [=fully styleable pseudo-elements=].
* |possible anchor| is in scope for |positioned el|,
per the effects of 'anchor-scope' on |possible anchor|
@@ -573,6 +573,12 @@ is the box's default anchor box.
+If an element has a [=default anchor element=],
+then the [=scrollable containing block=] is used in place of the [=local containing block=]
+when the [=absolute-position containing block=] is generated by a [=scroll container=],
+so that the entire [=scrollable overflow area=] (typically) is available
+for positioning.
+
### Implicit Anchor Elements ### {#implicit}
Some specifications can define that,
@@ -687,10 +693,6 @@ what area of this [=position-area grid=] to lay out the positioned box in.
Values other than ''position-area/none'' have the following additional effects:
-* The [=scrollable containing block=] is used in place of the [=local containing block=]
- when the [=absolute-position containing block=] is generated by a [=scroll container=],
- so that the entire [=scrollable overflow area=] (typically) is available
- for positioning.
* The [=used value=] of any ''top/auto'' [=inset properties=]
and ''margin/auto'' [=margin properties=]
resolves to ''0''.
@@ -1366,10 +1368,7 @@ then it is centered (insofar as possible)
over the [=default anchor box=]
in the relevant axis.
Additionally:
-* The [=scrollable containing block=] is used in place of the [=local containing block=]
- where applicable,
- so that the entire [=scrollable overflow area=] (typically) is available
- for positioning.
+
* The [=used value=] of any ''top/auto'' [=inset properties=]
and ''margin/auto'' [=margin properties=]
resolves to ''0''.
@@ -1504,12 +1503,12 @@ or being positioned partially off screen.
To ameliorate this, an [=absolutely positioned=] box
can use the 'position-try-fallbacks' property
-to specify additional [=position options=]
+to specify additional position options
(variant sets of positioning/alignment properties
generated from the box's existing styles,
or specified in ''@position-try'' rules)
that the UA can try if the box overflows its initial position.
-Each is applied to the box,
+Each [=position option=] is applied to the box,
one by one in the order specified by 'position-try-order',
and the first that doesn't cause the box
to overflow its [=containing block=]
@@ -1563,17 +1562,18 @@ Applies to: [=absolutely positioned boxes=]
Animation type: discrete
-This property provides a list of alternate positioning styles
-to try when the [=absolutely positioned box=]
-overflows its [=inset-modified containing block=].
-This position options list
-initially contains a single [=position option=]
-generated from the element's fallback base styles,
-i.e. the [=computed values|computed styles=] without applying 'position-try-fallbacks'.
+This property provides a list of additional, alternative [=position options=]
+to try in order to prevent the [=absolutely positioned box=]
+from overflowing its [=inset-modified containing block=].
-Each comma-separated entry in the list is a separate option:
+Each comma-separated entry in the list is a separate [=position option=]:
either the name of a ''@position-try'' block,
-or a <> representing an automatic transformation of the box's existing computed style.
+or a <> representing an automatic transformation
+of the box's existing computed style (its fallback base styles).
+Together with the [=fallback base styles=],
+these options form the position options list
+from which the effective style is chosen,
+see [[#fallback-apply]].
Values have the following meanings:
@@ -1581,7 +1581,8 @@ Values have the following meanings:
: none
::
The property has no effect;
- the box's [=position options list=] is empty.
+ the box's [=position options list=]
+ consists only of the [=fallback base styles=].
: <>
::
@@ -1597,8 +1598,8 @@ Values have the following meanings:
::
Automatically creates a [=position option=]
by [=executing a try-tactic|executing the specified try tactic=]
- to the box's [=base styles=],
- then adding the constructed [=position option=]
+ on the box's [=base styles=],
+ then adding this constructed [=position option=]
to the box's [=position options list=].
@@ -1685,10 +1686,10 @@ Inherited: no
Animation Type: discrete
-This property allows an element to sort its [=position options=]
-by the available space they define,
-if it's more important for the box to have as much space as possible
-rather than strictly following the order declared in 'position-try-fallbacks'.
+This property allows an element to sort its [=position option list=]
+by the available space they produce.
+This allows the box to prioritize having more layout space
+over strictly following the order declared in 'position-try-fallbacks'.
<> = most-width | most-height | most-block-size | most-inline-size
@@ -1846,11 +1847,10 @@ The ''@position-try'' Rule {#fallback-rule}
-------------------------------
The @position-try rule
-defines a position option
-with a given name,
+defines a [=position option=] with a given name,
specifying one or more sets of positioning properties
that can be applied to a box
-via 'position-try-fallbacks',
+via 'position-try-fallbacks'.
The syntax of the ''@position-try'' rule is:
@@ -1863,10 +1863,10 @@ The syntax of the ''@position-try'' rule is:
The <> specified in the prelude
is the rule's name.
If multiple ''@position-try'' rules are declared with the same name,
-they [=cascade=] the same as ''@keyframe'' rules do.
+they [=cascade=] (overriding each other) the same as ''@keyframes'' rules do.
-The ''@position-try'' rule only accepts
-the following [=properties=]:
+The ''@position-try'' rule only accepts
+the following accepted @position-try properties:
* [=inset properties=]
* [=margin properties=]
@@ -2035,7 +2035,7 @@ and thus trigger special behavior. These fallback-sensitive changes i
have been added, removed, or mutated.
For this purpose, only changes to the computed base style are considered,
- i.e. the [=computed style=] ignoring any declarations originating
+ i.e. the [=computed value=] ignoring any declarations originating
from the Transitions or Animations [=cascade origins=].
@@ -2219,8 +2219,8 @@ Conditional Hiding: the 'position-visibility' property {#position-visibility}
Name: position-visibility
-Value: always | [ anchors-valid || anchors-visible || no-overflow ]
-Initial: anchors-visible
+Value: always | [ anchor-valid || anchor-visible || no-overflow ]
+Initial: anchor-visible
Applies to: [=absolutely positioned boxes=]
Percentages: n/a
Inherited: no
@@ -2239,23 +2239,14 @@ depending on some commonly needed layout conditions.
(The box is displayed without regard for its anchors
or its overflowing status.)
- : anchors-valid
+ : anchor-valid
::
- If any of the box's [=required anchor references=]
- do not resolve to a [=target anchor element=],
+ If the box references the [=default anchor box=]
+ (e.g. using 'position-area', 'anchor()' or 'anchor-size()' functions, or ''anchor-center''),
+ but the [=default anchor box=] cannot be resolved,
the box's 'visibility' property computes to ''force-hidden''.
- Issue: What is a required anchor reference?
- ''anchor()'' functions that don't have a fallback value;
- the default anchor *sometimes*?
- Need more detail here.
-
- Issue: Any anchors are missing,
- or all anchors are missing?
- I can see use-cases for either, potentially.
- Do we want to make a decision here, or make it controllable somehow?
-
- : anchors-visible
+ : anchor-visible
::
If the box has a [=default anchor box=]
but that [=anchor box=] is [=invisible=] or [=clipped by intervening boxes=],
@@ -2309,6 +2300,10 @@ depending on some commonly needed layout conditions.
rather than also floating in a nonsensical location.
+User agents may recognize anchors-valid and anchors-visible
+as [=legacy value aliases=] of ''anchor-valid'' and ''anchor-visible''
+(but are not required to).
+
+ 2. Let |alpha mult| be 1 - |leftover|,
interpreting |leftover| as a number between 0 and 1.
- 4. If |items| is length 1,
+ 3. If |items| is length 1,
set |color| to the color of that sole item,
converted to the specified interpolation <>.
@@ -314,7 +316,10 @@ Otherwise, use the specified colorspace for mixing.
Let |combined percentage| be the sum of |a| and |b|’s percentages.
2. Interpolate |a| and |b|’s colors
as described in [[css-color-4#interpolation]],
- with a progress percentage equal to (|b|’s percentage) / |combined percentage|).
+ with a progress percentage equal to
+ (|b|’s percentage) / |combined percentage|),
+ if |combined percentage| is greater than 0,
+ and 0.5 otherwise.
If the specified color space is a [=cylindrical polar color=] space,
then the <> controls the
interpolation of hue, as described in
@@ -325,8 +330,8 @@ Otherwise, use the specified colorspace for mixing.
and a percentage of |combined percentage|,
and [=stack/push=] it onto |item stack|.
3. Set |color| to the color of the sole remaining item in |item stack|.
- 5. Multiply the alpha component of |color| by |alpha mult|.
- 6. Return |color|.
+ 4. Multiply the alpha component of |color| by |alpha mult|.
+ 5. Return |color|.
Note: In [=cylindrical polar color=] spaces,
mixing is order-dependent,
@@ -2781,7 +2786,7 @@ or any other color or monochrome output device which has been characterized.
Reacting to the used color-scheme: the ''light-dark()'' Function
- System colors have the ability to react to the current used ''color-scheme'' value.
+ [=System colors=] have the ability to react to an element's [=color scheme=].
The ''light-dark()'' function exposes the same capability to authors.
There are two forms of this function: one takes a pair of colors
@@ -2800,23 +2805,18 @@ or any other color or monochrome output device which has been characterized.
For the color form, this function computes to the computed value of the first color,
- if the used color scheme is ''light'' or unknown,
+ if the element color scheme is ''light'',
or to the computed value of the second color,
- if the used color scheme is ''dark''.
+ if the element color scheme is ''dark''.
For the image form, this function returns the first image,
- if the used color scheme is ''light'' or unknown,
+ if the element color scheme is ''light'',
or the second image,
- if the used color scheme is ''dark''.
- The none keyword
- produces a fully transparent image
- with no natural size.
+ if the element color scheme is ''dark''.
- It is equivalent to a single-stop gradient whose stop color is ''transparent''':
-
-
- linear-gradient(transparent)
-
+ The none keyword
+ computes to ''image(transparent)''
+ (a fully transparent image with no natural size).
For example, to maintain a legible contrast on links,
@@ -2838,35 +2838,41 @@ or any other color or monochrome output device which has been characterized.
is used in dark mode.
(WCAG contrast 13.28:1, AAA pass).
-
-
Legible link text
-
Illegible link text
-
Legible link text
-
+
+
Legible link text
+
Illegible link text
+
Legible link text
+
-
- For example, to provide easily visible list bullets
- for light mode and dark mode:
+
+ For example, to provide easily visible list bullets
+ for light mode and dark mode:
-
@@ -3904,6 +3910,16 @@ This specification adds a way to ensure adequate contrast for text whose backgro
+
Removed special casing of 100% from the color-mix() algorithm,
+ thus avoiding a discontinuity near fully-transparent colors
+ (Issue 14014),
+ (Issue 13996)
+
+
+ Guarded against division by zero in the color-mix() algorithm
+ (Issue 14013),
+ (Issue 13996)
+
Added a backlink from Color Interpolation in this specification,
to the same section in CSS Color 4 where most of this is defined
(Issue 13788)
diff --git a/css-color-adjust-1/Overview.bs b/css-color-adjust-1/Overview.bs
index ab79a23479fd..6add2cb7d4d6 100644
--- a/css-color-adjust-1/Overview.bs
+++ b/css-color-adjust-1/Overview.bs
@@ -20,7 +20,6 @@ Editor: Tab Atkins Jr., Google, http://www.xanthir.com/contact/, w3cid 42199
Abstract: This module introduces a model and controls over automatic color adjustment by the user agent to handle user preferences, such as "Dark Mode", contrast adjustment, or specific desired color schemes.
Ignored Terms: -webkit-tap-highlight-color, name, the head element
WPT Path Prefix: css/css-color-adjust/
-WPT Display: open
spec:css2; type:dfn; text:canvas
@@ -124,30 +123,131 @@ Preferred Color Schemes {#preferred}
consists of the opposite,
with dark background colors and light foreground/text colors.
- Advisement: The [=light=] and [=dark color schemes=]
- don't represent an exact color palette (such as black-and-white),
+ Note: [=Light=] and [=dark=] [=color schemes=]
+ are not specific color palettes,
but a range of possible palettes.
- To guarantee specific colors, authors must specify those colors themselves.
+ For example,
+ a stark black-on-white scheme and a sepia dark-on-tan scheme
+ would both be considered [=light color schemes=].
+ To guarantee specific colors, authors must specify those colors themselves.
Note also that, consequently,
pairing default or <> colors with author-specified colors
cannot guarantee any particular contrast level;
- it might be necessary to set both foreground and background colors together
- to ensure legibility [[WCAG22]].
-
- To enable pages to adapt to the user's [=preferred color scheme=],
- user agents will match the '@media/prefers-color-scheme' media query
- to the user's [=preferred color scheme=].
- [[!MEDIAQUERIES-5]]
- Complementing this, the 'color-scheme' property defined here
- lets the author indicate appropriate [=color schemes=]
- for UA-provided UI and colors in the page.
+ to ensure legibility,
+ generally either both foreground and background should be paired [=system colors=]
+ or both be manually specified colors.
+ [[WCAG22]]
+
+ The user's [=preferred color scheme=]
+ is then combined with the [=page's supported color schemes=]
+ to produce a page color scheme.
+ The [=page color scheme=] also records whether it's default or not.
+ The [=page color scheme=] is queryable with the '@media/prefers-color-scheme' [=media query=]. [[!MEDIAQUERIES-5]]
+
+ Individual elements have an element color scheme,
+ which by default matches the [=page color scheme=],
+ but can be overriden using the 'color-scheme' property.
+ The [=element color scheme=] affects things such as the value of [=system colors=] on the element,
+ the value of the ''light-dark()'' function,
+ and how user interface elements (like scrollbars) render.
+ (See [[#color-scheme-effect]].)
User agents may support additional [=color schemes=],
however CSS does not support negotiation of additional [=color schemes=]:
user agents should pursue standardization of these schemes,
so that '@media/prefers-color-scheme' and 'color-scheme' can reflect the additional values.
-Opting Into a Preferred Color Scheme: the 'color-scheme' property {#color-scheme-prop}
+ Note: Because many pages were authored before [=color scheme=] support existed,
+ and thus pages were authored with the assumption of the default ([=light=]) color scheme,
+ user agents cannot automatically adapt the colors used in elements under their control,
+ as it might cause unreadable color contrast with the surrounding page.
+ Pages have to opt into [=color scheme=] support
+ by setting the [=page color scheme=],
+ or manually setting the 'color-scheme' property on individual elements.
+
+Opting Into a Preferred Color Scheme {#color-scheme-page}
+------------------------------------
+
+ The [=page color scheme=]
+ represents the [=color scheme=] that will be used for the page overall
+ (queryable with the ''prefers-color-scheme'' [=media feature=])
+ and for all elements that don't specifically override the [=page color scheme=] with the 'color-scheme' property.
+ See [[#color-scheme-effect]] for a full description of what the [=color scheme=] effects.
+
+ Note: In HTML, the <{meta/name/color-scheme|color-scheme <meta>}>
+ sets the [=page color scheme=].
+
+ Authors should generally set the [=page color scheme=],
+ rather than using the 'color-scheme' property,
+ so that the '@media/prefers-color-scheme' [=media feature=]
+ is consistent with the elements on the page.
+
+ The [=page color scheme=] is determined by finding the [=used color scheme=],
+ given the [=preferred color scheme=]
+ and the page's supported color schemes
+ (a [=color scheme support=]).
+
+ In embedded documents
+ (such as an <{iframe}> or an SVG <{img}>),
+ the embedding element's [=element color scheme=]
+ is used as the embedded document's [=preferred color scheme=]
+ (treated as a normal [=color scheme preference=]),
+ rather than the user's preference.
+ This allows embedded documents to match the negotiated color scheme
+ for the page or an element,
+ similar to other elements in the parent document.
+
+
+
+ A page that responds to user preferences for light or dark display
+ by using the ''@media/prefers-color-scheme'' media feature
+ to alter the colors it uses
+ can easily opt the browser-controlled UI
+ (scrollbars, inputs, etc)
+ to match
+ with a simple global declaration:
+
+
+
+
+
+ (Or, in languages that don't have a way to set the [=page color scheme=] directly,
+ a '':root { color-scheme: light dark;}'' rule.)
+
+ If a page limits itself to using only the <>s,
+ the 'color-scheme' declaration
+ will support the user's preferred color scheme
+ even without the author needing to use ''@media'' at all.
+
+
+
+ If a page cannot reasonably accommodate all color schemes,
+ such as for branding or theatrical reasons,
+ <{meta/name/color-scheme}> or 'color-scheme'
+ can still indicate which color schemes the page can support,
+ causing the UI to match.
+
+ If the page's color scheme is primarily light,
+ the following will indicate that explicitly:
+
+
+
+
+
+ While if the page is primarily dark,
+ indicating that explicitly will make the page look more coherent as well:
+
+
+
+
+
+ However, it is better to support both color schemes,
+ of course.
+
+
+
+
+Overriding the Page Color Scheme: the 'color-scheme' property {#color-scheme-prop}
-----------------------------------------------------------------
@@ -156,7 +256,7 @@ Opting Into a Preferred Color Scheme: the 'color-scheme' property {#color-scheme
Initial: normal
Applies to: all elements and text
Inherited: yes
- Computed Value: the keyword ''normal'', or an ordered list of specified color scheme keywords
+ Computed Value: the keyword ''normal'', or a [=color scheme support=]
Animation type: discrete
@@ -184,48 +284,34 @@ Opting Into a Preferred Color Scheme: the 'color-scheme' property {#color-scheme
rendering/dark-color-scheme/color-scheme-visited-link-initial.html
- While the prefers-color-scheme media feature
- allows an author to adapt the page’s colors to the user’s preferred color scheme,
- many parts of the page are not under the author's control
- (such as form controls, scrollbars, etc).
- The 'color-scheme' property allows an element to indicate
- which [=color schemes=] it is designed to be rendered with.
- These values are negotiated with the user's preferences,
- resulting in a used color scheme
- that affects things such as
- the default colors of form controls and scrollbars.
- (See [[#color-scheme-effect]].)
-
- Note: Because many pages were authored before color scheme support existed,
- user agents cannot automatically adapt the colors used in elements under their control,
- as it might cause unreadable color contrast with the surrounding page.
-
- Host languages can define the page's supported color schemes,
- a list of [=color schemes=] supported by default for all elements on that page.
-
- Note: [[HTML]] specifies a
- color-scheme
- <{meta}> tag which can be used to set the [=page's supported color schemes=].
-
+ While the [=page color scheme=] should generally be used
+ to control what [=color scheme=] a page uses,
+ occasionally there is need to override that [=color scheme=]
+ on a particular subtree.
+ The 'color-scheme' property allows this,
+ manually setting the [=element color scheme=]
+ for an element and its descendants.
Values are defined as follows:
: normal
::
- Indicates that the element supports the [=page's supported color schemes=],
- if they are set, or that it supports no [=color schemes=] at all otherwise.
+ The [=element color scheme=] is the same as the [=page color scheme=].
+ (This includes noting whether the [=color scheme=] was [=color scheme/defaulted=].)
: light
- ::
- Indicates that the element supports a [=light color scheme=].
-
: dark
::
- Indicates that the element supports a [=dark color scheme=].
+ Indicates that the element supports a [=light=] and/or [=dark=] color scheme,
+ as appropriate.
+ The element's [=color scheme support=] will include the keywords,
+ in the order they're specified.
: only
::
Forbids the user agent from [=overriding the color scheme=] for the element.
+ The element's [=color scheme support=] will have a flag
+ indicating sole support.
: <>
::
@@ -245,95 +331,11 @@ Opting Into a Preferred Color Scheme: the 'color-scheme' property {#color-scheme
are not valid <>s in this property.
- Note: [=Light=] and [=dark=] [=color schemes=]
- are not specific color palettes.
- For example,
- a stark black-on-white scheme and a sepia dark-on-tan scheme
- would both be considered [=light color schemes=].
- To ensure particular foreground or background colors,
- they need to be specified explicitly.
-
-
- To determine the used color scheme of an element:
-
- 1. If the user's [=preferred color scheme=],
- as indicated by the prefers-color-scheme media feature,
- is present among the listed [=color schemes=],
- and is supported by the user agent,
- that's the element's [=used color scheme=].
-
- 2. Otherwise,
- if the user has indicated an overriding preference for their chosen color scheme,
- and the ''only'' keyword is not present in 'color-scheme' for the element,
- the user agent must [=override the color scheme=]
- with the user's [=preferred color scheme=].
- See [[#color-scheme-override]].
-
- 3. Otherwise,
- if the user agent supports at least one of the listed [=color schemes=],
- the [=used color scheme=] is
- the first supported [=color scheme=] in the list.
-
- 4. Otherwise,
- the [=used color scheme=] is the browser default.
- (Same as ''color-scheme/normal''.)
-
-
- Note: User agents are not required
- to support any particular [=color scheme=],
- so only using a single keyword,
- such as ''color-scheme: dark'',
- to indicate a required [=color scheme=]
- is still not guaranteed to have any effect on the rendering of the element.
-
-
- A page that responds to user preferences for light or dark display
- by using the prefers-color-scheme media feature
- to alter the colors it uses
- can easily opt the browser-controlled UI
- (scrollbars, inputs, etc)
- to match
- with a simple global declaration:
-
-
- :root {
- color-scheme: light dark;
- }
-
-
- If a page limits itself to using only the <>s,
- the 'color-scheme' declaration, above,
- will support the user's preferred color scheme
- even without the author needing to use ''@media'' at all.
-
-
-
- If a page cannot reasonably accommodate all color schemes,
- such as for branding or theatrical reasons,
- 'color-scheme' can still indicate which color schemes the page can support,
- causing the UI to match.
-
- If the page's color scheme is primarily light,
- the following will indicate that explicitly:
-
-
- :root {
- color-scheme: light;
- }
-
-
- While if the page is primarily dark,
- indicating that explicitly will make the page look more coherent as well:
-
-
- :root {
- color-scheme: dark;
- }
-
-
- However, it is better to support both color schemes,
- of course.
-
+ If an element has any value other than ''color-scheme: normal'',
+ its [=element color scheme=] is determined by finding the [=used color scheme=],
+ given the user's [=preferred color scheme=]
+ and the element's [=color scheme support=]
+ specified by this property.
A page might be generally capable of handling multiple color schemes,
@@ -344,22 +346,21 @@ Opting Into a Preferred Color Scheme: the 'color-scheme' property {#color-scheme
showing off the light or dark theme specifically.
This can be indicated as:
-
- :root {
- color-scheme: light dark;
- }
-
- .light-theme-example {
- color-scheme: light;
- }
+
+
+
+
Only the subsections rooted at ''.light-theme-example'' or ''.dark-theme-example''
- will be opted into the ''light'' or ''dark'' themes specifically;
+ will be opted into the [=light=] or [=dark=] themes specifically;
the rest of the page will respect the user's preference.
@@ -368,33 +369,125 @@ Opting Into a Preferred Color Scheme: the 'color-scheme' property {#color-scheme
beyond what the first instance of the keyword provides.
+Resolving Color Schemes {#color-scheme-resolution}
+-----------------------
+
+ While it's important for a page to respect the user's preferred [=color scheme=],
+ it's also important to only use a [=color scheme=] the page author expects,
+ or else it is very easy to render a page unreadable
+ by causing the foreground and background elements to accidentally have minimal (or zero!) contrast.
+
+ For example, an author expecting the default light color scheme
+ might set the page background to a light cream
+ while leaving the text color unset,
+ expecting it to use the default black text color.
+ If the page unexpectedly opted into a user's preferred [=dark color scheme=],
+ however,
+ and adjusted the default text color to white,
+ that would make the text virtually unreadable.
+
+ To balance these competing concerns,
+ a user's [=color scheme preference=]
+ is compared against a page's [=color scheme support=]
+ to produce a used [=color scheme=].
+
+ A color scheme preference
+ is either no preference,
+ a [=color scheme=] preference ([=light=] or [=dark=]),
+ or an overriding [=color scheme=] preference.
+
+ A color scheme support
+ is null,
+ or an ordered list of one or more supported [=color schemes=],
+ along with a flag indicating whether or not it solely supports the indicated [=color schemes=].
+
+
+ To determine the used color scheme,
+ given a [=color scheme support=] |support|
+ and a [=color scheme preference=] |preference|:
+
+ 1. If |support| is null,
+ or none of the [=color schemes=] in |support|
+ are supported by the UA,
+ return the UA default [=color scheme=],
+ and annotate that this [=color scheme=] was [=color scheme/defaulted=].
+
+ 1. If |preference| is no preference,
+ return the first supported [=color scheme=] in |support|.
+
+ 1. If |preference|'s [=color scheme=] is in |support|
+ and supported by the UA,
+ return that [=color scheme=].
+
+ 1. If |support| is flagged as sole support,
+ return the first supported [=color scheme=] in |support|.
+
+ 1. If |preference| is an [=overriding preference=],
+ return |preference|'s [=color scheme=].
+ If this [=color scheme=] is used as an [=element color scheme=],
+ also [=override the color scheme=] on the element
+ to this [=color scheme=].
+
+ 1. Otherwise,
+ return the first supported [=color scheme=] in |support|.
+
+ Note: The basic logic here is that,
+ if the page hasn't opted into color schemes at all (null |supports|),
+ we go with the safe UA default that it was probably implicitly designed for.
+ If there is a usable |supports|,
+ and it matches |preference|,
+ we use the preference.
+ Otherwise |preference| and |supports| disagree,
+ and we go back and forth down the preference hierarchy to see who wins:
+ sole support in |support| wins,
+ then overriding preference in |preference| wins
+ (and we adjust the element's colors to make sure this actually works),
+ then |support| finally wins.
+
+
+ Note: User agents are not required
+ to support any particular [=color scheme=],
+ so only using a single keyword,
+ such as ''color-scheme: dark'',
+ to indicate a required [=color scheme=]
+ is still not guaranteed to have any effect on the rendering of the element.
+
+ Note: User agents might not actually support preference levels in a [=color scheme preferences=].
+ At the time of writing,
+ UAs generally only support an ordinary [=light=] or [=dark=] preference,
+ which considerably simplifies the above logic.
+
+
Effects of the Used Color Scheme {#color-scheme-effect}
--------------------------------
For all elements,
- the user agent must match the following to the [=used color scheme=]:
+ the user agent must match the following to the [=element color scheme=]:
* the default colors of scrollbars and other interaction UI
* the default colors of form controls and other "specially-rendered" elements
* the default colors of other browser-provided UI, such as "spellcheck" underlines
+ * the value of [=system colors=]
+ * the value of the ''light-dark()'' function
On the root element,
- the [=used color scheme=] additionally must affect
+ the [=element color scheme=] additionally must affect
the surface color of the [=canvas=],
and the viewport's scrollbars.
In order to preserve expected color contrasts,
in the case of embedded documents typically rendered over a transparent [=canvas=]
(such as provided via an HTML <{iframe}> element),
- if the [=used color scheme=] of the element
- and the [=used color scheme=] of the embedded document’s root element
+ if the [=element color scheme=] of the element
+ and the [=element color scheme=] of the embedded document’s root element
do not match,
then the UA must use an opaque [=canvas=] of the ''Canvas'' color
- appropriate to the embedded document’s [=used color scheme=]
+ appropriate to the embedded document’s root element's [=element color scheme=]
instead of a transparent canvas.
This rule does not apply to documents embedded
via elements intended for graphics
- (such as <{img}> elements embedding an SVG document).
+ (such as <{img}> elements embedding an SVG document);
+ their canvases remain the default transparent regardless.
Note: Aside from the small list of adjustments given above,
user agents generally do not further adjust a page
@@ -408,12 +501,11 @@ Effects of the Used Color Scheme {#color-scheme-effect}
Overriding the Color Scheme {#color-scheme-override}
---------------------------
-If the user has indicated an overriding preference for a particular color scheme,
+If the user has indicated an [=color scheme/overriding preference=] for a particular color scheme that the author does not explicitly support,
and the author has not disallowed this (by using the ''only'' keyword),
-the user agent may override the color scheme,
-forcing the [=used color scheme=] to the user's [=preferred color scheme=].
-If the element does not support that [=color scheme=],
-the user agent must also auto-adjust other colors into this chosen [=color scheme=],
+the user agent must override the color scheme:
+in addition to the effects described in [[#color-scheme-effect]],
+it must also auto-adjust other colors into this chosen [=color scheme=],
such as by inverting their brightness,
while preserving any color contrast necessary for readability of the page.
In this case, UA may also auto-adjust colors within replaced elements, background images, and other external resources as appropriate.
@@ -1193,6 +1285,15 @@ Privacy Considerations {#privacy}
for discussion on this topic.
+ Embedded documents (even cross-origin ones)
+ recieve their embedding element's [=element color scheme=]
+ as their [=preferred color scheme=],
+ which is technically a bit of cross-site communication.
+ This was not considered a significant problem by browser security reviewers,
+ and the user benefit of having pages and, particularly, SVG images
+ automatically adapt to the parent page's color scheme
+ was considered valuable enought to warrant it.
+
Security Considerations {#security}
===================================
diff --git a/css-conditional-5/Overview.bs b/css-conditional-5/Overview.bs
index edcca5615ac8..f48574071950 100644
--- a/css-conditional-5/Overview.bs
+++ b/css-conditional-5/Overview.bs
@@ -212,11 +212,26 @@ At-rules
Named features
A CSS processor is considered to
- support an named feature
+ support a named feature
if it supports the named feature based on the feature definition
described in the following list:
- [ No features are currently defined. ]
+
+ : anchor-position-follows-transforms
+ :: Anchoring to a transformed element automatically takes into account the anchor's transforms,
+ causing the positioned element to shift to match it.
+ [[CSS-ANCHOR-POSITIONING]]
+
+ (An earlier version of the specification did not take transforms into account.)
+
+ : single-axis-scroll-container
+ :: The ability to have [=single-axis scroll containers=],
+ where one axis is scrollable and the other is ''overflow/clip''.
+ [[CSS-OVERFLOW-4]]
+
+ (Previously, specifying ''overflow/clip'' alongside a scrollable value caused it to compute to ''overflow/hidden'',
+ which is still a scrollable value even if it doesn't generate a scrollbar.)
+
If the feature is not listed the processor does not support the named feature.
@@ -467,7 +482,7 @@ Container Queries
There are cases where the box for a [=pseudo-element=] is generated as a
sibling box of its originating element's box. If we allowed querying the size
of a sibling box, it would introduce layout cycles.
-
+
For example, the ''::scroll-marker-group'' and ''::scroll-button()'' pseudo-elements
generate sibling boxes of their originating element's box.
These pseudo-elements will not be able to query their originating scroller
@@ -1027,7 +1042,7 @@ Container Queries: the ''@container'' rule
is a [=conditional group rule=] whose condition contains
a container query,
which is a boolean combination of [=container size queries=] and/or [=container style queries=].
- Style declarations within the <> block of an ''@container'' rule
+ Style declarations within the ''@container'' rule
are [[css-cascade-4#filtering|filtered]] by its condition
to only match when the [=container query=]
is true for their element’s [=query container=].
@@ -1036,7 +1051,7 @@ Container Queries: the ''@container'' rule
@@ -1374,7 +1376,7 @@ Display Order: the 'order' property
<article class="sale-item">
- <h1>Computer Starter Kit</h1>
+ <h3>Computer Starter Kit</h3>
<p>This is the best computer money can buy, if you don’t have much money.
<ul>
<li>Computer
@@ -1391,7 +1393,7 @@ Display Order: the 'order' property
-
Computer Starter Kit
+
Computer Starter Kit
This is the best computer money can buy,
if you don't have much money.
@@ -2055,8 +2057,8 @@ Appendix A: Glossary
* (very loosely) any block-level box that establishes a new [=formatting context=]
(other than an inline formatting context)
-
out-of-flow
-
in-flow
+
out-of-flow
+
in-flow
A box is out-of-flow if it is
extracted from its expected position and interaction with surrounding content
diff --git a/css-display-4/Overview.bs b/css-display-4/Overview.bs
index f4b3f780698d..22b6f3e30743 100644
--- a/css-display-4/Overview.bs
+++ b/css-display-4/Overview.bs
@@ -2600,8 +2600,8 @@ Appendix A: Glossary
* (very loosely) any block-level box that establishes a new [=formatting context=]
(other than an inline formatting context)
-
out-of-flow
-
in-flow
+
out-of-flow
+
in-flow
A box is out-of-flow if it is
extracted from its expected position and interaction with surrounding content
diff --git a/css-easing-2/images/linear-easing-curve.svg b/css-easing-2/images/linear-easing-curve.svg
index 909eb6720f73..3b05d35594b4 100644
--- a/css-easing-2/images/linear-easing-curve.svg
+++ b/css-easing-2/images/linear-easing-curve.svg
@@ -103,7 +103,7 @@
0
-
+ P1
diff --git a/css-env-1/Overview.bs b/css-env-1/Overview.bs
index b0b9e172538f..f5f0429a216e 100644
--- a/css-env-1/Overview.bs
+++ b/css-env-1/Overview.bs
@@ -78,9 +78,13 @@ A CSS environment variable is a name associated with a
(a sequence of zero more CSS tokens, with almost no restrictions on what tokens can exist),
similar to a [=custom property=].
[=Environment variables=] can be defined by the user agent,
-or by the user.
-(In the latter case, the names are <>s,
-and start with `--` per standard for custom identifiers.)
+or by the author.
+
+If author-defined,
+they are a custom environment variable.
+The name of a [=custom environment variable=]
+must conform to the <> grammar.
+This specification does not yet define how authors can define [=custom environment variables=].
Issue: Is the set of UA-defined [=environment variables=] visible to script?
If so, define an API on {{Document}} to expose them.
diff --git a/css-flexbox-1/Overview.bs b/css-flexbox-1/Overview.bs
index 526fb26b9511..610af7882949 100644
--- a/css-flexbox-1/Overview.bs
+++ b/css-flexbox-1/Overview.bs
@@ -413,6 +413,7 @@ Module interactions
flexbox_first-letter.html
flexbox_first-line.html
+ getcomputedstyle/first-line-computed-style.html
flexbox-ignores-first-letter.html
@@ -763,6 +764,7 @@ Flex Containers: the ''flex'' and ''inline-flex'' 'display' values
min-size-auto-overflow-clip.html
negative-overflow-002.html
negative-overflow-003.html
+ negative-overflow-004-no-padding.html
negative-overflow.html
overflow-area-001.html
overflow-area-002.html
@@ -777,6 +779,8 @@ Flex Containers: the ''flex'' and ''inline-flex'' 'display' values
overflow-auto-008.html
overflow-top-left.html
padding-overflow.html
+ select-as-flex-item-child-with-overflow.html
+ select-as-flex-item-with-overflow.html
text-overflow-on-flexbox-001.html
synthesize-vrl-baseline.html
@@ -857,6 +861,8 @@ Flex Items
anonymous-flex-item-004.html
anonymous-flex-item-005.html
anonymous-flex-item-006.html
+ anonymous-flex-item-document-white-space-crash.html
+ anonymous-flex-item-restyle.html
canvas-dynamic-change-001.html
column-flex-child-with-max-width.html
flexbox-whitespace-handling-001a.xhtml
@@ -1463,6 +1469,7 @@ Grid doesn't have similarly meaningful shrinkability, so it doesn't need to care
flex-minimum-width-flex-items-014.html
flex-minimum-width-flex-items-015.html
flex-minimum-width-flex-items-016.html
+ checkbox-percentage-width-in-flex.html
getcomputedstyle/flexbox_computedstyle_min-auto-size.html
getcomputedstyle/flexbox_computedstyle_min-height-auto.html
getcomputedstyle/flexbox_computedstyle_min-width-auto.html
@@ -2127,6 +2134,7 @@ Flex Lines
align-content-005.htm
align-content-006.htm
align-content-007.htm
+ flex-wrap-column-grow.html
flexbox-lines-must-be-stretched-by-default.html
@@ -2264,6 +2272,7 @@ The 'flex' Shorthand
parsing/flex-grow-valid.html
table-item-flex-percentage-min-width.html
table-item-flex-percentage-width.html
+ flex-rounding.html
@@ -2650,6 +2659,7 @@ The 'flex-basis' property
flex-basis-011.html
flex-basis-012.html
flex-basis-013.html
+ flex-basis-content-percentage-height.html
flex-basis-intrinsics-001.html
flex-basis-item-margins-001.html
flexbox-flex-basis-content-001a.html
@@ -2758,6 +2768,7 @@ Aligning with auto margins
flexbox-margin-auto-horiz-002.xhtml
flexbox_margin-auto.html
flexbox_margin-auto-overflow.html
+ main-axis-margin-rounding.html
Note: If free space is distributed to auto margins,
@@ -2926,6 +2937,7 @@ Axis Alignment: the 'justify-content' property
scrollbars-auto.html
scrollbars.html
scrollbars-no-margin.html
+ justify-content-rounding.html
The 'justify-content' property aligns flex items along the main axis of the current line of the flex container.
@@ -3385,6 +3397,7 @@ Packing Flex Lines: the 'align-content' property
align-content-horiz-001a.html
align-content-horiz-001b.html
align-content-horiz-002.html
+ align-content-stretch-rounding.html
align-content_space-around.html
align-content_space-between.html
align-content_stretch.html
@@ -3414,6 +3427,7 @@ Packing Flex Lines: the 'align-content' property
getcomputedstyle/flexbox_computedstyle_align-content-flex-start.html
getcomputedstyle/flexbox_computedstyle_align-content-space-around.html
getcomputedstyle/flexbox_computedstyle_align-content-space-between.html
+ align-content-rounding.html
+
+
+Flex Containers: the ''flex'' and ''inline-flex'' 'display' values
+
+
+
+ Name: display
+ New values: flex | inline-flex
+
+ This value causes an element to generate a flex container box
+ that is inline-level when placed in flow layout.
+
+
+ flexbox_inline.html
+ flex-inline.html
+ flexbox_inline-float.html
+ inline-flexbox-absurd-block-size-crash.html
+ inline-flexbox-wrap-vertically-width-calculation.html
+ inline-flex-editing-crash.html
+ inline-flex-editing-with-updating-text-crash.html
+ inline-flex-frameset-main-axis-crash.html
+ inline-flex.html
+ inline-flex-min-content-height.html
+ getcomputedstyle/flexbox_computedstyle_display-inline.html
+ intrinsic-width-orthogonal-writing-mode.html
+
+
+
+ A flex container establishes a new flex formatting context for its contents.
+ This is the same as establishing a block formatting context,
+ except that flex layout is used instead of block layout.
+ For example, floats do not intrude into the flex container,
+ and the flex container's margins do not collapse with the margins of its contents.
+ Flex containers form a containing block for their contents
+ exactly like block containers do. [[!CSS2]]
+ The 'overflow' property applies to flex containers.
+
+
+ flexbox-overflow-horiz-001.html
+ flexbox-overflow-horiz-002.html
+ flexbox-overflow-horiz-003.html
+ flexbox-overflow-horiz-004.html
+ flexbox-overflow-horiz-005.html
+ flexbox-overflow-padding-001.html
+ flexbox-overflow-padding-002.html
+ flexbox-overflow-vert-001.html
+ flexbox-overflow-vert-002.html
+ flexbox-overflow-vert-003.html
+ flexbox-overflow-vert-004.html
+ flexbox-overflow-vert-005.html
+ flexbox_rowspan-overflow-automatic.html
+ flexbox_rowspan-overflow.html
+ flexbox-safe-overflow-position-001.html
+ flexbox-safe-overflow-position-002.html
+ flexbox-safe-overflow-position-003.html
+ flexbox-safe-overflow-position-004.html
+ flexbox-safe-overflow-position-005.html
+ flexbox-safe-overflow-position-006.html
+ flexbox_width-overflow.html
+ min-size-auto-overflow-clip.html
+ negative-overflow-002.html
+ negative-overflow-003.html
+ negative-overflow-004-no-padding.html
+ negative-overflow.html
+ overflow-area-001.html
+ overflow-area-002.html
+ overflow-area-003.html
+ overflow-auto-001.html
+ overflow-auto-002.html
+ overflow-auto-003.html
+ overflow-auto-004.html
+ overflow-auto-005.html
+ overflow-auto-006.html
+ overflow-auto-007.html
+ overflow-auto-008.html
+ overflow-top-left.html
+ padding-overflow.html
+ text-overflow-on-flexbox-001.html
+ synthesize-vrl-baseline.html
+
+
+ Flex containers are not block containers,
+ and so some properties that were designed with the assumption of block layout don't apply in the context of flex layout.
+ In particular:
+
+ * 'float' and 'clear' do not create floating or clearance of flex item,
+ and do not take it out-of-flow.
+ * 'vertical-align' has no effect on a flex item.
+ * the ''::first-line'' and ''::first-letter'' pseudo-elements do not apply to flex containers,
+ and flex containers do not contribute a first formatted line or first letter
+ to their ancestors.
+
+
+
+
+ align-content-wrap-004.html
+ align-items-baseline-column-vert-lr-table-item.html
+ align-items-baseline-vert-lr-column-horz-table-item.html
+ align-items-baseline-vert-rl-column-horz-table-item.html
+ flexbox_box-clear.html
+ flexbox_first-letter.html
+ flexbox_first-line.html
+ flexbox-ignores-first-letter.html
+ flexbox_item-vertical-align.html
+ flexbox-with-pseudo-elements-001.html
+ flexbox-with-pseudo-elements-002.html
+ flexbox-with-pseudo-elements-003.html
+ flexible-box-float.html
+ flex-item-vertical-align.html
+ flex-vertical-align-effect.html
+ hittest-before-pseudo.html
+
+
+ If an element's specified 'display' is ''inline-flex'',
+ then its 'display' property computes to ''flex''
+ in certain circumstances:
+ the table in CSS 2.1 Section 9.7
+ is amended to contain an additional row,
+ with ''inline-flex'' in the "Specified Value" column
+ and ''flex'' in the "Computed Value" column.
+
+
+
+
+Flex Items
+
+ Loosely speaking, the flex items of a flex container
+ are boxes representing its in-flow contents.
+
+ Each in-flow child of a flex container
+ becomes a flex item,
+ and each child text sequence
+ is wrapped in an anonymousblock containerflex item.
+ However, if the entire text sequences contains only
+ [=document white space characters=]
+ (i.e. characters that can be affected by the 'white-space' property)
+ it is instead not rendered (just as if its text nodes were ''display:none'').
+
+
+ anonymous-block.html
+ anonymous-flex-item-001.html
+ anonymous-flex-item-002.html
+ anonymous-flex-item-003.html
+ anonymous-flex-item-004.html
+ anonymous-flex-item-005.html
+ anonymous-flex-item-006.html
+ anonymous-flex-item-document-white-space-crash.html
+ anonymous-flex-item-restyle.html
+ canvas-dynamic-change-001.html
+ column-flex-child-with-max-width.html
+ flexbox-whitespace-handling-001a.xhtml
+ flexbox-whitespace-handling-001b.xhtml
+ flexbox-whitespace-handling-002.xhtml
+ hittest-anonymous-box.html
+ percentage-descendant-of-anonymous-flex-item.html
+ percentage-size-subitems-001.html
+ whitespace-in-flexitem-001.html
+
+
+
+
+
+ Flex items determined from above code block
+
+
+
+
+
+ Note that the inter-element white space disappears:
+ it does not become its own flex item,
+ even though the inter-element text does get wrapped in an anonymous flex item.
+
+ Note also that the anonymous item's box is unstyleable,
+ since there is no element to assign style rules to.
+ Its contents will however inherit styles (such as font settings) from the flex container.
+
+
+ A flex item [=establishes an independent formatting context=] for its contents.
+ However, flex items themselves are flex-level boxes, not block-level boxes:
+ they participate in their container's flex formatting context,
+ not in a block formatting context.
+
+
+
+ Note: Authors reading this spec may want to
+ skip past the following box-generation and static position details.
+
+ If the [=computed value|computed=] 'display' value of an element's nearest ancestor element
+ (skipping ''display:contents'' ancestors)
+ is ''flex'' or ''inline-flex'',
+ the element's own 'display' value is [=blockified=].
+ (See CSS2.1§9.7 [[!CSS2]]
+ and [[css-display-3#transformations]]
+ for details on this type of 'display' value conversion.)
+
+ Note: Blockification still occurs even when the ''flex'' or ''inline-flex'' element does not end up generating a [=flex container=] box,
+ e.g. when it is [=replaced element|replaced=]
+ or in a ''display: none'' subtree.
+
+ Note: Some values of 'display' normally trigger the creation of anonymous boxes around the original box.
+ If such a box is a flex item,
+ it is blockified first,
+ and so anonymous box creation will not happen.
+ For example, two contiguous flex items with ''display: table-cell''
+ will become two separate ''display: block'' flex items,
+ instead of being wrapped into a single anonymous table.
+
+ In the case of flex items with ''display: table'',
+ the table wrapper box becomes the flex item,
+ so the 'align-self' property applies to it.
+ The contents of any caption boxes contribute to the calculation of
+ the table wrapper box's min-content and max-content sizes.
+ However, like 'width' and 'height', the 'flex' longhands apply to the table box as follows:
+ the flex item’s final size is calculated
+ by performing layout as if the distance between
+ the table wrapper box's edges and the table box's content edges
+ were all part of the table box's border+padding area,
+ and the table box were the flex item.
+
+
+ flexbox-table-fixup-001.xhtml
+ table-as-item-large-intrinsic-size.html
+ table-with-float-paint.html
+
+
+
+
+
+Absolutely-Positioned Flex Children
+
+ As it is out-of-flow,
+ an absolutely-positioned child of a flex container does not participate in flex layout.
+
+ The [=cross-axis=] edges of the [=static-position rectangle=]
+ of an absolutely-positioned child of a flex container
+ are the [=content edges=] of the [=flex container=].
+ The [=main-axis=] edges of the [=static-position rectangle=]
+ are where the [=margin edges=] of the child would be positioned
+ if it were the sole flex item in the flex container,
+ assuming both the child and the flex container
+ were fixed-size boxes of their used size.
+ (For this purpose,
+ the child's ''margin/auto'' margins are treated as zero.)
+
+
+ abspos/abspos-autopos-htb-ltr.html
+ abspos/abspos-autopos-htb-rtl.html
+ abspos/abspos-autopos-vlr-ltr.html
+ abspos/abspos-autopos-vlr-rtl.html
+ abspos/abspos-autopos-vrl-ltr.html
+ abspos/abspos-autopos-vrl-rtl.html
+ abspos/dynamic-align-self-001.html
+ abspos/flex-abspos-staticpos-align-self-safe-002.html
+ abspos/flex-abspos-staticpos-align-self-safe-003.html
+ abspos/abspos-descendent-001.html
+ abspos/flex-abspos-staticpos-align-content-001.html
+ abspos/flex-abspos-staticpos-align-self-001.html
+ abspos/flex-abspos-staticpos-align-self-002.html
+ abspos/flex-abspos-staticpos-align-self-003.html
+ abspos/flex-abspos-staticpos-align-self-004.html
+ abspos/flex-abspos-staticpos-align-self-005.html
+ abspos/flex-abspos-staticpos-align-self-006.html
+ abspos/flex-abspos-staticpos-align-self-007.html
+ abspos/flex-abspos-staticpos-align-self-008.html
+ abspos/flex-abspos-staticpos-align-self-rtl-001.html
+ abspos/flex-abspos-staticpos-align-self-rtl-002.html
+ abspos/flex-abspos-staticpos-align-self-rtl-003.html
+ abspos/flex-abspos-staticpos-align-self-rtl-004.html
+ abspos/flex-abspos-staticpos-align-self-safe-001.html
+ abspos/flex-abspos-staticpos-align-self-vertWM-001.html
+ abspos/flex-abspos-staticpos-align-self-vertWM-002.html
+ abspos/flex-abspos-staticpos-align-self-vertWM-003.html
+ abspos/flex-abspos-staticpos-align-self-vertWM-004.html
+ abspos/flex-abspos-staticpos-fallback-justify-content-001.html
+ abspos/flex-abspos-staticpos-justify-content-001.html
+ abspos/flex-abspos-staticpos-justify-content-002.html
+ abspos/flex-abspos-staticpos-justify-content-003.html
+ abspos/flex-abspos-staticpos-justify-content-004.html
+ abspos/flex-abspos-staticpos-justify-content-005.html
+ abspos/flex-abspos-staticpos-justify-content-006.html
+ abspos/flex-abspos-staticpos-justify-content-007.html
+ abspos/flex-abspos-staticpos-justify-content-008.html
+ abspos/flex-abspos-staticpos-justify-content-rtl-001.html
+ abspos/flex-abspos-staticpos-justify-content-rtl-002.html
+ abspos/flex-abspos-staticpos-justify-content-vertWM-001.html
+ abspos/flex-abspos-staticpos-justify-content-vertWM-002.html
+ abspos/flex-abspos-staticpos-justify-self-001.html
+ abspos/flex-abspos-staticpos-margin-001.html
+ abspos/flex-abspos-staticpos-margin-002.html
+ abspos/flex-abspos-staticpos-margin-003.html
+ abspos/flexbox_absolute-atomic.html
+ abspos/flexbox-abspos-child-001a.html
+ abspos/flexbox-abspos-child-001b.html
+ abspos/flexbox-abspos-child-002.html
+ abspos/flexbox_inline-abspos.html
+ abspos/position-absolute-001.html
+ abspos/position-absolute-002.html
+ abspos/position-absolute-003.html
+ abspos/position-absolute-004.html
+ abspos/position-absolute-005.html
+ abspos/position-absolute-006.html
+ abspos/position-absolute-007.html
+ abspos/position-absolute-008.html
+ abspos/position-absolute-009.html
+ abspos/position-absolute-010.html
+ abspos/position-absolute-011.html
+ abspos/position-absolute-012.html
+ abspos/position-absolute-013.html
+ abspos/position-absolute-014.html
+ abspos/position-absolute-015.html
+ abspos/position-absolute-containing-block-001.html
+ abspos/position-absolute-containing-block-002.html
+ alignment/flex-content-alignment-with-abspos-001.html
+ dynamic-grid-flex-abspos.html
+ flexbox_stf-abspos.html
+ flex-item-position-relative-001.html
+ position-relative-percentage-top-004.html
+ position-relative-stretch-height-001.html
+
+
+
+ The effect of this is that if you set, for example,
+ ''align-self: center;'' on an absolutely-positioned child of a flex container,
+ auto offsets on the child will center it in the flex container'scross axis.
+
+
+
+Flex Item Margins and Paddings
+
+ The margins of adjacent flex items do not
+ collapse.
+
+ Percentage margins and paddings on flex items,
+ like those on block boxes,
+ are resolved against the inline size of their containing block,
+ e.g. left/right/top/bottom percentages
+ all resolve against their containing block’s width
+ in horizontal writing modes.
+
+ Auto margins expand to absorb extra space in the corresponding dimension.
+ They can be used for alignment,
+ or to push adjacent flex items apart.
+ See Aligning with auto margins.
+
+
+ empty-flex-box-and-margin-collapsing.html
+ flex-container-margin.html
+ flexitem-no-margin-collapsing.html
+ flex-margin-no-collapse.html
+ negative-margins-001.html
+
+
+
+Flex Item Z-Ordering
+
+ Flex items paint exactly the same as inline blocks [[!CSS2]],
+ except that 'order'-modified document order is used in place of raw document order,
+ and 'z-index'
+ values other than ''z-index/auto'' create a stacking context
+ even if 'position' is ''static''
+ (behaving exactly as if 'position' were ''relative'').
+
+ Note: Descendants that are positioned outside a flex item still participate
+ in any stacking context established by the flex item.
+
+
+ flexbox-paint-ordering-001.xhtml
+ flexbox-paint-ordering-002.xhtml
+ flexbox-paint-ordering-003.html
+ flex-item-z-ordering-001.html
+ flex-item-z-ordering-002.html
+ flexbox-items-as-stacking-contexts-001.xhtml
+ flexbox-items-as-stacking-contexts-002.html
+ flexbox-items-as-stacking-contexts-003.html
+ hittest-overlapping-margin.html
+ hittest-overlapping-order.html
+ hittest-overlapping-relative.html
+
+
+
+
+
+Collapsed Items
+
+ Specifying ''visibility:collapse'' on a flex item
+ causes it to become a collapsed flex item,
+ producing an effect similar to ''visibility:collapse'' on a table-row or table-column:
+ the [=collapsed flex item=] is removed from rendering entirely,
+ but leaves behind a "strut" that keeps the flex line's cross-size stable.
+ Thus, if a flex container has only one flex line,
+ dynamically collapsing or uncollapsing items
+ may change the flex container's main size, but
+ is guaranteed to have no effect on its cross size
+ and won't cause the rest of the page's layout to "wobble".
+ Flex line wrapping is re-done after collapsing, however,
+ so the cross size of a flex container with multiple lines might or might not change.
+
+ Though [=collapsed flex items=] aren't rendered,
+ they do appear in the formatting structure.
+ Therefore, unlike on ''display:none'' items [[!CSS2]],
+ effects that depend on a box appearing in the formatting structure
+ (like incrementing counters or running animations and transitions)
+ still operate on collapsed items.
+
+
+ flexbox_visibility-collapse.html
+ flexbox_visibility-collapse-line-wrapping.html
+
+
+
+ In the following example,
+ a sidebar is sized to fit its content.
+ ''visibility: collapse'' is used to dynamically hide parts of a navigation sidebar
+ without affecting its width, even though the widest item (“Architecture”)
+ is in a collapsed section.
+
+
+ Sample live rendering for example code below
+
+
+
+
+ Hover over the menu to the left:
+ each section expands to show its sub-items.
+ In order to keep the sidebar width (and this main area width) stable,
+ ''visibility: collapse'' is used instead of ''display: none''.
+ This results in a sidebar that is always wide enough for the word “Architecture”,
+ even though it is not always visible.
+
+
+
+
+
+ @media (min-width: 60em) {
+ /* two column layout only when enough room (relative to default text size) */
+ div { display: flex; }
+ #main {
+ flex: 1; /* Main takes up all remaining space */
+ order: 1; /* Place it after (to the right of) the navigation */
+ min-width: 12em; /* Optimize main content area sizing */
+ }
+ }
+ /* menu items use flex layout so that visibility:collapse will work */
+ nav > ul > li {
+ display: flex;
+ flex-flow: column;
+ }
+ /* dynamically collapse submenus when not targeted */
+ nav > ul > li:not(:target):not(:hover) > ul {
+ visibility: collapse;
+ }
+
+
+ To compute the size of the strut, flex layout is first performed with all items uncollapsed,
+ and then re-run with each [=collapsed flex item=] replaced by a strut that maintains
+ the original [=cross size=] of the item's original line.
+ See the Flex Layout Algorithm
+ for the normative definition of how ''visibility:collapse''
+ interacts with flex layout.
+
+ Note: Using ''visibility:collapse'' on any flex items
+ will cause the flex layout algorithm to repeat partway through,
+ re-running the most expensive steps.
+ It's recommended that authors continue to use ''display:none'' to hide items
+ if the items will not be dynamically collapsed and uncollapsed,
+ as that is more efficient for the layout engine.
+ (Since only part of the steps need to be repeated when 'visibility' is changed,
+ however, 'visibility: collapse' is still recommended for dynamic cases.)
+
+
+
+
+Automatic Minimum Size of Flex Items
+
+ Note: The ''min-width/auto'' keyword,
+ representing an automatic minimum size,
+ is the new initial value of the 'min-width' and 'min-height' properties.
+ The keyword was previously defined in this specification,
+ but is now defined in the [[!CSS-SIZING-3|CSS Sizing]] module.
+
+ To provide a more reasonable default minimum size for flex items,
+ the used value of a main axisautomatic minimum size
+ on a flex item whose [=computed value|computed=] 'overflow' value is [=non-scrollable overflow value|non-scrollable=]
+ is its [=content-based minimum size=];
+ for scroll containers the automatic minimum size is zero, as usual.
+
+ The content-based minimum size of a [=flex item=]
+ differs depending on whether the [=flex item=] is [=replaced element|replaced=] or not:
+
+ : For [=replaced elements=]
+ ::
+ Use the smaller of the [=content size suggestion=]
+ and the [=transferred size suggestion=]
+ (if one exists),
+ capped by the [=specified size suggestion=]
+ (if one exists).
+
+ : For [=non-replaced elements=]
+ ::
+ Use the larger of the [=content size suggestion=]
+ and the [=transferred size suggestion=]
+ (if one exists),
+ capped by the [=specified size suggestion=]
+ (if one exists).
+
+ In either case,
+ the size is clamped by the [=maximum size|maximum=] [=main size=]
+ if it's definite.
+
+
+ image-items-flake-001.html
+
-
+ If the item’s [=preferred size|preferred=] [=main size=] is definite and not [=automatic size|automatic=],
+ then the specified size suggestion is that size.
+ It is otherwise undefined.
+
+
transferred size suggestion
+
+ If the item has a [=preferred aspect ratio=]
+ and its [=preferred size|preferred=] [=cross size=] is definite,
+ then the transferred size suggestion is that size
+ (clamped by its [=minimum size|minimum=] and [=maximum size|maximum=] [=cross sizes=] if they are definite),
+ converted through the aspect ratio.
+ It is otherwise undefined.
+
+
content size suggestion
+
+ The content size suggestion is the min-content size in the main axis,
+ clamped, if it has a [=preferred aspect ratio=],
+ by any definite [=minimum size|minimum=] and [=maximum size|maximum=] [=cross sizes=] converted through the aspect ratio.
+
+
+
+ content-height-with-scrollbars.html
+ fieldset-as-item-dynamic.html
+ fieldset-as-item-overflow.html
+ flex-aspect-ratio-img-column-001.html
+ flex-aspect-ratio-img-column-002.html
+ flex-aspect-ratio-img-column-003.html
+ flex-aspect-ratio-img-column-004.html
+ flex-aspect-ratio-img-column-005.html
+ flex-aspect-ratio-img-column-006.html
+ flex-aspect-ratio-img-column-007.html
+ flex-aspect-ratio-img-column-008.html
+ flex-aspect-ratio-img-column-009.html
+ flex-aspect-ratio-img-column-010.html
+ flex-aspect-ratio-img-column-011.html
+ flex-aspect-ratio-img-column-012.html
+ flex-aspect-ratio-img-column-013.html
+ flex-aspect-ratio-img-column-014.html
+ flex-aspect-ratio-img-column-015.html
+ flex-aspect-ratio-img-column-016.html
+ flex-aspect-ratio-img-column-017.html
+ flex-aspect-ratio-img-column-018.html
+ flex-aspect-ratio-img-row-001.html
+ flex-aspect-ratio-img-row-002.html
+ flex-aspect-ratio-img-row-003.html
+ flex-aspect-ratio-img-row-004.html
+ flex-aspect-ratio-img-row-005.html
+ flex-aspect-ratio-img-row-006.html
+ flex-aspect-ratio-img-row-007.html
+ flex-aspect-ratio-img-row-008.html
+ flex-aspect-ratio-img-row-009.html
+ flex-aspect-ratio-img-row-010.html
+ flex-aspect-ratio-img-row-011.html
+ flex-aspect-ratio-img-row-012.html
+ flex-aspect-ratio-img-row-013.html
+ flex-aspect-ratio-img-row-014.html
+ flex-aspect-ratio-img-row-015.html
+ flex-aspect-ratio-img-row-016.html
+ flex-aspect-ratio-img-row-017.html
+ flex-aspect-ratio-img-vert-lr.html
+ flexbox-definite-cross-size-constrained-percentage.html
+ flexbox-min-height-auto-001.html
+ flexbox-min-height-auto-002a.html
+ flexbox-min-height-auto-002b.html
+ flexbox-min-height-auto-002c.html
+ flexbox-min-height-auto-003.html
+ flexbox-min-height-auto-004.html
+ flexbox-min-width-auto-001.html
+ flexbox-min-width-auto-002a.html
+ flexbox-min-width-auto-002b.html
+ flexbox-min-width-auto-002c.html
+ flexbox-min-width-auto-003.html
+ flexbox-min-width-auto-004.html
+ flexbox-min-width-auto-005.html
+ flexbox-min-width-auto-006.html
+ flex-item-compressible-001.html
+ flex-item-compressible-002.html
+ flexitem-stretch-image.html
+ flexitem-stretch-range.html
+ flex-minimum-height-flex-items-001.xht
+ flex-minimum-height-flex-items-002.xht
+ flex-minimum-height-flex-items-003.xht
+ flex-minimum-height-flex-items-004.xht
+ flex-minimum-height-flex-items-005.xht
+ flex-minimum-height-flex-items-006.xht
+ flex-minimum-height-flex-items-007.xht
+ flex-minimum-height-flex-items-008.xht
+ flex-minimum-height-flex-items-009.html
+ flex-minimum-height-flex-items-010.html
+ flex-minimum-height-flex-items-011.xht
+ flex-minimum-height-flex-items-012.html
+ flex-minimum-height-flex-items-013.html
+ flex-minimum-height-flex-items-014.html
+ flex-minimum-height-flex-items-015.html
+ flex-minimum-height-flex-items-016.html
+ flex-minimum-height-flex-items-017.html
+ flex-minimum-height-flex-items-018.html
+ flex-minimum-height-flex-items-019.html
+ flex-minimum-height-flex-items-020.html
+ flex-minimum-height-flex-items-021.html
+ flex-minimum-height-flex-items-022.html
+ flex-minimum-height-flex-items-023.html
+ flex-minimum-height-flex-items-024.html
+ flex-minimum-height-flex-items-025.html
+ flex-minimum-height-flex-items-026.html
+ flex-minimum-height-flex-items-027.html
+ flex-minimum-height-flex-items-028.html
+ flex-minimum-height-flex-items-029.html
+ flex-minimum-height-flex-items-030.html
+ flex-minimum-height-flex-items-031.html
+ flex-minimum-size-001.html
+ flex-minimum-size-002.html
+ flex-minimum-size-003.html
+ flex-minimum-width-flex-items-001.xht
+ flex-minimum-width-flex-items-002.xht
+ flex-minimum-width-flex-items-003.xht
+ flex-minimum-width-flex-items-004.xht
+ flex-minimum-width-flex-items-005.xht
+ flex-minimum-width-flex-items-006.xht
+ flex-minimum-width-flex-items-007.xht
+ flex-minimum-width-flex-items-008.xht
+ flex-minimum-width-flex-items-009.html
+ flex-minimum-width-flex-items-010.html
+ flex-minimum-width-flex-items-011.html
+ flex-minimum-width-flex-items-012.html
+ flex-minimum-width-flex-items-013.html
+ flex-minimum-width-flex-items-014.html
+ flex-minimum-width-flex-items-015.html
+ flex-minimum-width-flex-items-016.html
+ scrollbars-auto-min-content-sizing.html
+ getcomputedstyle/flexbox_computedstyle_min-auto-size.html
+ getcomputedstyle/flexbox_computedstyle_min-height-auto.html
+ getcomputedstyle/flexbox_computedstyle_min-width-auto.html
+ checkbox-percentage-width-in-flex.html
+ select-as-flex-item-child-with-overflow.html
+ select-as-flex-item-with-overflow.html
+ select-element-multiple.html
+ select-element-zero-height-001.html
+ select-element-zero-height-002.html
+
+
+ Note: The [=content-based minimum size=] is a type of [=intrinsic size contribution=],
+ and thus the cyclic percentage provisions in [[css-sizing-3#intrinsic-contribution]] apply.
+
+ For the purpose of calculating an intrinsic size of the box
+ (e.g. the box’s min-content size),
+ a content-based minimum size causes the box’s size in that axis to become indefinite
+ (even if e.g. its 'width' property specifies a definite size).
+ Note this means that percentages calculated against this size
+ will [=behave as auto=].
+
+ For any purpose other than calculating intrinsic sizes,
+ a [=content-based minimum size=]
+ (unlike an explicit ''min-content''/etc [=minimum size=])
+ does not force the box's size to become indefinite.
+ However, if a percentage resolved against the box's size before this minimum was applied,
+ it must be re-resolved against the new size after it is applied.
+
+
+ Note that while a content-based minimum size is often appropriate,
+ and helps prevent content from overlapping or spilling outside its container,
+ in some cases it is not:
+
+ In particular, if flex sizing is being used for a major content area of a document,
+ it is better to set an explicit font-relative minimum width such as ''min-width: 12em''.
+ A content-based minimum width could result in a large table or large image
+ stretching the size of the entire content area into an overflow zone,
+ and thereby making lines of text gratuitously long and hard to read.
+
+ Note also, when content-based sizing is used on an item with large amounts of content,
+ the layout engine must traverse all of this content before finding its minimum size,
+ whereas if the author sets an explicit minimum, this is not necessary.
+ (For items with small amounts of content, however,
+ this traversal is trivial and therefore not a performance concern.)
+
-...
+ The contents of a flex container can be laid out in any direction and in any order.
+ This allows an author to trivially achieve effects that would previously have required complex or fragile methods,
+ such as hacks using the 'float' and 'clear' properties.
+ This functionality is exposed through the 'flex-direction', 'flex-wrap', and 'order' properties.
+
+ Note: The reordering capabilities of flex layout intentionally affect
+ only the visual rendering,
+ leaving speech order and navigation based on the source order.
+ This allows authors to manipulate the visual presentation
+ while leaving the source order intact for non-CSS UAs and for
+ linear models such as speech and sequential navigation.
+ See [[css-display-3#order-accessibility]]
+ and the Flex Layout Overview for examples
+ that use this dichotomy to improve accessibility.
+
+ Advisement:
+ Authors must not use 'order' or the ''*-reverse'' values of 'flex-flow'/'flex-direction'
+ as a substitute for correct source ordering,
+ as that can ruin the accessibility of the document.
+
+
+
+
+Flex Flow Direction: the 'flex-direction' property
+
+ The 'flex-direction' property specifies how flex items are placed in the flex container,
+ by setting the direction of the flex container's main axis.
+ This determines the direction in which flex items are laid out.
+
+
+
row
+
+ The flex container's main axis has the same orientation as the
+ inline axis
+ of the current writing mode.
+ The main-start and main-end directions are equivalent to the
+ inline-start and
+ inline-end directions, respectively,
+ of the current writing mode.
+
+
+ flex-child-percent-basis-resize-1.html
+ flexbox-flex-basis-content-001a.html
+ flexbox-flex-basis-content-001b.html
+ flexbox-flex-direction-row.htm
+ flexbox_justifycontent-left-001.html
+ flexbox-writing-mode-010.html
+ flexbox-writing-mode-011.html
+ flexbox-writing-mode-012.html
+ flexbox-writing-mode-016.html
+ percentage-size.html
+
+
+
row-reverse
+
+ Same as ''row'',
+ except the main-start and main-end directions are swapped.
+
+
+ flexbox_direction-row-reverse.html
+ flexbox-mbp-horiz-001-reverse.xhtml
+ flexbox-mbp-horiz-001-rtl-reverse.xhtml
+ flex-lines/multi-line-wrap-with-row-reverse.html
+ flexbox_justifycontent-right-001.html
+ flexbox_justifycontent-start.html
+ flexbox_justifycontent-start-rtl.html
+
+
+
column
+
+ The flex container's main axis has the same orientation as the
+ block axis
+ of the current writing mode.
+ The main-start and main-end directions are equivalent to the
+ block-start and
+ block-end directions, respectively,
+ of the current writing mode.
+
+
+ columns-height-set-via-top-bottom.html
+ dynamic-bsize-change.html
+ flexbox_direction-column.html
+ flexbox_direction-column-reverse.html
+ flexbox_rtl-flow.html
+ flex-column-relayout-assert.html
+ flex-item-max-height-min-content.html
+ flex-item-transferred-sizes-padding-border-sizing.html
+ flex-item-transferred-sizes-padding-content-sizing.html
+ flex-outer-flexbox-column-recalculate-height-on-resize-001.html
+ image-nested-within-definite-column-flexbox.html
+ layout-with-inline-svg-001.html
+ nested-orthogonal-flexbox-relayout.html
+ percentage-max-width-cross-axis.html
+ percentage-size.html
+
+
+
column-reverse
+
+ Same as ''column'',
+ except the main-start and main-end directions are swapped.
+
+
+ column-reverse-gap.html
+ flexbox_rtl-direction.html
+ flex-lines/multi-line-wrap-with-column-reverse.html
+
+
+
+ Note: The reverse values do not reverse box ordering:
+ like 'writing-mode' and 'direction' [[CSS3-WRITING-MODES]],
+ they only change the direction of flow.
+ Painting order, speech order, and sequential navigation orders
+ are not affected.
+
+ Note: Depending on the value of 'justify-content',
+ the reverse values of 'flex-direction' can alter the initial scroll position
+ on [=flex containers=] that are also [=scroll containers=].
+ See [[css-align-3#overflow-scroll-position]].
+
+
+ animation/discrete-no-interpolation.html
+ change-column-flex-width.html
+ column-flex-child-with-max-width.html
+ column-flex-child-with-overflow-scroll.html
+ cross-axis-scrollbar.html
+ dynamic-orthogonal-flex-item.html
+ flexbox-writing-mode-001.html
+ flexbox-writing-mode-002.html
+ flexbox-writing-mode-003.html
+ flexbox-writing-mode-004.html
+ flexbox-writing-mode-005.html
+ flexbox-writing-mode-006.html
+ flexbox-writing-mode-007.html
+ flexbox-writing-mode-008.html
+ flexbox-writing-mode-009.html
+ flexbox-writing-mode-010.html
+ flexbox-writing-mode-011.html
+ flexbox-writing-mode-012.html
+ flexbox-writing-mode-013.html
+ flexbox-writing-mode-014.html
+ flexbox-writing-mode-015.html
+ flexbox-writing-mode-016.html
+ flexbox-writing-mode-slr.html
+ flexbox-writing-mode-slr-row-mix.html
+ flexbox-writing-mode-slr-rtl.html
+ flexbox-writing-mode-srl.html
+ flexbox-writing-mode-srl-row-mix.html
+ flexbox-writing-mode-srl-rtl.html
+ flexbox_object.html
+ flexbox_writing_mode_vertical_lays_out_contents_from_top_to_bottom.html
+ getcomputedstyle/flexbox_computedstyle_flex-direction-column.html
+ getcomputedstyle/flexbox_computedstyle_flex-direction-column-reverse.html
+ getcomputedstyle/flexbox_computedstyle_flex-direction-invalid.html
+ getcomputedstyle/flexbox_computedstyle_flex-direction-row.html
+ getcomputedstyle/flexbox_computedstyle_flex-direction-row-reverse.html
+
+
+
Flex Line Wrapping: the 'flex-wrap' property
@@ -62,9 +1753,8 @@ Flex Line Wrapping: the 'flex-wrap' property
balance
The flex container is [=multi-line=],
- and attempts to "balance" the lengths of the [=flex lines=]
+ and attempts to [=balance=] the lengths of the [=flex lines=]
to be as similar as possible.
- See [[#flex-balance=]].
''balance'' can be combined with ''wrap'' or ''wrap-reverse''
to dictate which direction the [=flex lines=] are stacked in.
@@ -86,11 +1776,454 @@ Flex Line Wrapping: the 'flex-wrap' property
on [=flex containers=] that are also [=scroll containers=].
See [[css-align-3#overflow-scroll-position]].
+
+ animation/discrete-no-interpolation.html
+ flexbox-flex-wrap-default.htm
+ flexbox-flex-wrap-flexing-002.html
+ flexbox-flex-wrap-flexing-003.html
+ flexbox-flex-wrap-flexing.html
+ flexbox-flex-wrap-horiz-001.html
+ flexbox-flex-wrap-horiz-002.html
+ flexbox-flex-wrap-nowrap.htm
+ flexbox-flex-wrap-vert-001.html
+ flexbox-flex-wrap-vert-002.html
+ flexbox-flex-wrap-wrap.htm
+ flexbox-flex-wrap-wrap-reverse.htm
+ flexbox_rowspan.html
+ flexbox_rtl-flow.html
+ flexbox_rtl-flow-reverse.html
+ flexbox_rtl-order.html
+ flex-box-wrap.html
+ flexbox_wrap.html
+ flexbox_wrap-long.html
+ flexbox_wrap-reverse.html
+ flex-wrap-column-grow.html
+ balance/balance-001.html
+ balance/balance-002.html
+ balance/balance-003.html
+ balance/balance-004.html
+ balance/balance-005.html
+ balance/balance-available-size-001.html
+ balance/balance-available-size-002.html
+ balance/balance-line-break-crash.html
+ balance/balance-negative-margin.html
+ balance/balance-percentage-size-001.html
+ balance/balance-percentage-size-002.html
+ balance/flex-wrap-computed.html
+ balance/flex-wrap-invalid.html
+ balance/flex-wrap-valid.html
+ remove-wrapped-001.html
+ remove-wrapped-002.html
+ flex-lines/multi-line-wrap-reverse-column-reverse.html
+ flex-lines/multi-line-wrap-reverse-row-reverse.html
+ getcomputedstyle/flexbox_computedstyle_flex-wrap-invalid.html
+ getcomputedstyle/flexbox_computedstyle_flex-wrap-nowrap.html
+ getcomputedstyle/flexbox_computedstyle_flex-wrap-wrap.html
+ getcomputedstyle/flexbox_computedstyle_flex-wrap-wrap-reverse.html
+ multiline-min-preferred-width.html
+ multiline-reverse-wrap-baseline.html
+
+
+
+
+
+
+Flex Direction and Wrap: the 'flex-flow' shorthand
+ Some examples of valid flows in an English (left-to-right, horizontal writing mode) document:
+
+
+
+
+
+ div { flex-flow: row; }
+ /* Initial value. Main-axis is inline, no wrapping.
+ (Items will either shrink to fit or overflow.) */
+
+
+
+
+
+ div { flex-flow: column wrap; }
+ /* Main-axis is block-direction (top to bottom)
+ and lines wrap in the inline direction (rightwards). */
+
+
+
+
+
+ div { flex-flow: row-reverse wrap-reverse; }
+ /* Main-axis is the opposite of inline direction
+ (right to left). New lines wrap upwards. */
+
+
+
+
+
+
+ Note that the 'flex-flow' directions are writing mode sensitive.
+ In vertical Japanese, for example,
+ a ''row'' flex container lays out its contents from top to bottom,
+ as seen in this example:
+
+
+
+
+
English
+
Japanese
+
+
+
flex-flow: row wrap; writing-mode: horizontal-tb;
+
flex-flow: row wrap; writing-mode: vertical-rl;
+
+
+
+
+
+
+
+Reordering and Accessibility: the 'order' property
+
+ Flex items are, by default, displayed and laid out
+ in the same order as they appear in the source document,
+ which represents their logical ordering.
+ This same order is used in rendering to non-visual media
+ (such as speech),
+ in the default traversal order of sequential navigation modes
+ (such as cycling through links,
+ see e.g. tabindex [[HTML]]),
+ and when content is represented in non-CSS UAs.
+
+ The 'order' property can be used to change flex items’ ordering,
+ laying them out in [=order-modified document order=] instead,
+ in order to make their spatial arrangement on the 2D visual canvas
+ differ from their logical order in linear presentations
+ such as speech and sequential navigation.
+ See [[CSS-DISPLAY-3#order-property]].
+ [[!CSS-DISPLAY-3]]
+
+ Note: Since visual perception is two-dimensional and non-linear,
+ the desired box order is not always the same logical order
+ used by non-visual media and non-CSS UAs.
+
+ Advisement:
+ Authors must use 'order' only for visual, not logical, reordering of content.
+ Style sheets that use 'order' to perform logical reordering are non-conforming.
+
+
+ Many web pages have a similar shape in the markup,
+ with a header on top,
+ a footer on bottom,
+ and then a content area and one or two additional columns in the middle.
+ Generally,
+ it's desirable that the content come first in the page's source code,
+ before the additional columns.
+ However, this makes many common designs,
+ such as simply having the additional columns on the left and the content area on the right,
+ difficult to achieve.
+ This has been addressed in many ways over the years,
+ often going by the name "Holy Grail Layout" when there are two additional columns.
+ 'order' makes this trivial.
+ For example, take the following sketch of a page's code and desired layout:
+
+
+
+ This layout can be easily achieved with flex layout:
+
+
+ main { display: flex; }
+ main > article { order: 2; min-width: 12em; flex:1; }
+ main > nav { order: 1; width: 200px; }
+ main > aside { order: 3; width: 200px; }
+
+
+ As an added bonus,
+ the columns will all be equal-height by default,
+ and the main content will be as wide as necessary to fill the screen.
+ Additionally,
+ this can then be combined with media queries to switch to an all-vertical layout on narrow screens:
+
+
+ @media all and (max-width: 600px) {
+ /* Too narrow to support three columns */
+ main { flex-flow: column; }
+ main > article, main > nav, main > aside {
+ /* Return them to document order */
+ order: 0; width: auto;
+ }
+ }
+
+
+ (Further use of multi-line flex containers to achieve even more intelligent wrapping left as an exercise for the reader.)
+
+
+
Flex Lines
-...
+ Flex items in a flex container are laid out and aligned
+ within flex lines,
+ hypothetical containers used for grouping and alignment by the layout algorithm.
+ A flex container can be either single-line or multi-line,
+ depending on the 'flex-wrap' property:
+
+ * A single-line flex container
+ (i.e. one with ''flex-wrap: nowrap'')
+ lays out all of its children in a single line,
+ even if that would cause its contents to overflow.
+ * A multi-line flex container
+ (i.e. one with ''flex-wrap: wrap'' or ''flex-wrap: wrap-reverse'')
+ breaks its flex items across multiple lines,
+ similar to how text is broken onto a new line when it gets too wide to fit on the existing line.
+ When additional lines are created,
+ they are stacked in the flex container along the cross axis
+ according to the 'flex-wrap' property.
+ Every line contains at least one flex item,
+ unless the flex container itself is completely empty.
+
+ Additionally, a [=multi-line=] flexbox can be
+ a balanced flex container,
+ meaning it carefully chooses its linebreaks
+ to make the line lengths as similar as possible.
+ (Otherwise, it simply fills the first line, then the second, etc.)
+
+
+ This example shows four buttons that do not fit side-by-side horizontally,
+ and therefore will wrap into multiple lines.
+
+
+
+ Since the container is 300px wide, only three of the items fit onto a single line.
+ They take up 240px, with 60px left over of remaining space.
+ Because the 'flex-flow' property specifies a multi-line flex container
+ (due to the ''wrap'' keyword appearing in its value),
+ the flex container will create an additional line to contain the last item.
+
+
+
+ An example rendering of the multi-line flex container.
+
+
+
+ Once content is broken into lines,
+ each line is laid out independently;
+ flexible lengths and the 'justify-content' and 'align-self' properties only consider the items on a single line at a time.
+
+ In a multi-lineflex container (even one with only a single line),
+ the cross size of each line
+ is the minimum size necessary to contain the flex items on the line
+ (after alignment due to 'align-self'),
+ and the lines are aligned within the flex container with the 'align-content' property.
+ In a single-lineflex container,
+ the cross size of the line is the cross size of the flex container,
+ and 'align-content' has no effect.
+ The main size of a line is always the same as the main size of the flex container's content box.
+
+
+ align-content-001.htm
+ align-content-002.htm
+ align-content-003.htm
+ align-content-004.htm
+ align-content-005.htm
+ align-content-006.htm
+ align-content-007.htm
+ flexbox-lines-must-be-stretched-by-default.html
+
+
+
+ Here's the same example as the previous,
+ except that the flex items have all been given ''flex: auto''.
+ The first line has 60px of remaining space,
+ and all of the items have the same flexibility,
+ so each of the three items on that line will receive 20px of extra width,
+ each ending up 100px wide.
+ The remaining item is on a line of its own
+ and will stretch to the entire width of the line, i.e. 300px.
+
+
+
+
+
+ A rendering of the same as above,
+ but with the items all given ''flex: auto''.
+
+
+
+
+
+ The above examples show three items fitting on a single line,
+ leaving a single item on the second line.
+ ''flex-wrap: balance'' will instead put two items on the first line,
+ then two on the second line:
+
+
+
+
+
+ The previous example's four items,
+ but now balanced across the two lines
+ with ''flex-wrap: balance''.
+
+
+
+ This can have more dramatic effects when flexing items to fill the line,
+ as the items are more likely to flex similar amounts,
+ rather than the final line's items flexing a lot more:
+
+
+
+
+
+ The same example,
+ but now with ''flex: auto''.
+
+
+
Minimum Flex Lines: the 'flex-line-count' property
@@ -111,17 +2244,41 @@ Minimum Flex Lines: the 'flex-line-count' property
In some situations,
an author might want to ensure there are always a certain number of lines,
or might be using a flexbox in a way where there is no limit to the line length
- (the standard for a [=column flexbox=])
+ (the standard for a ''column'' flexbox, with unlimited available height)
and so the "default" line number calculation is useless.
- The 'flex-line-count' property specifies a minimum number of [=flex lines=]
+ The 'flex-line-count' property specifies a minimum flex line count
that the [=flex container=] should create
to balance the items across.
- If the [=flex container=] has less [=flex items=] than the 'flex-line-count' value,
+
+ balance/balance-line-count-intrinsic-001.html
+ balance/balance-line-count-intrinsic-002.html
+ balance/balance-line-count-intrinsic-003.html
+ balance/balance-line-count-intrinsic-004.html
+ balance/balance-line-count-intrinsic-005.html
+ balance/balance-line-count-intrinsic-006.html
+ balance/balance-line-count-intrinsic-007.html
+ balance/balance-min-line-count-001.html
+ balance/balance-min-line-count-002.html
+ balance/balance-min-line-count-003.html
+ balance/balance-min-line-count-004.html
+ balance/balance-min-line-count-005.html
+ balance/flex-line-count-computed.html
+ balance/flex-line-count-invalid.html
+ balance/flex-line-count-valid.html
+
+
+ The [=minimum flex line count=] is clamped from above
+ by the number of [=flex items=] in the [=flex container=];
it will only create as many lines as there are [=flex items=].
- If the [=flex lines=] are limited in length
- and the [=flex items=] will fill more than the specified number of lines,
- the actual [=flex line=] count can be higher than what is specified.
+ (That is, if you specify ''flex-line-count: 3''
+ but only have two [=flex items=],
+ the [=minimum flex line count=] is 2, instead.)
+
+ Note: There is no maximum flex line count;
+ the [=flex container=] will always contain enough lines
+ to hold all of its [=flex items=],
+ which might be more than what 'flex-line-count' specifies.
Unused lines (ones with no [=flex items=] assigned to them)
are discarded and do not affect layout.
@@ -136,7 +2293,8 @@ Minimum Flex Lines: the 'flex-line-count' property
then dividing the leftover by N,
where N is the 'flex-line-count' value.
This uses the actual 'flex-line-count' value,
- not the number of lines produced
+ not the [=minimum flex line count=]
+ or the actual number of generated lines
(which can be higher or lower than what is specified).
Note: This [=available space=] adjustment is the only effect 'flex-line-count' has
@@ -145,35 +2303,3287 @@ Minimum Flex Lines: the 'flex-line-count' property
Percentages continue to resolve as normal,
unaffected by this [=available space=] adjustment.
(To have a [=flex item=] fill the [=cross-axis=] [=available space=],
- use ''width/height: stretch''.)
+ use ''width/height: stretch'',
+ rather than ''width/height: 100%''.)
If the [=flex container=] is [=single-line=]
(aka, ''flex-wrap: nowrap''),
this property has no effect.
-
-Flex Layout Algorithm
+
+
+
+Flexibility
+
+ The defining aspect of flex layout is the ability to make the flex items “flex”,
+ altering their width/height to fill the available space in the main dimension.
+ This is done with the 'flex' property.
+ A flex container distributes free space to its items (proportional to their flex grow factor) to fill the container,
+ or shrinks them (proportional to their flex shrink factor) to prevent overflow.
+
+ A flex item is fully inflexible
+ if both its 'flex-grow' and 'flex-shrink' values are zero,
+ and flexible otherwise.
+
+
+ flex-factor-less-than-one.html
+
+
+
+The 'flex' Shorthand
+
+
+ Name: flex
+ Value: none | [ <<'flex-grow'>> <<'flex-shrink'>>? || <<'flex-basis'>> ]
+ Initial: 0 1 auto
+ Applies to: flex items
+ Inherited: no
+ Animation type: by computed value type
+
+
+
+ flexbox-dyn-resize-001.html
+ flex-item-max-width-min-content.html
+ flex-item-min-height-min-content.html
+ flex-item-min-width-min-content.html
+ flex-shorthand-calc.html
+ parsing/flex-computed.html
+ parsing/flex-invalid.html
+ parsing/flex-shorthand.html
+ parsing/flex-valid.html
+
+
+ The 'flex' property specifies the components of a [=flexible=] size:
+ the flex factors
+ (grow and shrink)
+ and the flex basis.
+ When a box is a flex item,
+ 'flex' is consulted instead of the main size property
+ to determine the main size of the box.
+ If a box is not a flex item,
+ 'flex' has no effect.
+
+ Note: The initial values of the 'flex' longhands are equivalent to
+ flex: 0 1 auto.
+ This differs from their defaults when omitted in the 'flex' shorthand
+ (effectively ''1 1 0px'')
+ so that the 'flex' shorthand can better accommodate
+ the most common cases.
+
+
+
<<'flex-grow'>>
+
+ This <> component sets 'flex-grow' longhand
+ and specifies the flex grow factor,
+ which determines how much the flex item will grow
+ relative to the rest of the flex items in the flex container
+ when positive free space is distributed.
+ When omitted, it is set to ''1''.
+
+
+ animation/flex-grow-interpolation.html
+ flex-001.htm
+ flex-003.htm
+ flex-grow-001.xht
+ flex-grow-002.html
+ flex-grow-003.html
+ flex-grow-004.html
+ flex-grow-005.html
+ flex-grow-006.html
+ flex-grow-007.html
+ flex-grow-008.html
+ flexbox_flex-natural.html
+ flexbox_flex-natural-mixed-basis-auto.html
+ flexbox_flex-natural-mixed-basis.html
+ flexbox_flex-natural-variable-auto-basis.html
+ flexbox_flex-natural-variable-zero-basis.html
+ flexbox_flex-none.html
+ flexbox_flex-none-wrappable-content.html
+ flex-factor-less-than-one.html
+ getcomputedstyle/flexbox_computedstyle_flex-shorthand-0-auto.html
+ getcomputedstyle/flexbox_computedstyle_flex-shorthand-auto.html
+ getcomputedstyle/flexbox_computedstyle_flex-shorthand.html
+ getcomputedstyle/flexbox_computedstyle_flex-shorthand-initial.html
+ getcomputedstyle/flexbox_computedstyle_flex-shorthand-invalid.html
+ getcomputedstyle/flexbox_computedstyle_flex-shorthand-none.html
+ getcomputedstyle/flexbox_computedstyle_flex-shorthand-number.html
+ getcomputedstyle/flexbox_computedstyle_flex-grow-0.html
+ getcomputedstyle/flexbox_computedstyle_flex-grow-invalid.html
+ getcomputedstyle/flexbox_computedstyle_flex-grow-number.html
+ interactive/flexbox_interactive_flex-grow-transitions.html
+ parsing/flex-grow-computed.html
+ parsing/flex-grow-invalid.html
+ parsing/flex-grow-valid.html
+ table-item-flex-percentage-min-width.html
+ table-item-flex-percentage-width.html
+
+
+
+ Flex values between 0 and 1 have a somewhat special behavior:
+ when the sum of the flex values on the line is less than 1,
+ they will take up less than 100% of the free space.
+
+ An item’s 'flex-grow' value
+ is effectively a request for some proportion of the free space,
+ with ''1'' meaning “100% of the free space”;
+ then if the items on the line are requesting more than 100% in total,
+ the requests are rebalanced to keep the same ratio but use up exactly 100% of it.
+ However, if the items request less than the full amount
+ (such as three items that are each ''flex-grow: .25'')
+ then they'll each get exactly what they request
+ (25% of the free space to each,
+ with the final 25% left unfilled).
+ See [[#resolve-flexible-lengths]] for the exact details
+ of how free space is distributed.
+
+ This pattern is required for continuous behavior as 'flex-grow' approaches zero
+ (which means the item wants none of the free space).
+ Without this, a ''flex-grow: 1'' item would take all of the free space;
+ but so would a ''flex-grow: 0.1'' item,
+ and a ''flex-grow: 0.01'' item,
+ etc.,
+ until finally the value is small enough to underflow to zero
+ and the item suddenly takes up none of the free space.
+ With this behavior,
+ the item instead gradually takes less of the free space
+ as 'flex-grow' shrinks below ''1'',
+ smoothly transitioning to taking none of the free space at zero.
+
+ Unless this “partial fill” behavior is specifically what's desired,
+ authors should stick to values ≥ 1;
+ for example, using ''1'' and ''2'' is usually better
+ than using ''.33'' and ''.67'',
+ as they're more likely to behave as intended
+ if items are added, removed, or line-wrapped.
+
+
+
<<'flex-shrink'>>
+
+ This <> component sets 'flex-shrink' longhand
+ and specifies the flex shrink factor,
+ which determines how much the flex item will shrink
+ relative to the rest of the flex items in the flex container
+ when negative free space is distributed.
+ When omitted, it is set to ''1''.
+
+
+ animation/flex-shrink-interpolation.html
+ flex-002.htm
+ flex-004.htm
+ flex-factor-less-than-one.html
+ flex-shrink-001.html
+ flex-shrink-002.html
+ flex-shrink-003.html
+ flex-shrink-004.html
+ flex-shrink-005.html
+ flex-shrink-006.html
+ flex-shrink-007.html
+ flex-shrink-008.html
+ flex-shrink-large-value-crash.html
+ getcomputedstyle/flexbox_computedstyle_flex-shrink-0.html
+ getcomputedstyle/flexbox_computedstyle_flex-shrink-invalid.html
+ getcomputedstyle/flexbox_computedstyle_flex-shrink-number.html
+ interactive/flexbox_interactive_flex-shrink-transitions.html
+ interactive/flexbox_interactive_flex-shrink-transitions-invalid.html
+ parsing/flex-shrink-computed.html
+ parsing/flex-shrink-invalid.html
+ parsing/flex-shrink-valid.html
+ table-item-flex-percentage-min-width.html
+ table-item-flex-percentage-width.html
+
+
+ Note: The flex shrink factor is multiplied by the flex base size when distributing negative space.
+ This distributes negative space in proportion to how much the item is able to shrink,
+ so that e.g. a small item won't shrink to zero before a larger item has been noticeably reduced.
+
+
+ flex-item-max-width-min-content-002.html
+
+
+
<<'flex-basis'>>
+
+ This component sets the 'flex-basis' longhand,
+ which specifies the flex basis:
+ the initial main size of the flex item,
+ before free space is distributed according to the flex factors.
+
+
+ animation/flex-basis-composition.html
+ animation/flex-basis-content-crash.html
+ animation/flex-basis-interpolation.html
+ dynamic-isize-change-001.html
+ dynamic-isize-change-002.html
+ dynamic-isize-change-003.html
+ dynamic-isize-change-004.html
+ flex-basis-001.html
+ flex-basis-002.html
+ flex-basis-003.html
+ flex-basis-004.html
+ flex-basis-005.html
+ flex-basis-006.html
+ flex-basis-007.html
+ flex-basis-008.html
+ flex-basis-009.html
+ flex-basis-010.html
+ flex-basis-011.html
+ flex-basis-012.html
+ flex-basis-013.html
+ flex-basis-intrinsics-001.html
+ flex-basis-item-margins-001.html
+ flexbox-flex-basis-content-001a.html
+ flexbox-flex-basis-content-001b.html
+ flexbox-flex-basis-content-002a.html
+ flexbox-flex-basis-content-002b.html
+ flexbox-flex-basis-content-003a.html
+ flexbox-flex-basis-content-003b.html
+ flexbox-flex-basis-content-004a.html
+ flexbox-flex-basis-content-004b.html
+ flexbox_flex-basis.html
+ flexbox_flex-basis-shrink.html
+ flex-one-sets-flex-basis-to-zero-px.html
+ flex-shorthand-flex-basis-middle.html
+ getcomputedstyle/flexbox_computedstyle_flex-basis-0.html
+ getcomputedstyle/flexbox_computedstyle_flex-basis-0percent.html
+ getcomputedstyle/flexbox_computedstyle_flex-basis-auto.html
+ getcomputedstyle/flexbox_computedstyle_flex-basis-percent.html
+ interactive/flexbox_interactive_flex-basis-transitions.html
+ parsing/flex-basis-computed.html
+ parsing/flex-basis-invalid.html
+ parsing/flex-basis-valid.html
+ flex-basis-content-percentage-height.html
+ table-as-item-percent-width-cell-001.html
+
+
+ <<'flex-basis'>> accepts the same values as the 'width' and 'height' properties
+ (except that ''flex-basis/auto'' is treated differently)
+ plus the ''content'' keyword:
+
+
+
auto
+
+ When specified on a flex item, the ''flex-basis/auto'' keyword
+ retrieves the value of the main size property as the used 'flex-basis'.
+ If that value is itself ''auto'', then the used value is ''flex-basis/content''.
+
+
content
+
+ Indicates an [=automatic size=]
+ based on the flex item’s content.
+ (This is typically equivalent to the max-content size,
+ but with adjustments to handle [=preferred aspect ratios=],
+ intrinsic sizing constraints,
+ and orthogonal flows;
+ see details in [[#layout-algorithm]].)
+
+ Note: This value was not present in the initial release of Flexible Box Layout,
+ and thus some older implementations will not support it.
+ The equivalent effect can be achieved by using ''flex/auto''
+ together with a main size ('width' or 'height') of ''width/auto''.
+
+
<<'width'>>
+
+ For all other values,
+ 'flex-basis' is resolved the same way as for 'width' and 'height'.
+
+
+ When omitted from the 'flex' shorthand, its specified value is ''0''.
+
+
none
+
+ The keyword ''flex/none'' expands to ''0 0 auto''.
+
+
+
+
+
+ A diagram showing the difference between "absolute" flex
+ (starting from a basis of zero)
+ and "relative" flex
+ (starting from a basis of the item's content size).
+ The three items have flex factors of ''1'', ''1'', and ''2'', respectively:
+ notice that the item with a flex factor of ''2'' grows twice as fast as the others.
+
+
+
+ A unitless zero that is not already preceded by two flex factors
+ must be interpreted as a flex factor.
+ To avoid misinterpretation or invalid declarations,
+ authors must specify a zero <<'flex-basis'>> component
+ with a unit or precede it by two flex factors.
+
+
+Basic Values of 'flex'
+
+ This section is informative.
+
+ The list below summarizes the effects of the four 'flex' values
+ that represent most commonly-desired effects:
+
+
+
''flex: initial''
+
+ Equivalent to ''flex: 0 1 auto''. (This is the initial value.)
+ Sizes the item based on the 'width'/'height' properties.
+ (If the item's main size property computes to auto,
+ this will size the flex item based on its contents.)
+ Makes the flex item inflexible when there is positive free space,
+ but allows it to shrink to its minimum size when there is insufficient space.
+ The alignment abilities or auto margins
+ can be used to align flex items along the main axis.
+
+
''flex: auto''
+
+ Equivalent to ''flex: 1 1 auto''.
+ Sizes the item based on the 'width'/'height' properties,
+ but makes them fully flexible, so that they absorb any free space along the main axis.
+ If all items are either ''flex: auto'', ''flex: initial'', or ''flex: none'',
+ any positive free space after the items have been sized will be distributed evenly to the items with ''flex: auto''.
+
+
''flex: none''
+
+ Equivalent to ''flex: 0 0 auto''.
+ This value sizes the item according to the 'width'/'height' properties,
+ but makes the flex item fully inflexible.
+ This is similar to ''initial'',
+ except that flex items are not allowed to shrink,
+ even in overflow situations.
+
+
''flex: <number [1,∞]>''
+
+ Equivalent to ''flex: <number [1,∞]> 1 0''.
+ Makes the flex item flexible and sets the flex basis to zero,
+ resulting in an item that receives the specified proportion of the free space in the flex container.
+ If all items in the flex container use this pattern,
+ their sizes will be proportional to the specified flex factor.
+
+
+
+ flexbox_flex-auto.html
+ flexbox_flex-initial-2.html
+ flexbox_flex-initial.html
+ radiobutton-min-size.html
+
+
+ By default, flex items won't shrink below their minimum content size
+ (the length of the longest word or fixed-size element).
+ To change this, set the 'min-width' or 'min-height' property.
+ (See [[#min-size-auto]].)
+
+
+Components of Flexibility
+
+ Individual components of flexibility can be controlled by independent longhand properties.
+
+ Advisement: Authors are encouraged to control flexibility using the 'flex' shorthand
+ rather than with its longhand properties directly,
+ as the shorthand correctly resets any unspecified components
+ to accommodate common uses.
+
+
+The 'flex-grow' property
+
+
+ Name: flex-grow
+ Value: <>
+ Initial: 0
+ Applies to: flex items
+ Inherited: no
+ Computed value: specified number
+ Animation type: by computed value type
+
+
+
+
+ animation/flex-grow-interpolation.html
+ flex-001.htm
+ flex-003.htm
+ flex-grow-001.xht
+ flex-grow-002.html
+ flex-grow-003.html
+ flex-grow-004.html
+ flex-grow-005.html
+ flex-grow-006.html
+ flex-grow-007.html
+ flex-grow-008.html
+ getcomputedstyle/flexbox_computedstyle_flex-grow-0.html
+ getcomputedstyle/flexbox_computedstyle_flex-grow-invalid.html
+ getcomputedstyle/flexbox_computedstyle_flex-grow-number.html
+ interactive/flexbox_interactive_flex-grow-transitions.html
+ parsing/flex-grow-computed.html
+ parsing/flex-grow-invalid.html
+ parsing/flex-grow-valid.html
+
+
+ Advisement: Authors are encouraged to control flexibility using the 'flex' shorthand
+ rather than with 'flex-grow' directly,
+ as the shorthand correctly resets any unspecified components
+ to accommodate common uses.
+
+ The 'flex-grow' property sets the flex grow factor
+ to the provided <>.
+ Negative values are not allowed.
+
+
+The 'flex-shrink' property
+
+
+ Name: flex-shrink
+ Value: <>
+ Initial: 1
+ Applies to: flex items
+ Inherited: no
+ Computed value: specified value
+ Animation type: number
+
+
+
+ animation/flex-shrink-interpolation.html
+ flex-002.htm
+ flex-004.htm
+ flex-shrink-001.html
+ flex-shrink-002.html
+ flex-shrink-003.html
+ flex-shrink-004.html
+ flex-shrink-005.html
+ flex-shrink-006.html
+ flex-shrink-007.html
+ flex-shrink-008.html
+ flex-shrink-large-value-crash.html
+ getcomputedstyle/flexbox_computedstyle_flex-shrink-0.html
+ getcomputedstyle/flexbox_computedstyle_flex-shrink-invalid.html
+ getcomputedstyle/flexbox_computedstyle_flex-shrink-number.html
+ interactive/flexbox_interactive_flex-shrink-transitions.html
+ interactive/flexbox_interactive_flex-shrink-transitions-invalid.html
+ parsing/flex-shrink-computed.html
+ parsing/flex-shrink-invalid.html
+ parsing/flex-shrink-valid.html
+
+
+ Advisement: Authors are encouraged to control flexibility using the 'flex' shorthand
+ rather than with 'flex-shrink' directly,
+ as the shorthand correctly resets any unspecified components
+ to accommodate common uses.
+
+ The 'flex-shrink' property sets the flex shrink factor
+ to the provided <>.
+ Negative values are not allowed.
+
+
+The 'flex-basis' property
+
+
+ Name: flex-basis
+ Value: content | <<'width'>>
+ Initial: auto
+ Applies to: flex items
+ Inherited: no
+ Percentages: relative to the flex container's inner main size
+ Computed value: specified keyword or a computed <> value
+ Animation type: by computed value type
+
+
+
+ animation/flex-basis-composition.html
+ animation/flex-basis-content-crash.html
+ animation/flex-basis-interpolation.html
+ dynamic-isize-change-001.html
+ dynamic-isize-change-002.html
+ dynamic-isize-change-003.html
+ dynamic-isize-change-004.html
+ flex-basis-001.html
+ flex-basis-002.html
+ flex-basis-003.html
+ flex-basis-004.html
+ flex-basis-005.html
+ flex-basis-006.html
+ flex-basis-007.html
+ flex-basis-008.html
+ flex-basis-009.html
+ flex-basis-010.html
+ flex-basis-011.html
+ flex-basis-012.html
+ flex-basis-013.html
+ flex-basis-intrinsics-001.html
+ flex-basis-item-margins-001.html
+ flexbox-flex-basis-content-001a.html
+ flexbox-flex-basis-content-001b.html
+ flexbox-flex-basis-content-002a.html
+ flexbox-flex-basis-content-002b.html
+ flexbox-flex-basis-content-003a.html
+ flexbox-flex-basis-content-003b.html
+ flexbox-flex-basis-content-004a.html
+ flexbox-flex-basis-content-004b.html
+ flexbox_flex-basis.html
+ flexbox_flex-basis-shrink.html
+ flex-one-sets-flex-basis-to-zero-px.html
+ flex-shorthand-flex-basis-middle.html
+ getcomputedstyle/flexbox_computedstyle_flex-basis-0.html
+ getcomputedstyle/flexbox_computedstyle_flex-basis-0percent.html
+ getcomputedstyle/flexbox_computedstyle_flex-basis-auto.html
+ getcomputedstyle/flexbox_computedstyle_flex-basis-percent.html
+ interactive/flexbox_interactive_flex-basis-transitions.html
+ parsing/flex-basis-computed.html
+ parsing/flex-basis-invalid.html
+ parsing/flex-basis-valid.html
+
+
+ Advisement: Authors are encouraged to control flexibility using the 'flex' shorthand
+ rather than with 'flex-basis' directly,
+ as the shorthand correctly resets any unspecified components
+ to accommodate common uses.
+
+ The 'flex-basis' property sets the flex basis.
+ It accepts the same values as the 'width' and 'height' property, plus ''content''.
+
+ For all values other than ''flex-basis/auto'' and ''content'' (defined above),
+ 'flex-basis' is resolved the same way as 'width' in horizontal writing modes [[!CSS2]],
+ except that if a value would resolve to ''width/auto'' for 'width',
+ it instead resolves to ''content'' for 'flex-basis'.
+ For example, percentage values of 'flex-basis' are resolved against
+ the flex item's containing block (i.e. its flex container);
+ and if that containing block's size is indefinite,
+ the used value for 'flex-basis' is ''content''.
+ As another corollary,
+ 'flex-basis' determines the size of the content box,
+ unless otherwise specified
+ such as by 'box-sizing' [[CSS3UI]].
+
+
+Alignment
+
+ After a flex container's contents have finished their flexing
+ and the dimensions of all flex items are finalized,
+ they can then be aligned within the flex container.
+
+ The 'margin' properties can be used to align items in a manner similar to, but more powerful than, what margins can do in block layout.
+ Flex items also respect the alignment properties from CSS Box Alignment,
+ which allow easy keyword-based alignment of items in both the main axis and cross axis.
+ These properties make many common types of alignment trivial,
+ including some things that were very difficult in CSS 2.1,
+ like horizontal and vertical centering.
+
+ Note: While the alignment properties are defined in CSS Box Alignment [[!CSS-ALIGN-3]],
+ Flexible Box Layout reproduces the definitions of the relevant ones here
+ so as to not create a normative dependency that may slow down advancement of the spec.
+ These properties apply only to flex layout
+ until CSS Box Alignment Level 3 is finished
+ and defines their effect for other layout modes.
+ Additionally, any new values defined in the Box Alignment module
+ will apply to Flexible Box Layout;
+ in other words, the Box Alignment module, once completed,
+ will supersede the definitions here.
+
+
+ baseline-outside-flex-item.html
+ fieldset-baseline-alignment.html
+
+
+
+
+
+
+ This section is non-normative.
+ The normative definition of how margins affect flex items is in the Flex Layout Algorithm section.
+
+ Auto margins on flex items have an effect very similar to auto margins in block flow:
+
+ * During calculations of flex bases and flexible lengths, auto margins are treated as ''0''.
+ * Prior to alignment via 'justify-content' and 'align-self',
+ any positive free space is distributed to auto margins in that dimension.
+ * Overflowing boxes ignore their auto margins and overflow in the end direction.
+
+
+ auto-height-column-with-border-and-padding.html
+ auto-height-with-flex.html
+ auto-margins-001.html
+ auto-margins-002.html
+ auto-margins-003.html
+ flexbox-margin-auto-horiz-001.xhtml
+ flexbox-margin-auto-horiz-002.xhtml
+ flexbox_margin-auto.html
+ flexbox_margin-auto-overflow.html
+ main-axis-margin-rounding.html
+
+
+ Note: If free space is distributed to auto margins,
+ the alignment properties will have no effect in that dimension
+ because the margins will have stolen all the free space
+ left over after flexing.
+
+
+ One use of ''margin/auto'' margins in the main axis is to separate flex items into distinct "groups".
+ The following example shows how to use this to reproduce a common UI pattern -
+ a single bar of actions with some aligned on the left and others aligned on the right.
+
+
+
+ Sample rendering of the code below.
+
+
+ The figure below illustrates the difference in cross-axis alignment in overflow situations between
+ using auto margins
+ and using the alignment properties.
+
+
+
+
+
+
About
+
Authoritarianism
+
Blog
+
+
+
+
+
About
+
Authoritarianism
+
Blog
+
+
+
+
+ The items in the figure on the left are centered with margins,
+ while those in the figure on the right are centered with 'align-self'.
+ If this column flex container was placed against the left edge of the page,
+ the margin behavior would be more desirable,
+ as the long item would be fully readable.
+ In other circumstances,
+ the true centering behavior might be better.
+
+
+
+
+
+ dynamic-isize-change-001.html
+ dynamic-isize-change-002.html
+ dynamic-isize-change-003.html
+ dynamic-isize-change-004.html
+ flexbox_justifycontent-center.html
+ flexbox_justifycontent-center-overflow.html
+ flexbox_justifycontent-end.html
+ flexbox_justifycontent-end-rtl.html
+ flexbox_justifycontent-flex-end.html
+ flexbox_justifycontent-flex-start.html
+ flexbox-justify-content-horiz-001a.xhtml
+ flexbox-justify-content-horiz-001b.xhtml
+ flexbox-justify-content-horiz-002.xhtml
+ flexbox-justify-content-horiz-003.xhtml
+ flexbox-justify-content-horiz-004.xhtml
+ flexbox-justify-content-horiz-005.xhtml
+ flexbox-justify-content-horiz-006.xhtml
+ flexbox_justifycontent-left-001.html
+ flexbox_justifycontent-left-002.html
+ flexbox_justifycontent-right-001.html
+ flexbox_justifycontent-right-002.html
+ flexbox_justifycontent-rtl-001.html
+ flexbox_justifycontent-rtl-002.html
+ flexbox_justifycontent-spacearound.html
+ flexbox_justifycontent-spacearound-negative.html
+ flexbox_justifycontent-spacearound-only.html
+ flexbox_justifycontent-spacebetween.html
+ flexbox_justifycontent-spacebetween-negative.html
+ flexbox_justifycontent-spacebetween-only.html
+ flexbox_justifycontent-start.html
+ flexbox_justifycontent-start-rtl.html
+ flexbox_justifycontent-stretch.html
+ flexbox-justify-content-vert-001a.xhtml
+ flexbox-justify-content-vert-001b.xhtml
+ flexbox-justify-content-vert-002.xhtml
+ flexbox-justify-content-vert-003.xhtml
+ flexbox-justify-content-vert-004.xhtml
+ flexbox-justify-content-vert-005.xhtml
+ flexbox-justify-content-vert-006.xhtml
+ flexbox-justify-content-wmvert-001.xhtml
+ flexbox-justify-content-wmvert-002.html
+ flexbox-justify-content-wmvert-003.html
+ flexbox_margin.html
+ flexbox_margin-left-ex.html
+ getcomputedstyle/flexbox_computedstyle_justify-content-center.html
+ getcomputedstyle/flexbox_computedstyle_justify-content-flex-end.html
+ getcomputedstyle/flexbox_computedstyle_justify-content-flex-start.html
+ getcomputedstyle/flexbox_computedstyle_justify-content-space-around.html
+ getcomputedstyle/flexbox_computedstyle_justify-content-space-between.html
+ justify-content-001.htm
+ justify-content-002.htm
+ justify-content-003.htm
+ justify-content-004.htm
+ justify-content-005.htm
+ justify-content-006.html
+ justify-content-007.html
+ justify-content_center.html
+ justify-content_flex-end.html
+ justify-content_flex-start.html
+ justify-content-sideways-001.html
+ justify-content_space-around.html
+ justify-content_space-between-001.html
+ justify-content_space-between-002.html
+ scrollbars-auto.html
+ scrollbars.html
+ scrollbars-no-margin.html
+ justify-content-rounding.html
+
+
+ The 'justify-content' property aligns flex items along the main axis of the current line of the flex container.
+ This is done after any flexible lengths and any auto margins have been resolved.
+ Typically it helps distribute extra free space leftover when either
+ all the flex items on a line are inflexible,
+ or are flexible but have reached their maximum size.
+ It also exerts some control over the alignment of items when they overflow the line.
+
+
+
flex-start
+
+ Flex items are packed toward the start of the line.
+ The main-start margin edge of the first flex item on the line
+ is placed flush with the main-start edge of the line,
+ and each subsequent flex item is placed flush with the preceding item.
+
+
+ flexbox_justifycontent-start.html
+ flexbox_justifycontent-start-rtl.html
+
+
+
flex-end
+
+ Flex items are packed toward the end of the line.
+ The main-end margin edge of the last flex item
+ is placed flush with the main-end edge of the line,
+ and each preceding flex item is placed flush with the subsequent item.
+
+
+ css-box-justify-content.html
+ flexbox_justifycontent-end.html
+ flexbox_justifycontent-end-rtl.html
+ flexbox_justifycontent-flex-end.html
+
+
+
center
+
+ Flex items are packed toward the center of the line.
+ The flex items on the line are placed flush with each other
+ and aligned in the center of the line,
+ with equal amounts of space between the main-start edge of the line and the first item on the line
+ and between the main-end edge of the line and the last item on the line.
+ (If the leftover free-space is negative,
+ the flex items will overflow equally in both directions.)
+
+
+ flexbox_justifycontent-center.html
+ flexbox_justifycontent-center-overflow.html
+
+
+
space-between
+
+ Flex items are evenly distributed in the line.
+ If the leftover free-space is negative
+ or there is only a single flex item on the line,
+ this value falls back to ''safe flex-start''.
+ Otherwise,
+ the main-start margin edge of the first flex item on the line
+ is placed flush with the main-start edge of the line,
+ the main-end margin edge of the last flex item on the line
+ is placed flush with the main-end edge of the line,
+ and the remaining flex items on the line are distributed
+ so that the spacing between any two adjacent items is the same.
+
+
+ flexbox_justifycontent-spacebetween.html
+ flexbox_justifycontent-spacebetween-negative.html
+ flexbox_justifycontent-spacebetween-only.html
+
+
+
space-around
+
+ Flex items are evenly distributed in the line,
+ with half-size spaces on either end.
+ If the leftover free-space is negative or
+ there is only a single flex item on the line,
+ this value falls back to ''safe center''.
+ Otherwise, the flex items on the line are distributed
+ such that the spacing between any two adjacent flex items on the line is the same,
+ and the spacing between the first/last flex items and the flex container edges
+ is half the size of the spacing between flex items.
+
+
+ flexbox-column-row-gap-001.html
+ flexbox-column-row-gap-002.html
+ flexbox-column-row-gap-003.html
+ flexbox-column-row-gap-004.html
+ flexbox_columns-flexitems-2.html
+ flexbox_columns-flexitems.html
+ flexbox_justifycontent-spacearound.html
+ flexbox_justifycontent-spacearound-negative.html
+ flexbox_justifycontent-spacearound-only.html
+
+
+
+
+
+
+
An illustration of the five 'justify-content' keywords and their effects on a flex container with three colored items.
+
+
+
+
+
+Cross-axis Alignment: the 'align-items' and 'align-self' properties
+ Name: align-self
+ Value: auto | flex-start | flex-end | center | baseline | stretch
+ Initial: auto
+ Applies to: flex items
+ Inherited: no
+ Computed value: specified keyword
+ Animation type: discrete
+
+
+
+ align-self-006.html
+ align-self-010.html
+ align-self-013.html
+ align-self-014.html
+ align-self-015.html
+ align-self-016.html
+ flexbox_align-self-auto.html
+ flexbox-align-self-baseline-compatability.html
+ flexbox-align-self-baseline-horiz-001a.xhtml
+ flexbox-align-self-baseline-horiz-001b.xhtml
+ flexbox-align-self-baseline-horiz-002.xhtml
+ flexbox-align-self-baseline-horiz-003.xhtml
+ flexbox-align-self-baseline-horiz-004.xhtml
+ flexbox-align-self-baseline-horiz-005.xhtml
+ flexbox-align-self-baseline-horiz-006.xhtml
+ flexbox-align-self-baseline-horiz-007.xhtml
+ flexbox-align-self-baseline-horiz-008.xhtml
+ flexbox_align-self-baseline.html
+ flexbox_align-self-center.html
+ flexbox_align-self-flexend.html
+ flexbox_align-self-flexstart.html
+ flexbox-align-self-horiz-001-block.xhtml
+ flexbox-align-self-horiz-001-table.xhtml
+ flexbox-align-self-horiz-002.xhtml
+ flexbox-align-self-horiz-003.xhtml
+ flexbox-align-self-horiz-004.xhtml
+ flexbox-align-self-horiz-005.xhtml
+ flexbox_align-self-stretch.html
+ flexbox-align-self-stretch-vert-001.html
+ flexbox-align-self-stretch-vert-002.html
+ flexbox-align-self-vert-001.xhtml
+ flexbox-align-self-vert-002.xhtml
+ flexbox-align-self-vert-003.xhtml
+ flexbox-align-self-vert-004.xhtml
+ flexbox-align-self-vert-rtl-001.xhtml
+ flexbox-align-self-vert-rtl-002.xhtml
+ flexbox-align-self-vert-rtl-003.xhtml
+ flexbox-align-self-vert-rtl-004.xhtml
+ flexbox-align-self-vert-rtl-005.xhtml
+ getcomputedstyle/flexbox_computedstyle_align-self-baseline.html
+ getcomputedstyle/flexbox_computedstyle_align-self-center.html
+ getcomputedstyle/flexbox_computedstyle_align-self-flex-end.html
+ getcomputedstyle/flexbox_computedstyle_align-self-flex-start.html
+ getcomputedstyle/flexbox_computedstyle_align-self-invalid.html
+ getcomputedstyle/flexbox_computedstyle_align-self-stretch.html
+
+
+ Flex items can be aligned in the cross axis of the current line of the flex container,
+ similar to 'justify-content' but in the perpendicular direction.
+ 'align-items' sets the default alignment for all of the flex container's items,
+ including anonymous flex items.
+ 'align-self' allows this default alignment to be overridden for individual flex items.
+ (For anonymous flex items,
+ 'align-self' always matches the value of 'align-items' on their associated flex container.)
+
+ If either of the flex item's cross-axis margins are auto,
+ 'align-self' has no effect.
+
+ Values have the following meanings:
+
+
+
auto
+
+ Defers cross-axis alignment control
+ to the value of 'align-items' on the parent box.
+ (This is the initial value of 'align-self'.)
+
+
+ align-self-007.html
+ align-self-008.html
+ align-self-009.html
+ align-self-011.html
+ align-self-012.html
+
+
+
flex-start
+
+ The cross-start margin edge of the flex item
+ is placed flush with the cross-start edge of the line.
+
+
+ align-items-002.htm
+ align-items-006.html
+ align-self-001.html
+
+
+
flex-end
+
+ The cross-end margin edge of the flex item
+ is placed flush with the cross-end edge of the line.
+
+
+ align-items-003.htm
+ align-self-002.html
+
+
+
center
+
+ The flex item’s margin box is centered in the cross axis within the line.
+ (If the cross size of the flex line is less than that of the flex item,
+ it will overflow equally in both directions.)
+
+
+ align-items-001.htm
+ align-self-003.html
+
+
+
baseline
+
+ The flex item participates in baseline alignment:
+ all participating flex items on the line
+ are aligned such that their baselines align,
+ and the item with the largest distance between its baseline and its cross-start margin edge
+ is placed flush against the cross-start edge of the line.
+ If the item does not have a baseline in the necessary axis,
+ then one is synthesized
+ from the flex item’s border box.
+
+
+ align-items-004.htm
+ align-baseline.html
+ dynamic-baseline-change.html
+ dynamic-baseline-change-nested.html
+
+
+
stretch
+
+ If the cross size property of the flex item computes to ''width/auto'',
+ and neither of the cross-axis margins are ''margin/auto'',
+ the flex item is stretched.
+ Its used value is the length necessary to make the cross size of the item's margin box as close to the same size as the line as possible,
+ while still respecting the constraints imposed by 'min-height'/'min-width'/'max-height'/'max-width'.
+
+ Note: If the flex container's height is constrained
+ this value may cause the contents of the flex item
+ to overflow the item.
+
+ The cross-start margin edge of the flex item
+ is placed flush with the cross-start edge of the line.
+
+
+ align-items-005.htm
+ align-self-004.html
+ align-self-005.html
+ css-flexbox-height-animation-stretch.html
+
+
+
+
+
+
An illustration of the five 'align-items' keywords and their effects on a flex container with four colored items.
+
+
+ The 'align-content' property aligns a flex container's lines within the flex container
+ when there is extra space in the cross-axis,
+ similar to how 'justify-content' aligns individual items within the main-axis.
+ Note, this property has no effect on a single-lineflex container.
+ Values have the following meanings:
+
+
+
flex-start
+
+ Lines are packed toward the start of the flex container.
+ The cross-start edge of the first line in the flex container
+ is placed flush with the cross-start edge of the flex container,
+ and each subsequent line is placed flush with the preceding line.
+
+
flex-end
+
+ Lines are packed toward the end of the flex container.
+ The cross-end edge of the last line
+ is placed flush with the cross-end edge of the flex container,
+ and each preceding line is placed flush with the subsequent line.
+
+
center
+
+ Lines are packed toward the center of the flex container.
+ The lines in the flex container are placed flush with each other
+ and aligned in the center of the flex container,
+ with equal amounts of space
+ between the cross-start content edge of the flex container
+ and the first line in the flex container,
+ and between the cross-end content edge of the flex container
+ and the last line in the flex container.
+ (If the leftover free-space is negative,
+ the lines will overflow equally in both directions.)
+
+
space-between
+
+ Lines are evenly distributed in the flex container.
+ If the leftover free-space is negative
+ or there is only a single flex line in the flex container,
+ this value falls back to ''safe flex-start''.
+ Otherwise,
+ the cross-start edge of the first line in the flex container
+ is placed flush with the cross-start content edge of the flex container,
+ the cross-end edge of the last line in the flex container
+ is placed flush with the cross-end content edge of the flex container,
+ and the remaining lines in the flex container are distributed
+ so that the spacing between any two adjacent lines is the same.
+
+
space-around
+
+ Lines are evenly distributed in the flex container,
+ with half-size spaces on either end.
+ If the leftover free-space is negative
+ this value falls back to ''safe center''.
+ Otherwise, the lines in the flex container are distributed
+ such that the spacing between any two adjacent lines is the same,
+ and the spacing between the first/last lines and the flex container edges
+ is half the size of the spacing between flex lines.
+
+
stretch
+
+ Lines stretch to take up the remaining space.
+ If the leftover free-space is negative,
+ this value falls back to ''align-content/flex-start''.
+ Otherwise,
+ the free-space is split equally between all of the lines,
+ increasing their cross size.
+
+
+ Note: Only multi-lineflex containers
+ ever have free space in the cross-axis for lines to be aligned in,
+ because in a single-line flex container
+ the sole line automatically stretches to fill the space.
+
+
+
+
+ An illustration of the 'align-content' keywords and their effects on a multi-line flex container.
+
+
+ In order for a flex container to itself participate in baseline alignment
+ (e.g. when the flex container is itself a flex item in an outer flex container),
+ it needs to submit the position of the baselines that will best represent its contents.
+ To this end,
+ the baselines of a flex container are determined as follows
+ (after reordering with 'order',
+ and taking 'flex-direction' into account):
+
+
+
+ When calculating the baseline according to the above rules,
+ if the box contributing a baseline has an 'overflow' value that allows scrolling,
+ the box must be treated as being in its initial scroll position
+ for the purpose of determining its baseline.
+
+ When determining the baseline of a table cell,
+ a flex container provides a baseline just as a line box or table-row does. [[!CSS2]]
+
+ See [[css-writing-modes-3#intro-baselines]]
+ and [[css-align-3#baseline-rules]]
+ for more information on baselines.
+
+
+ alignment/flex-align-baseline-001.html
+ alignment/flex-align-baseline-002.html
+ alignment/flex-align-baseline-003.html
+ alignment/flex-align-baseline-004.html
+ alignment/flex-align-baseline-005.html
+ alignment/flex-align-baseline-006.html
+ alignment/flex-align-baseline-007.html
+ alignment/flex-align-baseline-column-rtl-direction.html
+ alignment/flex-align-baseline-column-vert-lr-rtl-wrap-reverse.html
+ alignment/flex-align-baseline-column-vert-rl-rtl-wrap-reverse.html
+ alignment/flex-align-baseline-fieldset-001.html
+ alignment/flex-align-baseline-fieldset-002.html
+ alignment/flex-align-baseline-fieldset-003.html
+ alignment/flex-align-baseline-flex-001.html
+ alignment/flex-align-baseline-flex-002.html
+ alignment/flex-align-baseline-flex-003.html
+ alignment/flex-align-baseline-flex-004.html
+ alignment/flex-align-baseline-grid-001.html
+ alignment/flex-align-baseline-grid-002.html
+ alignment/flex-align-baseline-grid-003.html
+ alignment/flex-align-baseline-multicol-001.html
+ alignment/flex-align-baseline-multicol-002.html
+ alignment/flex-align-baseline-multicol-003.html
+ alignment/flex-align-baseline-overflow-001.html
+ alignment/flex-align-baseline-overflow-002.html
+ alignment/flex-align-baseline-overflow-003.html
+ alignment/flex-align-baseline-table-001.html
+ alignment/flex-align-baseline-table-002.html
+ alignment/flex-align-baseline-table-003.html
+ flexbox-baseline-align-self-baseline-horiz-001.html
+ flexbox-baseline-align-self-baseline-vert-001.html
+ flexbox-baseline-empty-001a.html
+ flexbox-baseline-empty-001b.html
+ flexbox-baseline-multi-item-horiz-001a.html
+ flexbox-baseline-multi-item-horiz-001b.html
+ flexbox-baseline-multi-item-vert-001a.html
+ flexbox-baseline-multi-item-vert-001b.html
+ flexbox-baseline-multi-line-horiz-001.html
+ flexbox-baseline-multi-line-horiz-002.html
+ flexbox-baseline-multi-line-horiz-003.html
+ flexbox-baseline-multi-line-horiz-004.html
+ flexbox-baseline-multi-line-vert-001.html
+ flexbox-baseline-multi-line-vert-002.html
+ flexbox-baseline-nested-001.html
+ flexbox-baseline-single-item-001a.html
+ flexbox-baseline-single-item-001b.html
+ flex-baseline-overflow-hidden.html
+ flex-order-last-baseline-multiple.html
+ flex-order-last-baseline.html
+ flex-order-wrap-reverse-baseline.html
+
+
+
+
+
+Flex Layout Algorithm
+
+ This section contains normative algorithms
+ detailing the exact layout behavior of a flex container and its contents.
+ The algorithms here are written to optimize readability and theoretical simplicity,
+ and may not necessarily be the most efficient.
+ Implementations may use whatever actual algorithms they wish,
+ but must produce the same results as the algorithms described here.
+
+ Note: This section is mainly intended for implementors.
+ Authors writing web pages should generally be served well by the individual property descriptions,
+ and do not need to read this section unless they have a deep-seated urge to understand arcane details of CSS layout.
+
+ The following sections define the algorithm for laying out a flex container and its contents.
+
+ Note: Flex layout works with the flex items in order-modified document order,
+ not their original document order.
+
+
+ flexbox-basic-block-horiz-001v.xhtml
+ flexbox-basic-block-horiz-001.xhtml
+ flexbox-basic-block-vert-001v.xhtml
+ flexbox-basic-block-vert-001.xhtml
+ flexbox-basic-canvas-horiz-001v.xhtml
+ flexbox-basic-canvas-horiz-001.xhtml
+ flexbox-basic-canvas-vert-001v.xhtml
+ flexbox-basic-canvas-vert-001.xhtml
+ flexbox-basic-fieldset-horiz-001.xhtml
+ flexbox-basic-fieldset-vert-001.xhtml
+ flexbox-basic-iframe-horiz-001.xhtml
+ flexbox-basic-iframe-vert-001.xhtml
+ flexbox-basic-img-horiz-001.xhtml
+ flexbox-basic-img-vert-001.xhtml
+ flexbox-basic-textarea-horiz-001.xhtml
+ flexbox-basic-textarea-vert-001.xhtml
+ flexbox-basic-video-horiz-001.xhtml
+ flexbox-basic-video-vert-001.xhtml
+ flexbox-dyn-resize-001.html
+ flexbox-mbp-horiz-001-rtl.xhtml
+ flexbox-mbp-horiz-001.xhtml
+ flexbox-mbp-horiz-002a.xhtml
+ flexbox-mbp-horiz-002b.xhtml
+ flexbox-mbp-horiz-002v.xhtml
+ flexbox-mbp-horiz-003-reverse.xhtml
+ flexbox-mbp-horiz-003v.xhtml
+ flexbox-mbp-horiz-003.xhtml
+ flexbox-mbp-horiz-004.xhtml
+ flexbox-sizing-horiz-001.xhtml
+ flexbox-sizing-horiz-002.xhtml
+ flexbox-sizing-vert-001.xhtml
+ flexbox-sizing-vert-002.xhtml
+ percentage-max-height-001.html
+ percentage-max-height-002.html
+ percentage-max-height-003.html
+ percentage-max-height-004.html
+ percentage-max-height-005.html
+ percent-height-flex-items-cross-sizes-with-mutations.html
+ table-as-item-auto-min-width.html
+ table-as-item-change-cell.html
+ table-as-item-fixed-min-width-2.html
+ table-as-item-fixed-min-width-3.html
+ table-as-item-fixed-min-width.html
+ table-as-item-narrow-content-2.html
+ table-as-item-narrow-content.html
+ table-as-item-specified-height.html
+ table-as-item-specified-width.html
+ table-as-item-specified-width-vertical.html
+ flex-rounding.html
+ relayout-intrinsic-block-size.html
+ shrinking-column-flexbox.html
+ total-min-max-violation-zero.html
+
+
+
+Initial Setup
+
+
+
+ Generate anonymous flex items
+ as described in [[#flex-items]].
+
+
+
+Line Length Determination
+
+
+
+ Determine the available main and cross space for the flex items.
+ For each dimension,
+ if that dimension of the flex container’s content box is a definite size, use that;
+ if that dimension of the flex container is being sized under a min or max-content constraint,
+ the available space in that dimension is that constraint;
+ otherwise, subtract the flex container’s margin, border, and padding
+ from the space available to the flex container in that dimension
+ and use that value.
+ This might result in an infinite value.
+
+
+ If the [=available space=] in the [=cross axis=] is [=definite=],
+ then additionally modify it based on 'flex-line-count'.
+
+
+
+ For example, the [=available space=] to a flex item
+ in a 'float|floated' [=width/auto=]-sized [=flex container=] is:
+
+ * the width of the [=flex container=] containing block
+ minus the [=flex container's=] margin, border, and padding
+ in the horizontal dimension
+ * infinite in the vertical dimension
+
+ If the used flex basis is ''content'' or depends on its available space,
+ and the flex container is being sized under a min-content or max-content constraint
+ (e.g. when performing automatic table layout [[!CSS2]]),
+ size the item under that constraint.
+ The flex base size is the item's resulting main size.
+
+
+ Otherwise,
+ if the used flex basis is ''content'' or depends on its available space,
+ the available main size is infinite,
+ and the flex item's inline axis is parallel to the main axis,
+ lay the item out using
+ the rules for a box in an orthogonal flow [[!CSS3-WRITING-MODES]].
+ The flex base size is the item's max-content main size.
+
+ Note: This case occurs, for example,
+ in an English document (horizontal writing mode)
+ containing a column flex container
+ containing a vertical Japanese (vertical writing mode) flex item.
+
+
+ Otherwise,
+ size the item into the available space
+ using its used flex basis in place of its main size,
+ treating a value of ''content'' as ''width/max-content''.
+ If a cross size is needed to determine the main size
+ (e.g. when the flex item’s main size is in its block axis,
+ or when it has a [=preferred aspect ratio=])
+ and the flex item’s cross size is ''auto'' and not definite,
+ in this calculation use ''width/fit-content'' as the flex item’s cross size.
+ The flex base size is the item's resulting main size.
+
+
+ css-flexbox-img-expand-evenly.html
+ fit-content-item-001.html
+ fit-content-item-002.html
+ fit-content-item-003.html
+ fit-content-item-004.html
+ flexbox-vert-lr-with-img.html
+ flex-container-max-content-001.html
+ flex-container-min-content-001.html
+ flex-height-min-content.html
+
+
+
+ When determining the flex base size,
+ the item’s min and max main sizes are ignored
+ (no clamping occurs).
+ Furthermore, the sizing calculations that floor the content box size at zero
+ when applying 'box-sizing' are also ignored.
+ (For example, an item with a specified size of zero,
+ positive padding, and ''box-sizing: border-box''
+ will have an outer flex base size of zero--
+ and hence a negative inner flex base size.)
+
+ The hypothetical main size is the item's flex base size
+ clamped according to its used min and max main sizes
+ (and flooring the content box size at zero).
+
+
+ text-as-flexitem-size-001.html
+
+
+
+ Determine the main size of the flex container
+ using the rules of the formatting context in which it participates.
+
+
+ The [=automatic block size=] of a [=block-level=] [=flex container=]
+ is its [=max-content size=].
+
+ The Block Layout spec should define this equivalency, but it doesn't exist yet.
+
Collect all the flex items into a single flex line.
+
+
If the flex container is [=multi-line=]
+ but not [=balancing=],
+
Starting from the first uncollected item,
+ collect consecutive items one by one
+ until the first time that the next collected item
+ would not fit into the flex container's [=inner size|inner=] main size
+ (or until a forced break is encountered,
+ see [[#pagination]]).
+ If the very first uncollected item wouldn't fit,
+ collect just it into the line.
+
+
+ For this step,
+ the size of a flex item is its [=outer size|outer=] hypothetical main size.
+ (Note: This can be negative.)
+
+
+ Repeat until all flex items have been collected into flex lines.
+
+
+ Note that the "collect as many" line will collect zero-sized flex items
+ onto the end of the previous line
+ even if the last non-zero item exactly "filled up" the line.
+
If the flex container is [=multi-line=] and [=balancing=],
+
+ First determine how many [=flex lines=] will be produced
+ by the non-balancing algorithm, above.
+ For this purpose,
+ floor the [=outer size|outer=] [=hypothetical main size=] of each [=flex item=]
+ at zero.
+ This can, if the items have large negative margins,
+ result in a higher line count than a non-balancing flexbox.
+ Let the |balancing line count|
+ be the larger of this line count
+ and the [=minimum flex line count=].
+
+ Then,
+ [=balance flex items=]
+ across |balancing line count| number of lines.
+
+ Determine the hypothetical cross size of each item
+ by performing layout as if it were an [=in-flow=] [=block-level box=]
+ with the used [=main size=] and the given available space,
+ treating auto as ''fit-content''.
+
+
+ canvas-contain-size.html
+ inline-flex-column-image-load.html
+
+
+
+ Collect all the flex items whose inline-axis is parallel to the main-axis,
+ whose 'align-self' is ''align-self/baseline'',
+ and whose cross-axis margins are both non-auto.
+ Find the largest of the distances between each item's baseline and its hypothetical outer cross-start edge,
+ and the largest of the distances between each item's baseline and its hypothetical outer cross-end edge,
+ and sum these two values.
+
+
+ Among all the items not collected by the previous step,
+ find the largest outer hypothetical cross size.
+
+
+ The used cross size of the flex line is the largest of the numbers found in the previous two steps and zero.
+
+ If the flex container is single-line,
+ then clamp the line's cross-size to be within
+ the container's computed min and max cross sizes.
+ Note that if CSS 2.1's definition of min/max-width/height applied more generally,
+ this behavior would fall out automatically.
+
+ Handle 'align-content: stretch'.
+ If the flex container has a definitecross size,
+ 'align-content' is stretch,
+ and the sum of the flex lines' cross sizes is less than the flex container's inner cross size,
+ increase the cross size of each flex line by equal amounts
+ such that the sum of their cross sizes exactly equals the flex container's inner cross size.
+
+
+ Collapse ''visibility:collapse'' items.
+ If any flex items have ''visibility: collapse'',
+ note the cross size of the line they're in as the item's |strut size|,
+ and restart layout from the beginning.
+
+ In this second layout round,
+ when collecting items into lines,
+ treat the collapsed items as having zero main size.
+ For the rest of the algorithm following that step,
+ ignore the collapsed items entirely
+ (as if they were ''display:none'')
+ except that after calculating the cross size of the lines,
+ if any line's cross size is less than
+ the largest strut size
+ among all the collapsed items in the line,
+ set its cross size to that strut size.
+
+ Skip this step in the second layout round.
+
+
+ flexbox-collapsed-item-baseline-001.html
+ flexbox-collapsed-item-horiz-001.html
+ flexbox-collapsed-item-horiz-002.html
+ flexbox-collapsed-item-horiz-003.html
+
+
+
+ Determine the used cross size of each flex item.
+ If a flex item's [=cross size=] depends on the available space
+ in the [=cross axis=],
+ recalculate its cross size using the [=flex line's=] [=cross size=]
+ (rather than the [=flex container's=]) as the available space.
+ Otherwise,
+ the used cross size is the item's hypothetical cross size.
+
+ If the flex item's [=cross size=] changed as a result,
+ redo layout for its contents,
+ treating this used size as its definite cross size
+ so that percentage-sized children can be resolved.
+
+
+ table-as-item-cross-size.html
+
+
+ Note: This step does not affect the main size of the flex item,
+ even if it has a [=preferred aspect ratio=].
+
+
+
+ flex-item-and-percentage-abspos.html
+
+
+
+Main-Axis Alignment
+
+
+
+ Distribute any remaining free space.
+ For each flex line:
+
+
+
+ If the remaining free space is positive
+ and at least one main-axis margin on this line is auto,
+ distribute the free space equally among these margins.
+ Otherwise, set all auto margins to zero.
+
+
+ Align the items along the main-axis per 'justify-content'.
+
+
+
+
+Cross-Axis Alignment
+
+
+
+ Resolve cross-axis auto margins.
+ If a flex item has auto cross-axis margins:
+
+
+
+ If its outer cross size
+ (treating those auto margins as zero)
+ is less than the cross size of its flex line,
+ distribute the difference in those sizes equally
+ to the auto margins.
+
+ Otherwise,
+ if the block-start or inline-start margin (whichever is in the cross axis)
+ is auto, set it to zero.
+ Set the opposite margin so that the outer cross size of the item
+ equals the cross size of its flex line.
+
+
+
+
+ Align all flex items along the cross-axis per 'align-self',
+ if neither of the item's cross-axis margins are auto.
+
+
+ Determine the flex container's used cross size
+ using the rules of the [=formatting context=] in which it participates.
+ If a content-based [=cross size=] is needed,
+ use the sum of the [=flex lines=]' [=cross sizes=].
+
+
+ Align all flex lines per 'align-content'.
+
+
+
+Balancing Flex Items
+
+
+
+ To balance flex items
+ for a [=flex container=]
+ across a number of [=flex lines=] |line count|,
+ divide its [=flex items=]
+ into exactly |line count| numbers of contiguous sequences,
+ under the following conditions:
+
+ * At least one [=flex item=] is assigned to each sequence.
+ * The sum of the [=flex item=] sizes
+ of all the [=flex items=] in the sequence
+ (the |line size|)
+ do not exceed the [=inner size|inner=] [=main size=] of the [=flex container=]
+ (unless it's a single overflowing item).
+ * If a [=flex item's=] size is zero,
+ the preceding sequence was not overflowing,
+ and it could be assigned either to the end of the preceding sequence
+ or the beginning of the next sequence,
+ it is assigned to the end of the preceding sequence.
+ Otherwise, it's assigned to the beginning of the next sequence.
+ * Calling the difference between the |line size|
+ and the [=flex container's=] [=inner size|inner=] [=main size=]
+ a sequence's |error|,
+ the sum of the squared |error| across all sequences
+ is minimized.
+
+ For the purpose of this algorithm,
+ a [=flex item's=] size
+ is its [=outer size|outer=] [=hypothetical main size=],
+ floored at 0.
+
+ If multiple possible sequence assignments
+ have equal minimum |error|,
+ select the sequence that assigns the most items to the first line;
+ if multiple sequences tie by that metric,
+ select the sequence among them that assigns the most items to the second line;
+ etc.
+
+ Assign each sequence of [=flex items=]
+ to the corresponding [=flex line=].
+
+
+ Note: Because all items have zero or positive size,
+ and thus adding an item to a line never increases the error,
+ there are efficient, nearly linear algorithms
+ to minimize the sum of squared error,
+ such as SMAWK algorithm.
+ (A naive minimization algo is O(n^2) in the number of items being balanced,
+ which is not usable in practice.)
+
+
+
+Resolving Flexible Lengths
+
+
+ To resolve the flexible lengths of the items within a flex line:
+
+
+
+ Determine the used flex factor.
+ Sum the outer hypothetical main sizes of all items on the line.
+ If the sum is less than the flex container's inner main size,
+ use the flex grow factor for the rest of this algorithm;
+ otherwise, use the flex shrink factor.
+
+
+ Each item in the flex line has a target main size,
+ initially set to its [=flex base size=].
+ Each item is initially unfrozen
+ and may become frozen.
+
+ Note: An item’s [=target main size=] doesn’t change after freezing.
+
+
+ Size inflexible items.
+ Freeze,
+ setting its [=target main size=]
+ to its hypothetical main size…
+
+ Calculate initial free space.
+ Sum the outer sizes of all items on the line,
+ and subtract this from the flex container's inner main size.
+ For frozen items, use their outer target main size;
+ for other items, use their outer flex base size.
+
+
+ Loop:
+
+
+
+ Check for flexible items.
+ If all the flex items on the line are frozen, exit this loop.
+
+
+ Calculate the remaining free space
+ as for initial free space, above.
+ If the sum of the unfrozen flex items’ flex factors is less than one,
+ multiply the initial free space by this sum.
+ If the magnitude of this value is less than the magnitude of the remaining free space,
+ use this as the remaining free space.
+
+
+ If the [=remaining free space=] is non-zero,
+ distribute it proportional to the flex factors:
+
+
+ For every unfrozen item on the line,
+ find the ratio of the item's flex grow factor
+ to the sum of the flex grow factors of all unfrozen items on the line.
+ Set the item's target main size to its flex base size
+ plus a fraction of the remaining free space proportional to the ratio.
+
+
+ For every unfrozen item on the line,
+ multiply its flex shrink factor by its inner flex base size,
+ and note this as its scaled flex shrink factor.
+ Find the ratio of the item's scaled flex shrink factor
+ to the sum of the scaled flex shrink factors of all unfrozen items on the line.
+ Set the item's target main size to its flex base size
+ minus a fraction of the absolute value of the remaining free space proportional to the ratio.
+ Note this may result in a negative inner main size;
+ it will be corrected in the next step.
+
+
+
+ Fix min/max violations.
+ Clamp each non-frozen item's target main size by
+ its used min and max main sizes
+ and floor its content-box size at zero.
+ If the item's target main size was made smaller by this,
+ it's a max violation.
+ If the item's target main size was made larger by this,
+ it's a min violation.
+
+
+ Freeze over-flexed items.
+ The total violation is the sum of the adjustments from the previous step
+ ∑(clamped size - unclamped size).
+ If the total violation is:
+
+
+
Zero
+
+ Freeze all items.
+
+
Positive
+
+ Freeze all the items with min violations.
+
+
Negative
+
+ Freeze all the items with max violations.
+
+
+ Note: This freezes at least one item,
+ ensuring that the loop makes progress and eventually terminates.
+
+
+
+ Although CSS Sizing [[!CSS-SIZING-3]] defines definite and indefinite lengths,
+ Flexbox has several additional cases where a length can be considered definite:
+
+ 1. If the [=flex container=] has a [=definite=] [=main size=],
+ then the post-flexing [=main sizes=]
+ of its [=flex items=]
+ are treated as [=definite=].
+
+ 2. If a [=flex item’s=] [=flex basis=] is [=definite=],
+ then its post-flexing [=main size=] is also [=definite=].
+
+ 3. If a single-lineflex container has a definite cross size,
+ the [=automatic size|automatic=] [=preferred size|preferred=] [=outer size|outer=] [=cross size=]
+ of any stretchedflex items
+ is the flex container's inner cross size
+ (clamped to the flex item’s min and max cross size)
+ and is considered definite.
+
+ 4. Once the cross size of a flex line has been determined,
+ the cross sizes of items in auto-sized flex containers
+ are also considered definite for the purpose of layout;
+ see step 11.
+
+
+ flexbox-definite-cross-size-constrained-percentage.html
+ flexbox-definite-sizes-001.html
+ flexbox-definite-sizes-002.html
+ flexbox-definite-sizes-003.html
+ flexbox-definite-sizes-004.html
+ flexbox-definite-sizes-005.html
+ flexbox-definite-sizes-006.html
+ height-percentage-with-dynamic-container-size.html
+ percentage-widths-001.html
+ position-fixed-001.html
+ stretch-obeys-min-max-001.html
+ stretch-obeys-min-max-002.html
+ stretch-obeys-min-max-003.html
+
+
+ Note: This means that within [=flex layout=],
+ “definite” sizes can require performing layout.
+ This was done to allow percentages inside of [=flex items=]
+ to resolve where authors expected them to resolve.
+
+
+
+
+
+Intrinsic Sizes
+
+ The intrinsic sizing of a flex container is used
+ to produce various types of content-based automatic sizing,
+ such as shrink-to-fit logical widths (which use the ''fit-content'' formula)
+ and content-based logical heights (which use the max-content size).
+ For these computations, auto margins on flex items are treated as ''0''.
+
+ See [[!CSS-SIZING-3]] for a definition of the terms in this section.
+
+
+ flexbox-gap-position-absolute.html
+ gap-001-lr.html
+ gap-001-ltr.html
+ gap-001-rl.html
+ gap-001-rtl.html
+ gap-002-lr.html
+ gap-002-ltr.html
+ gap-002-rl.html
+ gap-002-rtl.html
+ gap-003-lr.html
+ gap-003-ltr.html
+ gap-003-rl.html
+ gap-003-rtl.html
+ gap-004-lr.html
+ gap-004-ltr.html
+ gap-004-rl.html
+ gap-004-rtl.html
+ gap-005-lr.html
+ gap-005-ltr.html
+ gap-005-rl.html
+ gap-005-rtl.html
+ gap-006-lr.html
+ gap-006-ltr.html
+ gap-006-rl.html
+ gap-006-rtl.html
+ gap-007-lr.html
+ gap-007-ltr.html
+ gap-007-rl.html
+ gap-007-rtl.html
+ gap-008-ltr.html
+ gap-009-ltr.html
+ gap-010-ltr.html
+ gap-011.html
+ gap-012.html
+ gap-013.html
+ gap-014.html
+ gap-015.html
+ gap-016.html
+ gap-017.html
+ gap-018.html
+ gap-019.html
+ gap-020.html
+ gap-021.html
+ intrinsic-size/auto-min-size-001.html
+ intrinsic-size/col-wrap-001.html
+ intrinsic-size/col-wrap-002.html
+ intrinsic-size/col-wrap-003.html
+ intrinsic-size/col-wrap-004.html
+ intrinsic-size/col-wrap-005.html
+ intrinsic-size/col-wrap-006.html
+ intrinsic-size/col-wrap-007.html
+ intrinsic-size/col-wrap-008.html
+ intrinsic-size/col-wrap-009.html
+ intrinsic-size/col-wrap-010.html
+ intrinsic-size/col-wrap-011.html
+ intrinsic-size/col-wrap-012.html
+ intrinsic-size/col-wrap-013.html
+ intrinsic-size/col-wrap-014.html
+ intrinsic-size/col-wrap-015.html
+ intrinsic-size/col-wrap-016.html
+ intrinsic-size/col-wrap-017.html
+ intrinsic-size/col-wrap-018.html
+ intrinsic-size/col-wrap-019.html
+ intrinsic-size/col-wrap-020.html
+ intrinsic-size/col-wrap-crash.html
+ intrinsic-size/row-001.html
+ intrinsic-size/row-002.html
+ intrinsic-size/row-003.html
+ intrinsic-size/row-004.html
+ intrinsic-size/row-005.html
+ intrinsic-size/row-006.html
+ intrinsic-size/row-007.html
+ intrinsic-size/row-008.html
+ intrinsic-size/row-compat-001.html
+ intrinsic-size/row-use-cases-001.html
+ intrinsic-size/row-wrap-001.html
+ multiline-shrink-to-fit.html
+ svg-no-natural-size-grandchild.html
+
+
+
+Flex Container Intrinsic Main Sizes
+
+ The max-contentmain size of a flex container
+ is, theoretically, the smallest size the flex container can take
+ such that when flex layout is run with that container size,
+ each [=flex item=] ends up at least as large as
+ its [[#intrinsic-item-contributions|max-content contribution]],
+ to the extent allowed by the items’ flexibility.
+
+ The [=min-content=] [=main size=] of a flex container
+ is, theoretically, the smallest size the [=flex container=] can take
+ such that no items overflow it,
+ and no item's contents overflow the item--
+ setting aside the cases in which the boxes layouts are defined to overflow
+ (for example with negative margins or percentage sizes that add up to more than 100%).
+
+
+ flex-container-max-content-001.html
+ flex-container-min-content-001.html
+
+
+ For the min-content size of a multi-line flex container,
+ see [[#intrinsic-main-sizes-multiline]].
+ For max-content sizes and for single-line min-content sizes,
+ an implementation is conformant to CSS Flexible Box Layout
+ if it conforms to either the Ideal Algorithm or the Web-compatible Algorithm,
+ as defined below.
+
+
+Ideal Algorithm: Max-content Size and Min-content Single-line Size
+
+ Note: The following algorithm calculates the [=flex container=]’s ideal
+ intrinsic [=main sizes=].
+ However, because it was not implemented correctly initially,
+ and existing content became dependent on the (unfortunately consistent) incorrect implemented behavior,
+ it is not Web-compatible.
+ Implementers and the CSS Working Group are investigating to what extent
+ Web browser implementations can safely approach this behavior,
+ and further experimentation is welcome.
+
+ Considering only non-[=collapsed=] [=flex items=];
+
+
+
+ For each flex item,
+ subtract its outer flex base size from its [[#intrinsic-item-contributions|max-content contribution]] size.
+ If that result is positive,
+ divide it by the item's flex grow factor
+ if the flex grow factor is ≥ 1,
+ or multiply it by the flex grow factor
+ if the flex grow factor is < 1;
+ if the result is negative,
+ divide it by the item's scaled flex shrink factor
+ (if dividing by zero, treat the result as negative infinity).
+ This is the item's desired flex fraction.
+
+
+ Place all flex items into lines of infinite length.
+ Within each line,
+ find the greatest (most positive)
+ desired flex fraction
+ among all the flex items.
+ This is the line’s chosen flex fraction.
+
+
+ If the chosen flex fraction is positive,
+ and the sum of the line’s flex grow factors
+ is less than 1,
+ divide the chosen flex fraction by that sum.
+
+ If the chosen flex fraction is negative,
+ and the sum of the line’s flex shrink factors
+ is less than 1,
+ multiply the chosen flex fraction by that sum.
+
+
+ The flex container’s max-content size is
+ the largest sum (among all the lines)
+ of the afore-calculated sizes of all items within a single line.
+
+
+ The min-contentmain size of a single-line flex container
+ is calculated identically to the max-contentmain size,
+ except that the flex items’ [[#intrinsic-item-contributions|min-content contributions]] are used
+ instead of their [[#intrinsic-item-contributions|max-content contributions]].
+
+
+ Implications of this algorithm when the sum of flex is less than 1
+
+ The above algorithm is designed to give the correct behavior for two cases in particular,
+ and make the flex container’s size continuous as you transition between the two:
+
+ 1. If all items are inflexible,
+ the flex container is sized to the sum of their flex base size.
+ (An inflexible flex base size basically substitutes for a 'width'/'height',
+ which, when specified, is what a max-content contribution is based on in Block Layout.)
+
+ 2. When all items are flexible with flex factors ≥ 1,
+ the flex container is sized to the sum of the max-content contributions of its items
+ (or perhaps a slightly larger size,
+ so that every flex item is at least the size of its max-content contribution,
+ but also has the correct ratio of its size to the size of the other items,
+ as determined by its flexibility).
+
+ For example, if a flex container has a single flex item
+ with ''flex-basis: 100px;'' but a max-content size of ''200px'',
+ then when the item is ''flex-grow: 0'', the flex container (and flex item) is ''100px'' wide,
+ but when the item is ''flex-grow: 1'' or higher, the flex container (and flex item) is ''200px'' wide.
+
+ There are several possible ways to make the overall behavior continuous between these two cases,
+ but all of them have drawbacks.
+ We chose one we feel has the least bad implications;
+ unfortunately, it "double-applies" the flexibility in cases with [=flex factors=] that are < 1.
+ In the above example, if the item has ''flex-grow: .5'',
+ then the flex container ends up ''150px'' wide,
+ but the item then sizes normally into that available space,
+ ending up ''125px'' wide.
+
+
+ Even more involved notes on the specific behavior chosen
+
+ Principles:
+
+ 1. Don't explode any sizes, whether growing or shrinking, as inputs approach zero.
+ 2. When flex factors are all >=1, return the minimum size necessary for every item to be >= max-content size.
+ 3. Items with a zero flex shouldn't affect the sizes at all.
+ 4. Keep it continuous over variance of flex factors and item sizes.
+ 5. Keep sizing variance as linear as possible with respect to linear changes to any input variable (size, flex factor).
+ 6. When the sum of flex factors is >=1, return the minimum size necessary for every item to be >= max-content size.
+
+ To get these all to work together,
+ we have to apply some correction when either flex factors
+ or the sum of flex factors on a line
+ is < 1.
+
+ For shrink our behavior is somewhat easier;
+ since the explosive case of 0 shrink
+ results in a negative infinity desired fraction
+ which we'll never choose (since we always take the largest),
+ we can just apply the correction at the line level,
+ giving us double-application only when the sum is < 1.
+
+ For positives it's more complicated.
+ 0 grow naively explodes into *positive* infinity,
+ which we'd choose,
+ so we need to apply the correction at the individual item level.
+ We do that by multiplying the space by the factor when factor is <1.
+ Leaving it at that would result in a double-application for items < 1
+ but sum >= 1,
+ but a *triple*-application when the sum is < 1.
+ To avoid *that* ridiculousness,
+ we apply a *reverse* correction when the sum is 1,
+ dividing by the sum instead.
+ This leaves us with a double correction in all cases for items with factors < 1.
+
+ We can't eliminate the double-applications entirely
+ without giving up other, more important principles
+ (in particular, principle 3 --
+ try to come up with rules that don't double-apply
+ when you have two items with ''flex-grow: .5'',
+ but also don't give a ''flex-grow: 0'' item any power
+ over a ''flex-grow: 1'' sibling;
+ you can't, as far as we can tell.)
+
+
+
+
+Web-compatible Intrinsic Sizing Algorithm: Max-content Size and Min-content Single-line Size
+
+ Note: The following algorithm has been demonstrated to be Web-compatible.
+ It may be altered in the future to bring it closer to the ideal algorithm above,
+ if possible.
+
+ * For the [=max-content size=] of a [=flex container=],
+ take the sum of the [[#intrinsic-item-contributions|max-content contributions]]
+ of all the non-[=collapsed=] flex items in the flex container.
+ * For the [=min-content size=] of a single-line container,
+ take the sum of the [[#intrinsic-item-contributions|min-content contributions]]
+ of all the non-[=collapsed=] flex items in the flex container.
+
+
+
+Multi-line Min-content Algorithm
+
+ For a multi-line container,
+ the [=min-content=] [=main size=] is simply the largest [[#intrinsic-item-contributions|min-content contribution]]
+ of all the non-[=collapsed=] flex items in the flex container.
+
+
+Flex Container Intrinsic Cross Sizes
+
+ The min-content/max-contentcross size of a single-lineflex container
+ is the largest min-content contribution/max-content contribution (respectively)
+ of its flex items.
+
+ For a multi-lineflex container,
+ the behavior depends on whether it's a row or column flexbox:
+
+ : ''flex-direction/row'' [=multi-line=] [=flex container=] [=cross size=]
+ :: The min-content/max-contentcross size
+ is the sum of the flex line cross sizes
+ resulting from sizing the flex container
+ under a cross-axismin-content constraint/max-content constraint (respectively).
+
+ : ''flex-direction/column'' [=multi-line=] [=flex container=] [=cross size=]
+ :: The [=min-content=] [=cross size=]
+ is the largest [=min-content contribution=] among all of its [=flex items=].
+
+ Note: This heuristic effectively assumes a single flex line,
+ in order to guarantee that the [=min-content size=]
+ is smaller than the [=max-content size=].
+ If the flex container has a height constraint,
+ this will result in overflow,
+ but if the [=flex container=] is also a [=scroll container=],
+ it will at least be large enough to fit
+ any given column entirely within its [=scrollport=].
+
+ The [=max-content=] [=cross size=] is the sum of the [=flex line=] cross sizes
+ resulting from sizing the [=flex container=]
+ under a cross-axismax-content constraint,
+ using the largest max-content cross-size contribution among the flex items
+ as the available space in the cross axis
+ for each of the flex items during layout.
+
+ Note: This heuristic gives a reasonable approximation
+ of the size that the flex container should be,
+ with each [=flex item=] laid out at its [=max-content contribution=] or larger,
+ and each flex line no larger than its largest flex item.
+ It's not a perfect fit in some cases,
+ but doing it completely correct is insanely expensive,
+ and this works reasonably well.
+
+
+ flexbox_width-change-and-relayout-children.html
+ table-as-flex-item-max-content.html
+ table-as-item-flex-cross-size.html
+
+
+
+
+Flex Item Intrinsic Size Contributions
+
+ The main-size min-content contribution of a flex item
+ is the larger of its outermin-content size
+ and outer preferred size
+ if that is not an [=automatic size=].
+
+ The main-size max-content contribution of a flex item
+ is the larger of its outermax-content size
+ and outer preferred size
+ if that is not an [=automatic size=].
+
+ For this purpose,
+ each contribution
+ is capped by the item’s [=flex base size=] if the item is not growable,
+ floored by the item’s [=flex base size=] if the item is not shrinkable,
+ and then further clamped by the item's min/max main size.
+
+
+
+
+Fragmenting Flex Layout
+
+
+ Flex containers can break across pages
+ between items,
+ between lines of items (in multi-line mode),
+ and inside items.
+ The break-* properties apply to flex containers as normal for block-level or inline-level boxes.
+ This section defines how they apply to flex items
+ and the contents of flex items.
+ See the CSS Fragmentation Module
+ for more context [[!CSS3-BREAK]].
+
+
+ The following breaking rules refer to the fragmentation container as the “page”.
+ The same rules apply in any other fragmentation context.
+ (Substitute “page” with the appropriate fragmentation container type as needed.)
+ For readability, in this section the terms "row" and "column" refer to the relative orientation
+ of the flex container with respect to the block flow direction of the fragmentation context,
+ rather than to that of the flex container itself.
+
+
+ The exact layout of a fragmented flex container
+ is not defined in this level of Flexible Box Layout.
+ However, breaks inside a flex container are subject to the following rules
+ (interpreted using order-modified document order):
+
+
+
+ In a row flex container,
+ the 'break-before' and 'break-after' values on flex items
+ are propagated to the flex line.
+ The 'break-before' values on the first line
+ and the 'break-after' values on the last line
+ are propagated to the flex container.
+
+ Note: Break propagation
+ (like 'text-decoration' propagation)
+ does not affect computed values.
+
+
+ In a column flex container,
+ the 'break-before' values on the first item
+ and the 'break-after' values on the last item
+ are propagated to the flex container.
+ Forced breaks on other items are applied to the item itself.
+
+
+ A forced break inside a flex item effectively increases the size of its contents;
+ it does not trigger a forced break inside sibling items.
+
+
+ In a row flex container,
+ Class A break opportunities occur between sibling flex lines,
+ and Class C break opportunities occur between the first/last flex line and the flex container's content edges.
+ In a column flex container,
+ Class A break opportunities occur between sibling flex items,
+ and Class C break opportunities occur between the first/last flex items on a line and the flex container's content edges.
+ [[!CSS3-BREAK]]
+
+
+ When a flex container is continued after a break,
+ the space available to its flex items
+ (in the block flow direction of the fragmentation context)
+ is reduced by the space consumed by flex container fragments on previous pages.
+ The space consumed by a flex container fragment is
+ the size of its content box on that page.
+ If as a result of this adjustment the available space becomes negative,
+ it is set to zero.
+
+
+ If the first fragment of the flex container is not at the top of the page,
+ and none of its flex items fit in the remaining space on the page,
+ the entire fragment is moved to the next page.
+
+
+ When breaking a multi-line column flex container,
+ the UA may organize each fragment into its own “stack” of flex lines--
+ just like each fragment of a multi-column container
+ has its own row of column boxes--
+ in order to ensure that content presented on earlier pages
+ corresponds to content earlier in the box order.
+
+
+ Aside from the rearrangement of items imposed by the previous point,
+ UAs should attempt to minimize distortion of the flex container
+ with respect to unfragmented flow.
+
+ This informative section presents a possible fragmentation algorithm for flex containers.
+ Implementors are encouraged to improve on this algorithm and provide feedback to the CSS Working Group.
+
+
+
+
+ This algorithm assumes that pagination always proceeds only in the forward direction;
+ therefore, in the algorithms below, alignment is mostly ignored prior to pagination.
+ Advanced layout engines may be able to honor alignment across fragments.
+
+
+ Run the flex layout algorithm (without regards to pagination)
+ through Cross Sizing Determination.
+
+
+ Lay out as many consecutive flex items or item fragments as possible
+ (but at least one or a fragment thereof),
+ starting from the first,
+ until there is no more room on the page
+ or a forced break is encountered.
+
+
+ If the previous step ran out of room
+ and the free space is positive,
+ the UA may reduce the distributed free space on this page
+ (down to, but not past, zero)
+ in order to make room for the next unbreakable flex item or fragment.
+ Otherwise,
+ the item or fragment that does not fit is pushed to the next page.
+ The UA should pull up if more than 50% of the fragment would have fit in the remaining space
+ and should push otherwise.
+
+
+ If there are any flex items or fragments not laid out by the previous steps,
+ rerun the flex layout algorithm
+ from Line Length Determination
+ through Cross Sizing Determination
+ with the next page's size
+ and all the contents (including those already laid out),
+ and return to the previous step,
+ but starting from the first item or fragment not already laid out.
+
+
+ For each fragment of the flex container,
+ continue the flex layout algorithm
+ from Main-Axis Alignment
+ to its finish.
+
+
+
+ It is the intent of this algorithm that column-direction single-line flex containers
+ paginate very similarly to block flow.
+ As a test of the intent,
+ a flex container with ''justify-content:start''
+ and no flexible items
+ should paginate identically to
+ a block with in-flow children with same content,
+ same used size and same used margins.
+
+
+ Run the flex layout algorithm
+ with regards to pagination
+ (limiting the flex container's maximum line length to the space left on the page)
+ through Cross Sizing Determination.
+
+
+ Lay out as many flex lines as possible
+ (but at least one)
+ until there is no more room in the flex container
+ in the cross dimension
+ or a forced break is encountered:
+
+
+
+ Lay out as many consecutive flex items as possible
+ (but at least one),
+ starting from the first,
+ until there is no more room on the page
+ or a forced break is encountered.
+ Forced breaks within flex items are ignored.
+
+
+ If this is the first flex container fragment,
+ this line contains only a single flex item
+ that is larger than the space left on the page,
+ and the flex container is not at the top of the page already,
+ move the flex container to the next page
+ and restart flex container layout entirely.
+
+
+ If there are any flex items not laid out by the first step,
+ rerun the flex layout algorithm
+ from Main Sizing Determination
+ through Cross Sizing Determination
+ using only the items not laid out on a previous line,
+ and return to the previous step,
+ starting from the first item not already laid out.
+
+
+
+ If there are any flex items not laid out by the previous step,
+ rerun the flex layout algorithm
+ from Line Sizing Determination
+ through Cross Sizing Determination
+ with the next page's size
+ and only the items not already laid out,
+ and return to the previous step,
+ but starting from the first item not already laid out.
+
+
+ For each fragment of the flex container,
+ continue the flex layout algorithm
+ from Main-Axis Alignment
+ to its finish.
+
+
+
+ A shortcoming of this sample algorithm is that
+ if a flex item does not entirely fit on a single page,
+ it will not be paginated in multi-line column flex containers.
+
+
+ Run the entire flex layout algorithm (without regards to pagination),
+ except treat any 'align-self' other than ''align-self/flex-start'' or ''baseline''
+ as ''align-self/flex-start''.
+
+
+ If an unbreakable item doesn't fit within the space left on the page,
+ and the flex container is not at the top of the page,
+ move the flex container to the next page
+ and restart flex container layout entirely.
+
+
+ For each item,
+ lay out as much of its contents as will fit in the space left on the page,
+ and fragment the remaining content onto the next page,
+ rerunning the flex layout algorithm
+ from Line Length Determination
+ through Main-Axis Alignment
+ into the new page size
+ using all the contents (including items completed on previous pages).
+
+
+ Any flex items that fit entirely into previous fragments
+ still take up space in the main axis in later fragments.
+
+
+ For each fragment of the flex container,
+ rerun the flex layout algorithm
+ from Cross-Axis Alignment
+ to its finish.
+ For all fragments besides the first,
+ treat 'align-self' and 'align-content' as being ''align-self/flex-start'' for all item fragments and lines.
+
+
+ If any item,
+ when aligned according to its original 'align-self' value
+ into the combined cross size of all the flex container fragments,
+ would fit entirely within a single flex container fragment,
+ it may be shifted into that fragment
+ and aligned appropriately.
+
+ Run the flex layout algorithm (without regards to pagination),
+ through Cross Sizing Determination.
+
+
+ Lay out as many flex lines as possible
+ (but at least one),
+ starting from the first,
+ until there is no more room on the page
+ or a forced break is encountered.
+
+
+ If a line doesn't fit on the page,
+ and the line is not at the top of the page,
+ move the line to the next page
+ and restart the flex layout algorithm entirely,
+ using only the items in and following this line.
+
+
+ If a flex item itself causes a forced break,
+ rerun the flex layout algorithm
+ from Main Sizing Determination
+ through Main-Axis Alignment,
+ using only the items on this and following lines,
+ but with the item causing the break automatically starting a new line
+ in the line breaking step,
+ then continue with this step.
+ Forced breaks within flex items are ignored.
+
+
+ If there are any flex items not laid out by the previous step,
+ rerun the flex layout algorithm
+ from Line Length Determination
+ through Main-Axis Alignment
+ with the next page's size
+ and only the items not already laid out.
+ Return to the previous step,
+ but starting from the first line not already laid out.
+
+
+ For each fragment of the flex container,
+ continue the flex layout algorithm
+ from Cross Axis Alignment
+ to its finish.
+
+
+
+
+
+Appendix A: Axis Mappings
+
+ This appendix is non-normative.
+
+
+
Axis Mappings for ''ltr'' + ''horizontal-tb'' Writing Mode (e.g. English)
+
+ This appendix is normative.
+
+ Advisement: These aliases are deprecated
+ and authors should not use them
+ unless their content needs to support actively-used legacy UAs.
+
+ For compatibility with general Web content,
+ UAs that are Web browsers must and other UAs may
+ implement the following [=legacy name aliases=]:
+
+
+
+No new privacy considerations have been reported on this specification.
+
+
Security Considerations
-...
+No new security considerations have been reported on this specification.
-
+
+ animation/order-interpolation.html
+ flexbox-anonymous-items-001.html
+ flexbox_order-abspos-space-around.html
+ flexbox_order-box.html
+ flexbox-order-from-lowest.html
+ flexbox_order.html
+ flexbox_order-noninteger-invalid.html
+ flexbox-order-only-flexitems.html
+ flexible-order.html
+ flex-item-z-ordering-001.html
+ flex-item-z-ordering-002.html
+ flex-order.html
+ getcomputedstyle/flexbox_computedstyle_order.html
+ getcomputedstyle/flexbox_computedstyle_order-inherit.html
+ getcomputedstyle/flexbox_computedstyle_order-integer.html
+ getcomputedstyle/flexbox_computedstyle_order-invalid.html
+ getcomputedstyle/flexbox_computedstyle_order-negative.html
+ order-001.htm
+ order/order-abs-children-painting-order-different-container.html
+ order/order-abs-children-painting-order.html
+ order/order-with-column-reverse.html
+ order/order-with-row-reverse.html
+ order-painting.html
+ order_value.html
+ parsing/order-computed.html
+ parsing/order-invalid.html
+ parsing/order-valid.html
+
- TODO fill in the details of how balancing works.
+
+ break-nested-float-in-flex-item-001-print.html
+ break-nested-float-in-flex-item-002-print.html
+ flexbox-break-request-horiz-001a.html
+ flexbox-break-request-horiz-001b.html
+ flexbox-break-request-horiz-002a.html
+ flexbox-break-request-horiz-002b.html
+ flexbox-break-request-vert-001a.html
+ flexbox-break-request-vert-001b.html
+ flexbox-break-request-vert-002a.html
+ flexbox-break-request-vert-002b.html
+ inline-flexbox-vertical-rl-image-flexitem-crash-print.html
+
- In short, do flex layout up to the linebreaking part.
- Linebreak as normal
- (but with the floor-at-0 thing, below)
- to discover how many lines are needed;
- if 'flex-line-count' is higher
- (and there are at least that many flex items),
- use that line count instead.
+
+ contain-size-layout-abspos-flex-container-crash.html
+ frame-flex-item-crash.html
+ frameset-crash.html
+ grandchild-span-height.html
+ min-height-min-content-crash.html
+ mixed-containing-blocks-crash.html
+ negative-available-size-crash.html
+ negative-flex-margins-crash.html
+ negative-flex-rounding-crash.html
+ negative-item-margins-002-crash.html
+ negative-item-margins-crash.html
+ orthogonal-flex-item-crash.html
+ position-absolute-scrollbar-freeze.html
+ position-relative-with-scrollable-with-abspos-crash.html
+ relayout-input.html
+ remove-out-of-flow-child-crash.html
+ zero-content-size-with-scrollbar-crash.html
+
- Then do balanced line-breaking,
- using a well-known algorithm I forget the name of right this moment.
+
+ fixed-table-layout-with-percentage-width-in-flex-item.html
+ percentage-size-quirks.html
+ percentage-size-quirks-002.html
+ percentage-size-quirks-003.html
+ percentage-size-quirks-004.html
+ percentage-size-quirks-005.html
+ quirks-auto-block-size-with-percentage-item.html
+
- For the purpose of the balancing algorithm,
- hypothetical sizes are floored at 0,
- so it can be done efficiently.
- (Negative margins can make the hypothetical size negative,
- which does affect line-breaking.)
-
\ No newline at end of file
+
+ percentage-padding-001.html
+ percentage-padding-002.html
+ percentage-padding-003.html
+ percentage-padding-004.html
+ percentage-padding-005.html
+
diff --git a/css-flexbox-2/examples/flex-item-determination.html b/css-flexbox-2/examples/flex-item-determination.html
new file mode 100644
index 000000000000..49233d0b832d
--- /dev/null
+++ b/css-flexbox-2/examples/flex-item-determination.html
@@ -0,0 +1,39 @@
+
+
+
+
+
diff --git a/css-flexbox-2/images/OK.png b/css-flexbox-2/images/OK.png
new file mode 100644
index 000000000000..0b7577eab59c
Binary files /dev/null and b/css-flexbox-2/images/OK.png differ
diff --git a/css-flexbox-2/images/align-content-example.svg b/css-flexbox-2/images/align-content-example.svg
new file mode 100644
index 000000000000..fcd90d70c8e4
--- /dev/null
+++ b/css-flexbox-2/images/align-content-example.svg
@@ -0,0 +1,94 @@
+
diff --git a/css-flexbox-2/images/basic-flexbox.png b/css-flexbox-2/images/basic-flexbox.png
new file mode 100644
index 000000000000..3901c3e11c83
Binary files /dev/null and b/css-flexbox-2/images/basic-flexbox.png differ
diff --git a/css-flexbox-2/images/basic-vertical-flexbox.png b/css-flexbox-2/images/basic-vertical-flexbox.png
new file mode 100644
index 000000000000..6a07d225b163
Binary files /dev/null and b/css-flexbox-2/images/basic-vertical-flexbox.png differ
diff --git a/css-flexbox-2/images/computer.jpg b/css-flexbox-2/images/computer.jpg
new file mode 100644
index 000000000000..0d531c7825e5
Binary files /dev/null and b/css-flexbox-2/images/computer.jpg differ
diff --git a/css-flexbox-2/images/flex-align.svg b/css-flexbox-2/images/flex-align.svg
new file mode 100644
index 000000000000..1753e807cb0c
--- /dev/null
+++ b/css-flexbox-2/images/flex-align.svg
@@ -0,0 +1,79 @@
+
\ No newline at end of file
diff --git a/css-flexbox-2/images/flex-direction-terms.svg b/css-flexbox-2/images/flex-direction-terms.svg
new file mode 100644
index 000000000000..70fde881e411
--- /dev/null
+++ b/css-flexbox-2/images/flex-direction-terms.svg
@@ -0,0 +1,66 @@
+
+
+
+
+
+ cross start
+
+
+
+ cross end
+
+
+
+ mainstart
+
+
+
+ mainend
+
+
+ flex container
+
+
+ 1
+ flex item
+
+
+
+ 2
+ flex item
+
+
+
+
+
+ main axis
+
+
+
+
+
+ cross axis
+
+
+
+ main size
+
+
+
+ cross size
+
+
+
\ No newline at end of file
diff --git a/css-flexbox-2/images/flex-flow-english.svg b/css-flexbox-2/images/flex-flow-english.svg
new file mode 100644
index 000000000000..239ea7a331ff
--- /dev/null
+++ b/css-flexbox-2/images/flex-flow-english.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+ A
+
+
+
+ B
+
+
+
+ C
+
+
+
+ D
+
+
\ No newline at end of file
diff --git a/css-flexbox-2/images/flex-flow-japanese.svg b/css-flexbox-2/images/flex-flow-japanese.svg
new file mode 100644
index 000000000000..78e890155454
--- /dev/null
+++ b/css-flexbox-2/images/flex-flow-japanese.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+ 一
+
+
+
+ 二
+
+
+
+ 三
+
+
+
+ 四
+
+
diff --git a/css-flexbox-2/images/flex-flow1.svg b/css-flexbox-2/images/flex-flow1.svg
new file mode 100644
index 000000000000..c6986b500a3d
--- /dev/null
+++ b/css-flexbox-2/images/flex-flow1.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+ 1
+
+
+
+ 2
+
+
+
+ 3
+
+
+
+ 4
+
+
\ No newline at end of file
diff --git a/css-flexbox-2/images/flex-flow2.svg b/css-flexbox-2/images/flex-flow2.svg
new file mode 100644
index 000000000000..fec933b099db
--- /dev/null
+++ b/css-flexbox-2/images/flex-flow2.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+ 1
+
+
+
+ 2
+
+
+
+ 3
+
+
+
+ 4
+
+
\ No newline at end of file
diff --git a/css-flexbox-2/images/flex-flow3.svg b/css-flexbox-2/images/flex-flow3.svg
new file mode 100644
index 000000000000..70b33ec3e80e
--- /dev/null
+++ b/css-flexbox-2/images/flex-flow3.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+ 1
+
+
+
+ 2
+
+
+
+ 3
+
+
+
+ 4
+
+
\ No newline at end of file
diff --git a/css-flexbox-2/images/flex-item-determination.png b/css-flexbox-2/images/flex-item-determination.png
new file mode 100644
index 000000000000..dfb9e843ee18
Binary files /dev/null and b/css-flexbox-2/images/flex-item-determination.png differ
diff --git a/css-flexbox-2/images/flex-order-example.png b/css-flexbox-2/images/flex-order-example.png
new file mode 100644
index 000000000000..3e1fe6adfc30
Binary files /dev/null and b/css-flexbox-2/images/flex-order-example.png differ
diff --git a/css-flexbox-2/images/flex-order-page.svg b/css-flexbox-2/images/flex-order-page.svg
new file mode 100644
index 000000000000..0863cb9651b4
--- /dev/null
+++ b/css-flexbox-2/images/flex-order-page.svg
@@ -0,0 +1,32 @@
+
+
+
+
+
+ <header>
+
+
+
+ <footer>
+
+
+
+ <nav>
+
+
+
+ <article>
+
+
+
+ <aside>
+
+
\ No newline at end of file
diff --git a/css-flexbox-2/images/flex-pack.svg b/css-flexbox-2/images/flex-pack.svg
new file mode 100644
index 000000000000..33e742b45e4c
--- /dev/null
+++ b/css-flexbox-2/images/flex-pack.svg
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ flex-start
+
+
+
+
+
+
+
+ flex-end
+
+
+
+
+
+
+
+ center
+
+
+
+
+
+
+
+ space-between
+
+
+
+
+
+
+
+ space-around
+
+
\ No newline at end of file
diff --git a/css-flexbox-2/images/multiline-balance-flex.svg b/css-flexbox-2/images/multiline-balance-flex.svg
new file mode 100644
index 000000000000..0c1ef7de03aa
--- /dev/null
+++ b/css-flexbox-2/images/multiline-balance-flex.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+ 1
+
+
+
+ 2
+
+
+
+ 3
+
+
+
+ 4
+
+
\ No newline at end of file
diff --git a/css-flexbox-2/images/multiline-balance.svg b/css-flexbox-2/images/multiline-balance.svg
new file mode 100644
index 000000000000..e94a8af99aa0
--- /dev/null
+++ b/css-flexbox-2/images/multiline-balance.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+ 1
+
+
+
+ 2
+
+
+
+ 3
+
+
+
+ 4
+
+
\ No newline at end of file
diff --git a/css-flexbox-2/images/multiline-flex.svg b/css-flexbox-2/images/multiline-flex.svg
new file mode 100644
index 000000000000..a3782d11ce5a
--- /dev/null
+++ b/css-flexbox-2/images/multiline-flex.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+ 1
+
+
+
+ 2
+
+
+
+ 3
+
+
+
+ 4
+
+
\ No newline at end of file
diff --git a/css-flexbox-2/images/multiline-no-flex.svg b/css-flexbox-2/images/multiline-no-flex.svg
new file mode 100644
index 000000000000..9e77721925d9
--- /dev/null
+++ b/css-flexbox-2/images/multiline-no-flex.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+ 1
+
+
+
+ 2
+
+
+
+ 3
+
+
+
+ 4
+
+
\ No newline at end of file
diff --git a/css-flexbox-2/images/printer.png b/css-flexbox-2/images/printer.png
new file mode 100644
index 000000000000..d73f781ddca0
Binary files /dev/null and b/css-flexbox-2/images/printer.png differ
diff --git a/css-flexbox-2/images/rel-vs-abs-flex.svg b/css-flexbox-2/images/rel-vs-abs-flex.svg
new file mode 100644
index 000000000000..ce62e19da1f5
--- /dev/null
+++ b/css-flexbox-2/images/rel-vs-abs-flex.svg
@@ -0,0 +1,77 @@
+
+
+
+ All Space Distributed
+ (flex-basis:0)
+
+
+
+ 1
+
+
+
+ 1
+
+
+
+ 2
+
+
+
+
+
+ short
+
+ looooooong
+
+ short
+
+
+
+ Extra Space Distributed
+ (flex-basis:auto)
+
+
+
+ short
+
+ looooooong
+
+ short
+
+
+
+
+ 1
+
+ 1
+
+
+
+ 1
+
+ 1
+
+
+
+ 2
+
+ 2
+
+
+
+
\ No newline at end of file
diff --git a/css-flexbox-2/images/target.png b/css-flexbox-2/images/target.png
new file mode 100644
index 000000000000..045d83d5ed6a
Binary files /dev/null and b/css-flexbox-2/images/target.png differ
diff --git a/css-flexbox-2/images/toolbar-example.svg b/css-flexbox-2/images/toolbar-example.svg
new file mode 100644
index 000000000000..e6c2fa09f362
--- /dev/null
+++ b/css-flexbox-2/images/toolbar-example.svg
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/css-flexbox-2/images/wp7zxxyu.gif b/css-flexbox-2/images/wp7zxxyu.gif
new file mode 100644
index 000000000000..de0baa509d2c
Binary files /dev/null and b/css-flexbox-2/images/wp7zxxyu.gif differ
diff --git a/css-forms-1/Overview.bs b/css-forms-1/Overview.bs
index 330197e095ff..37d4c41bf8a1 100644
--- a/css-forms-1/Overview.bs
+++ b/css-forms-1/Overview.bs
@@ -828,7 +828,6 @@ textarea,
button,
::file-selector-button,
::color-swatch,
-select,
meter,
progress,
fieldset,
@@ -847,7 +846,6 @@ textarea,
button,
::file-selector-button,
::slider-track,
-select,
fieldset {
border: 1px solid currentColor;
background-color: transparent;
@@ -976,12 +974,9 @@ input[type=radio]:checked::checkmark {
## Buttons (and button-like controls) ## {#stylesheet-button}
-Selects are only button-like when they're a [drop-down box](https://html.spec.whatwg.org/multipage/rendering.html#drop-down-box).
-
```css
button,
::file-selector-button,
-select,
input:is([type="color"], [type="button"], [type="reset"], [type="submit"]) {
border: 1px solid currentColor;
background-color: transparent;
@@ -1019,21 +1014,18 @@ input:is([type="color"], [type="button"], [type="reset"], [type="submit"]) {
}
button:enabled:hover,
-select:enabled:hover,
input:is([type="color"], [type="button"], [type="reset"], [type="submit"]):enabled:hover,
input[type="file"]:enabled::file-selector-button:hover {
background-color: color-mix(currentColor 10%, transparent);
}
button:enabled:active,
-select:enabled:active,
input:is([type="color"], [type="button"], [type="reset"], [type="submit"]):enabled:active,
input[type="file"]:enabled::file-selector-button:active {
background-color: color-mix(currentColor 20%, transparent);
}
button:disabled,
-select:disabled,
input:is([type="color"], [type="button"], [type="reset"], [type="submit"]):disabled,
input[type="file"]:disabled::file-selector-button {
color: color-mix(currentColor 50%, transparent);
@@ -1063,138 +1055,8 @@ input[type="color"] {
## Selects ## {#stylesheet-select}
-```css
-select option {
- /* These min-size rules ensure accessibility by following WCAG rules:
- * https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html
- * Unset if the author provides a child button element.
- * The 1lh is there to make sure that options without text don't change
- * the block size of the option. */
- min-inline-size: 24px;
- min-block-size: max(24px, 1lh);
-
- /* Centers text within the block (vertically). From OpenUI discussion:
- * https://github.com/openui/open-ui/issues/1026#issuecomment-2103187647. */
- align-content: center;
-
- /* centering + gap between checkmark and option content */
- /* also easily reversed, when checkmark should be inline-end */
- display: flex;
- align-items: center;
- gap: 0.5em;
-
- /* Makes options with long text widen picker instead
- * of making options tall. */
- white-space: nowrap;
-}
-select option:enabled:hover {
- background-color: color-mix(currentColor 10%, transparent);
-}
-select option:enabled:active {
- background-color: color-mix(currentColor 20%, transparent);
-}
-select option:disabled {
- color: color-mix(currentColor 50%, transparent);
-}
-select option::checkmark {
- content: '\2713' / '';
-}
-select option:not(:checked)::checkmark {
- visibility: hidden;
-}
-
-select optgroup {
- display: block;
- /* font-weight makes optgroups visually distinct from options. */
- font-weight: bolder;
-}
-
-select optgroup option {
- /* Undo font-weight:bolder rule from optgroups. */
- font-weight: normal;
-}
-
-select legend,
-select option {
- /* spacing ownership moves to children */
- /* space inline from border edges */
- /* this creates a full bleed hover highlight */
- padding-inline: 0.5em;
-}
-```
-
-### Drop-down box selects ### {#stylesheet-dropdown-select}
-
-These styles should apply when the select is a [drop-down box](https://html.spec.whatwg.org/multipage/rendering.html#drop-down-box).
-
-```css
-select {
- field-sizing: content !important;
-}
-
-select > button:first-child {
- /* Prevents button from setting font, color, or background-color */
- all: unset;
-
- /* Prevents duplicate box decorations */
- display: contents;
-
- /* Prevents button activation behavior so select can handle events */
- interactivity: inert !important;
-}
-
-select::picker-icon {
- /* margin-inline-start pushes the icon to the right of the box */
- margin-inline-start: auto;
- display: block;
- content: counter(-ua-disclosure-open, disclosure-open);
-}
-
-select::picker(select) {
- /* Same properties as popover and dialog */
- color: CanvasText;
- background-color: Canvas;
- border: 1px solid;
-
- /* box-sizing is set to match the button. */
- box-sizing: border-box;
-
- /* Remove [popover] padding which
- * prevents options from extending to edges */
- padding: 0;
-
- /* Anchor positioning and scrollbars */
- inset: auto;
- margin: 0;
- min-inline-size: anchor-size(self-inline);
- min-block-size: 1lh;
- /* Go to the edge of the viewport, and add scrollbars if needed. */
- max-block-size: stretch;
- overflow: auto;
- /* Below and span-right, by default. */
- position-area: self-block-end span-self-inline-end;
- position-try-order: most-block-size;
- position-try-fallbacks:
- /* First try above and span-right. */
- self-block-start span-self-inline-end,
- /* Then below but span-left. */
- self-block-end span-self-inline-start,
- /* Then above and span-left. */
- self-block-start span-self-inline-start;
-}
-```
-
-### List box selects ### {#stylesheet-listbox-select}
-
-These styles should apply when the select is a [list box](https://html.spec.whatwg.org/multipage/rendering.html#list-box).
-
-```css
-select {
- overflow: auto;
- display: inline-block;
- block-size: calc(max(24px, 1lh) * attr(size type(), 4));
-}
-```
+See base appearance user agent styles specified in
+HTML.
### Text inputs ### {#stylesheet-text-inputs}
diff --git a/css-gaps-1/Overview.bs b/css-gaps-1/Overview.bs
index c1d38db2fedd..8647d46df5f2 100644
--- a/css-gaps-1/Overview.bs
+++ b/css-gaps-1/Overview.bs
@@ -12,7 +12,7 @@ TR: https://www.w3.org/TR/css-gaps-1/
Previous Version: https://www.w3.org/TR/2026/WD-css-gaps-1-20260227/
Previous Version: https://www.w3.org/TR/2025/WD-css-gaps-1-20250417/
Editor: Kevin Babbitt, Microsoft, https://github.com/kbabbitt, w3cid 124689
-Abstract: This module introduces several properties to add row and column gap decorations to container layout types such as grid and flex.
+Abstract: This module defines properties to specify spacing ("gaps") between items in container layouts. It also introduces properties for painting visible separators within those gaps.
WPT Path Prefix: css/css-gaps/
WPT Display: open
@@ -33,13 +33,16 @@ Introduction
This section is not normative.
- [[CSS-MULTICOL-1#column-gaps-and-rules]] allows for rules to be drawn
- between columns in a multicol container. This specification expands
- upon the 'column-rule-width', 'column-rule-style', and 'column-rule-color'
- properties, adding equivalents in the row direction, expanding their
- application to other container layouts, and giving advanced control over
- where and how gap decorations are painted.
+ [[CSS-MULTICOL-1#column-gaps-and-rules]] defined properties that allow
+ authors to control the spacing between columns in a [=multicol container=],
+ and to paint visible separators such as lines in those spaces.
+ We refer to these visible separators as [=gap decorations=].
+ This specification expands upon the previously defined properties.
+ It adds equivalent properties for the row direction,
+ applies the full set of properties to other container types,
+ and gives additional control over where and how gap decorations are painted.
+
Value Definitions
@@ -671,6 +674,7 @@ Gap decoration segments
flex/flex-gap-decorations-060.html
flex/flex-gap-decorations-061.html
flex/flex-gap-decorations-repaint-on-child-resize.html
+ flex/flex-gap-decorations-writing-mode.html
grid/grid-gap-decorations-001.html
grid/grid-gap-decorations-029.html
grid/grid-gap-decorations-030.html
@@ -692,6 +696,7 @@ Gap decoration segments
grid/grid-gap-decorations-repaint-on-child-resize.html
grid/grid-gap-decorations-repaint-on-item-position-change.html
grid/grid-gap-decorations-repaint-on-item-span-change.html
+ grid/grid-gap-decorations-writing-mode.html
grid/subgrid/subgrid-gap-decorations-001.html
grid/subgrid/subgrid-gap-decorations-002.html
grid/subgrid/subgrid-gap-decorations-003.html
@@ -715,7 +720,9 @@ Gap decoration segments
multicol/multicol-gap-decorations-016.html
multicol/multicol-gap-decorations-018.html
multicol/multicol-gap-decorations-024.html
+ multicol/multicol-gap-decorations-040.html
multicol/multicol-gap-decorations-repaint-on-content-resize.html
+ multicol/multicol-gap-decorations-writing-mode.html
-
-### Image Fragments ### {#image-fragments}
-
- When a URL specified in ''image()'' represents a portion of a resource
- (e.g. by the use of media fragment identifiers)
- that portion is clipped out of its context and used as a standalone image.
-
-
- For example, given the following image and CSS:
-
-
-
-
-
-
-
- ...the background of the element will be the portion of the image that starts at (40px,0px) and is 20px wide and tall,
- which is just the circle with a quarter filled in.
-
-
- So that authors can take advantage of CSS's forwards-compatible parsing rules to provide a fallback for image slices,
- implementations that support the ''image()'' notation
- must support the xywh=#,#,#,# form of media fragment identifiers
- for images specified via ''image()''. [[!MEDIA-FRAGS]]
-
-
- Note that image fragments can also be used with the ''url()'' notation.
- However, a legacy UA that doesn't understand the media fragments notation
- will ignore the fragment and simply display the entirety of the image.
-
- Since the ''image()'' notation requires UAs to support media fragments,
- authors can take advantage of CSS's forward-compatible parsing rules
- to provide a fallback when using an image fragment URL:
-
-
- background-image: url('swirl.png'); /* old UAs */
- background-image: image('sprites.png#xywh=10,30,60,20'); /* new UAs */
-
-
-
- If a URL uses a fragment identifier syntax that the implementation does not understand,
- or does not consider valid for that type of image,
- the URL must be treated as representing an invalid image.
-
- Note: This error-handling is limited to ''image()'',
- and not in the definition of URL,
- for legacy compat reasons.
-
-
-### Solid-color Images ### {#color-images}
-
- If the ''image()'' function is specified with only a <> argument (no URL),
- it represents a solid-color image of the specified color with no [=natural dimensions=].
+ The ''image()'' function represents a solid-color image of the specified color
+ with no [=natural dimensions=].
For example,
one can use this as a simple way to "tint" a background image,
by overlaying a partially-transparent color over the top of the other image:
-
- 'background-color' does not work for this,
- as the solid color it generates always lies beneath all the background images.
-
-
-
-### Bidi-sensitive Images ### {#bidi-images}
-
- Before listing any <image-src>s,
- the author may specify a directionality for the image,
- similar to adding a dir attribute to an element in HTML.
- If a directional image is used on or in an element with opposite direction,
- the image must be flipped in the inline direction
- (as if it was transformed by, e.g., scaleX(-1), if the inline direction is the X axis).
-
- Note: Absent this declaration,
- images default to no directionality at all,
- and thus don't care about the directionality of the surrounding element.
+ This is equivalent to a single color stop gradient:
-
- A list may use an arrow for a bullet that points into the content.
- If the list can contain both LTR and RTL text,
- though, the bullet may be on the left or the right,
- and an image designed to point into the text on one side will point out of the text on the other side.
- This can be fixed with code like:
+
- <ul style="list-style-image: image(ltr 'arrow.png');">
- <li dir='ltr'>My bullet is on the left!</li>
- <li dir='rtl'>MY BULLET IS ON THE RIGHT!</li>
- </ul>
-
-
- This should render something like:
-
-
- ⇒ My bullet is on the left!
- !THGIR EHT NO SI TELLUB YM ⇐
-
-
- In LTR list items, the image will be used as-is.
- In the RTL list items, however,
- it will be flipped in the inline direction,
- so it still points into the content.
+ 'background-color' does not work for this,
+ as the solid color it generates always lies beneath all the background images.
+ Note: This function previously defined a number of additional behaviors,
+ but those have been shifted to [[css-images-5]].
+
+2D Image Values: the <> type {#image-values}
+===================================================
+
+ ...
+
+
+
+
+Image Fallbacks and Annotations: the ''image()'' notation {#image-notation}
+---------------------------------------------------------------------------
+
+ [[css-images-4]] defines a simple form of the ''image()'' function,
+ which generates a solid-color dimensionless image.
+ This level introduces a number of additional functions.
+
+ The ''image()'' function allows an author to:
+
+ * use media fragments to clip out a portion of an image
+ * use a solid color as an image
+ * fallback to a solid-color image, when the image at the specified url can't be downloaded or decoded
+ * automatically respect the image orientation specified in the image's metadata
+
+ The ''image()'' notation is defined as:
+
+
+
+ A <> used in ''image()'' represents a <>.
+ As usual for URLs in CSS,
+ relative URLs are resolved to an absolute URL
+ (as described in Values & Units [[!CSS-VALUES-3]])
+ when a specified ''image()'' value is computed.
+
+ If the image has an orientation specified in its metadata,
+ such as EXIF,
+ the UA must rotate or flip the image to correctly orient it
+ as the metadata specifies.
+
+### Image Fallbacks ### {#image-fallbacks}
+
+ If both a URL and a <> are specified in ''image()'',
+ then whenever the URL represents an [=invalid image=] or [=loading image=],
+ the ''image()'' function renders as if the URL were not specified at all;
+ it generates a solid-color image as specified in [[#color-images]].
+
+ If just a URL is specified (no <>)
+ and it represents an [=invalid image=] or [=loading image=],
+ the ''image()'' function represents the same.
+
+
+ css-image-fallbacks-and-annotations.html
+ css-image-fallbacks-and-annotations002.html
+ css-image-fallbacks-and-annotations003.html
+ css-image-fallbacks-and-annotations004.html
+ css-image-fallbacks-and-annotations005.html
+
+
+
+ The fallback color can be used to ensure that text is still readable
+ even when the image fails to load.
+ For example, the following legacy code works fine if the image is rectangular and has no transparency:
+
+
+
+ When the image doesn't load,
+ the background color is still there to ensure that the white text is readable.
+ However, if the image has some transparency,
+ the black will be visible behind it,
+ which is probably not desired.
+ The ''image()'' function addresses this:
+
+
+
+ Now, the black won't show at all if the image loads,
+ but if for whatever reason the image fails,
+ it'll pop in and prevent the white text from being set against a white background.
+
+
+
+
+### Image Fragments ### {#image-fragments}
+
+ When a URL specified in ''image()'' represents a portion of a resource
+ (e.g. by the use of media fragment identifiers)
+ that portion is clipped out of its context and used as a standalone image.
+
+
+ For example, given the following image and CSS:
+
+
+
+
+
+
+
+ ...the background of the element will be the portion of the image that starts at (40px,0px) and is 20px wide and tall,
+ which is just the circle with a quarter filled in.
+
+
+ So that authors can take advantage of CSS's forwards-compatible parsing rules to provide a fallback for image slices,
+ implementations that support the ''image()'' notation
+ must support the xywh=#,#,#,# form of media fragment identifiers
+ for images specified via ''image()''. [[!MEDIA-FRAGS]]
+
+
+ Note that image fragments can also be used with the ''url()'' notation.
+ However, a legacy UA that doesn't understand the media fragments notation
+ will ignore the fragment and simply display the entirety of the image.
+
+ Since the ''image()'' notation requires UAs to support media fragments,
+ authors can take advantage of CSS's forward-compatible parsing rules
+ to provide a fallback when using an image fragment URL:
+
+
+ background-image: url('swirl.png'); /* old UAs */
+ background-image: image('sprites.png#xywh=10,30,60,20'); /* new UAs */
+
+
+
+ If a URL uses a fragment identifier syntax that the implementation does not understand,
+ or does not consider valid for that type of image,
+ the URL must be treated as representing an invalid image.
+
+ Note: This error-handling is limited to ''image()'',
+ and not in the definition of URL,
+ for legacy compat reasons.
+
+
+### Solid-color Images ### {#color-images}
+
+ If the ''image()'' function is specified with only a <> argument (no URL),
+ it represents a solid-color image of the specified color with no [=natural dimensions=].
+
+
+ For example,
+ one can use this as a simple way to "tint" a background image,
+ by overlaying a partially-transparent color over the top of the other image:
+
+
+
+ 'background-color' does not work for this,
+ as the solid color it generates always lies beneath all the background images.
+
+
+
+### Bidi-sensitive Images ### {#bidi-images}
+
+ Before listing any <image-src>s,
+ the author may specify a directionality for the image,
+ similar to adding a dir attribute to an element in HTML.
+ If a directional image is used on or in an element with opposite direction,
+ the image must be flipped in the inline direction
+ (as if it was transformed by, e.g., scaleX(-1), if the inline direction is the X axis).
+
+ Note: Absent this declaration,
+ images default to no directionality at all,
+ and thus don't care about the directionality of the surrounding element.
+
+
+ A list may use an arrow for a bullet that points into the content.
+ If the list can contain both LTR and RTL text,
+ though, the bullet may be on the left or the right,
+ and an image designed to point into the text on one side will point out of the text on the other side.
+ This can be fixed with code like:
+
+
+ <ul style="list-style-image: image(ltr 'arrow.png');">
+ <li dir='ltr'>My bullet is on the left!</li>
+ <li dir='rtl'>MY BULLET IS ON THE RIGHT!</li>
+ </ul>
+
+
+ This should render something like:
+
+
+ ⇒ My bullet is on the left!
+ !THGIR EHT NO SI TELLUB YM ⇐
+
+
+ In LTR list items, the image will be used as-is.
+ In the RTL list items, however,
+ it will be flipped in the inline direction,
+ so it still points into the content.
+
+
+
Sizing Images and Objects in CSS {#sizing}
==========================================
diff --git a/css-inline-3/Overview.bs b/css-inline-3/Overview.bs
index edd75089676d..a8bc28f948b7 100644
--- a/css-inline-3/Overview.bs
+++ b/css-inline-3/Overview.bs
@@ -952,7 +952,7 @@ Line Spacing: the 'line-height' property
Initial: normal
Applies to: non-replaced inline boxes and SVG text content elements
Inherited: yes
- Percentages: see below
+ Percentages: computed relative to ''1em''
Computed value: the specified keyword, a number, or a computed <> value
Animation type: by computed value type
@@ -990,8 +990,7 @@ Line Spacing: the 'line-height' property
<>
The [=preferred line height=]
- is this percentage of the element's used 'font-size'.
- The [=computed value=] of the property
+ and [=computed value=] of the property
is this percentage of the element's computed 'font-size'.
Negative values are illegal.
diff --git a/css-link-params-1/Overview.bs b/css-link-params-1/Overview.bs
index 9fb1a4834eed..fa28c4aac9ec 100644
--- a/css-link-params-1/Overview.bs
+++ b/css-link-params-1/Overview.bs
@@ -2,10 +2,11 @@
Title: CSS Linked Parameters Module Level 1
Shortname: css-link-params
Level: 1
-Status: ED
+Status: FPWD
Group: CSSWG
-Work Status: exploring
+Work Status: refining
ED: https://drafts.csswg.org/css-link-params/
+TR: https://www.w3.org/TR/css-link-params-1/
Editor: Tab Atkins-Bittner, Google, http://xanthir.com/contact/
Editor: Daniel Holbert, Mozilla
Editor: Jonathan Watt, Mozilla
@@ -19,6 +20,7 @@ spec:html; type:element
text: iframe
text: a
spec:fill-stroke-3; type:property; text:fill
+spec:css-env-1; type:function; text:env()
Introduction {#intro}
@@ -178,11 +180,14 @@ The syntax of an SVG parameter fragment identifie
Multiple [=link parameters=] can be passed to an image
by appending multiple [=param()=] fragment identifiers to the URL.
+When combined, either with each other or with other "fragment identifiers",
+each value is separated with an & character,
+as in a URL's query parameters.
For example, if the image from the previous example also used ''env(--bg-color)'',
it could be referenced with a url like
- “http://example.com/image.svg#param(--text-color,blue)param(--bg-color,white)”
+ “http://example.com/image.svg#param(--text-color,blue)¶m(--bg-color,white)”
to set both ''env(--text-color)'' and ''env(--bg-color)''.
@@ -258,31 +263,23 @@ accessible with the ''env()'' function in stylesheets.
1. On each ''env()'' function, provide a fallback value, like ''fill: env(--color, blue)''.
2. If the ''env()'' is going to be used a lot,
such that providing a fallback for each individual ''env()'' is troublesome,
- store the [=custom environment variable=] in a [=scoped environment variable=]
- of a different name,
+ store the [=custom environment variable=] in a [=custom property=] on the root element
with the default specified,
like:
- @env --color2: env(--color, blue);
-
- /* Alternately, store it in a custom property: */
:root {
--color: env(--color, blue);
}
In this example, if ''--color'' is provided via a [=linked parameter=],
- ''env(--color2)'' will contain its value.
+ ''var(--color)'' will contain its value.
If not, it will contain the default ''blue'' value.
- In either case, ''env(--color2)'' can be used in the stylesheet unconditionally,
+ In either case, ''var(--color)'' can be used in the stylesheet unconditionally,
secure in the knowledge that it will always have a value.
-Note: When we define ''env(parent --color)'' to jump up a scope level,
-you won't need to do the rename;
-''@env --color: env(parent --color);'' will work just fine.
-
Privacy Considerations
diff --git a/css-navigation-1/Overview.bs b/css-navigation-1/Overview.bs
index 479c46e3a6f2..25f70faf9c6f 100644
--- a/css-navigation-1/Overview.bs
+++ b/css-navigation-1/Overview.bs
@@ -9,12 +9,13 @@ ED: https://drafts.csswg.org/css-navigation-1/
!Issue Tracking: w3c/csswg-drafts#12594
Editor: L. David Baron, Google https://www.google.com/, https://dbaron.org/, w3cid 15393
Editor: Noam Rosenthal, Google https://www.google.com/, w3cid 121539
-Abstract: This module contains conditional CSS rules for styling conditioned on the current URL
- or conditioned on the status of navigating between particular URLs.
+Abstract: This module contains conditional CSS rules for styling
+ conditioned on the status of navigating between particular URLs.
+
+A <> is defined to
+match a [=/URL=]-or-null input if input is non-null, and:
+
+
+
+: the <> is a <>
+:: [=URL pattern/match|match a URL pattern=] is non-null given
+ urlPattern as
+ the [=URL pattern=] represented by the ''@route'' rule referenced by the name and
+ input as input.
+
+: the <> is a <>
+:: [=URL pattern/match|match a URL pattern=] is non-null given
+ urlPattern as
+ the [=URL pattern=] represented by the function (see
+ [=create a URL pattern for url-pattern()=]) and
+ input as input.
+
+: the <> is a <>
+:: The given [=/URL=] [=url/equals=] input.
+
+
+
+
Declaring named URL patterns: the ''@route'' rule
The @route rule
-is an at-rule that associates a name with a [=URL pattern=].
+is an at-rule that associates an author-defined name with a [=URL pattern=].
This name can be referenced in ''@navigation'' rules
-and in '':link-to()'' pseudo-classes.
+and in '':active-navigation()'' pseudo-classes.
-The syntax of the ''@route'' rule is:
+The syntax of the ''@route'' rule is described by the <> production in:
-based on the following definitions:
+This means that the rule accepts a sequence of descriptors
+that have the syntax of declarations.
+However, in valid style sheets the only descriptors must match
+the <> production below.
+Any other descriptors are ignored.
-
-This associates an author-defined keyword with a URL pattern,
-so that any URL that matches one of the URL patterns
-matches the route named by the keyword.
+
+If two valid descriptors in a single rule have the same name,
+the last one is used and the others are ignored.
+If a rule has both a valid <>
+and a valid <>
+then it is ignored.
The ''@route'' rule can be defined in one of two ways:
: with the pattern descriptor
:: in this case the URL pattern represented is
- the one represented by the <> function
- given as the descriptor's value.
+ the result of invoking
+ [=create a URL pattern for url-pattern()=] given
+ arg as the argument to the ''url-pattern()'' function
+ and baseURLSpecifier as
+ the (optional) value of the rule's <>.
: with the other descriptors named by <>
:: In this case the URL pattern represented is the result of invoking
[=URL pattern/create|create a URL pattern=] given
@@ -78,23 +125,22 @@ The ''@route'' rule can be defined in one of two ways:
constructed from the descriptors and their values.
Each dictionary member is given the value of
the descriptor with the same name,
- except the baseURL member is given the value of
- the base-url descriptor.
- If a base-url descriptor is not given then one is created from
- the [=style resource base URL=] of the rule.
+ except the baseURL member is given the result of
+ [=create a URL for a base descriptor=]
+ given baseURLSpecifier as
+ the (optional) value of the rule's <>.
ISSUE: Should this use <>, <>, or <>
for the route names?
-ISSUE: Is there value in being able to provide a list of <>
-rather than just one?
+ISSUE: Should we use base-url or just base as the descriptor name?
NOTE: The list of allowed init descriptors does not include username
or password since they seem unlikely to be useful.
It's possible that this syntax with init descriptors in the ''@route'' rule
-would make more sense as part of the ''urlpattern()'' function
+would make more sense as part of the ''url-pattern()'' function
(that is, as an alternate syntax for what goes inside the function).
This would also give us the option to remove the braces from
@@ -108,18 +154,18 @@ but it could also be added back later if we need it.
Either this rule:
define an ''@route'' rule that associates
the name --movie-list
-with the URL "/movie-list" resolved relative to the style sheet.
+with the URL "/movies" resolved relative to the style sheet.
NOTE: The bracing syntax also allows for future expansion if needed.
@@ -127,6 +173,492 @@ NOTE: The bracing syntax also allows for future expansion if needed.
NOTE: Some of the design discussion for this feature has been in
w3c/csswg-drafts#12594.
+
The ''url-pattern()'' function
+
+
+
+The url-pattern() function represents a [=URL pattern=],
+which can be used to match URLs.
+
+
+<> = url-pattern( <> )
+
+
+This function represents the [=URL pattern=] resulting from
+invoking [=create a URL pattern for url-pattern()=] with its string argument.
+
+The syntax used in the ''url-pattern()'' function follows that of [=URL Pattern=].
+It is a [=pattern string=] directly based on the syntax used by
+the popular path-to-regexp JavaScript library.
+
+
+Pattern strings can contain capture groups, which by default match the shortest possible string,
+up to a component-specific separator (/ in the pathname, . in the hostname).
+
+For example, the pathname pattern "/movies/:id"
+will match "/movies/123"
+but not "/movies/123/cast".
+
+A regular expression enclosed in parentheses can also be used instead,
+so the pathname pattern "/blog/:id(\\d+)"
+will match "/movies/123"
+but not "/movies/css".
+
+You may also omit the name of the capture group by using only a regular expression,
+for example "/blog/(\\d+)".
+
+A group can also be made optional by using the ? modifier or by wrapping it in braces.
+For example, the patterns "/movies/:id?" and "/movies{/:id}"
+will match both "/movies" and "/movies/123" (but not "/movies/").
+
+A full wildcard * can also be used to match as much as possible,
+as in the pattern "/*/movies".
+This too can be given a name, for example "/*lang/movies".
+
+
+The steps of the create a URL pattern for url-pattern() algorithm,
+given a string arg and
+an optional baseURLSpecifier
+which can be ''document'', ''stylesheet'', or a URL, are:
+
+1. Let baseURL be the result of
+ [=create a URL for a base descriptor=] given baseURLSpecifier.
+
+1. Return the result of [=URL pattern/create|create a URL pattern=] given
+ arg, baseURL, and an empty [=map=].
+
+NOTE: This function requires that its argument is quoted.
+This differs from the ''url()'' function,
+which allows its argument to be quoted or unquoted.
+
+The create a URL for a base descriptor algorithm, given
+an optional baseURLSpecifier
+which can be ''document'', ''stylesheet'', or a URL, is:
+
+
+
+: if baseURLSpecifier is not present or is ''stylesheet''
+:: the [=style resource base URL=] of
+ the rule or declaration block containing the ''url-pattern()'' function.
+
+: if baseURLSpecifier is ''document''
+:: the [=document base URL=] of the document
+
+: if baseURLSpecifier is a URL
+:: baseURLSpecifier
+
+
+defines an ''@route'' rule that associates
+the name --movie-detail
+with any URL that matches the [=URL pattern=] /movies/:id.
+
+Any of the following URLs (relative to the style sheet) match:
+
+
+
/movies/123
+
/movies/456
+
/movies/something
+
+
+These URLs will not match:
+
+
+
/movies/123/ — The trailing slash is not matched by the pattern
+
/movies/456/extra — The /extra is not matched by the pattern
+
+
+
+
+To have the --movie-details route
+match only numeric :id values,
+define the route eiter as:
+
+
+
+This way, /movies/something won’t be matched by the route.
+
+NOTE: Even though the capture groups are not currently exposed,
+it is recommended to give the capture groups a name for future use.
+
+
+
+Should the default always be ''stylesheet''?
+For use of ''url-pattern()'' in ''@navigation'',
+it's likely more useful for the base URL
+to be the document URL rather than the style sheet URL.
+However, it would be very awkward for ''url-pattern()''
+to be inconsistent with ''url()''.
+
+Also see other proposed uses of {{URLPattern}} in CSS
+in ,
+for '':local-link''.
+
+
+
+To serialize a ''url-pattern()'' function f,
+[=serialize a function=] f,
+using [=serialize a string=] on the single argument
+to serialize f's contents.
+
+NOTE: This is defined this way because {{URLPattern}}
+intentionally does not provide a serialization.
+
+
Pseudo-classes for links
+
+
The '':link-to()'' pseudo-class
+
+This specification defines a new
+'':link-to()'' functional pseudo-class
+that matches link elements that link to a certain URL.
+
+
+A simple example of a '':link-to()'' selector is this one,
+which matches any links that link to the site's homepage:
+
+
+
+Because there is no dynamic part in the homepage URL,
+you might be tempted to pass in a <> directly:
+
+
+:link-to(url("/")) {
+ font-weight: bold;
+}
+
+
+However, url("/") won't match URLs such as
+/#scroll-to-here or /?utm_id=something
+so it is recommended to use the <>
+or <> variants, or use the following alternative:
+
+
+
+The '':link-to()'' pseudo-class takes a single argument, a <>,
+and the pseudo-class matches any element where both:
+* the element matches '':any-link''
+* the <> [=route-location/matches=] the target of the link
+
+
The '':active-navigation()'' pseudo-class
+
+This specification defines a new
+'':active-navigation()''
+functional pseudo-class
+that matches link elements that link to a certain URL
+that is related to a navigation that is currently active.
+
+The '':active-navigation()'' pseudo-class takes a single argument, a <>,
+and the pseudo-class matches any element where:
+* the element matches '':any-link''
+* the target of the link matches the <>, as defined below.
+
+
+<> =
+ <>? [ <> | link-href ]?
+<> = at | with | from | to
+
+
+ISSUE: Should we use ''at''/''with''/''from''/''to'' or
+''current''/''other''/''from''/''to''?
+
+An <> matches the target linkTarget of the link when
+the following steps return true:
+1. Let navigationURL be
+ the [=current navigation URL=] of the document given the <> in <> (default ''with'').
+
+1. If navigationURL is null, return false.
+1. If ''link-href'' is present, or a <> is not provided:
+ 1. Return true if linkTarget [=url/equals=] navigationURL; Otherwise false.
+
+1. If a <> is present:
+ 1. Let targetMatchResult be the result of
+ [=URL pattern/match|matching a URL pattern=]
+ given urlPattern and linkTarget.
+
+ 1. Let navigationMatchResult be the result of
+ [=URL pattern/match|matching a URL pattern=] given
+ urlPattern and navigationURL.
+
+ 1. If navigationMatchResult or targetMatchResult is null, return false.
+
+ 1. For each property prop of {{URLPatternResult}} that is a
+ {{URLPatternComponentResult}}:
+
+ 1. If {{URLPatternComponentResult/groups}} of prop of
+ targetMatchResult is not equal to
+ {{URLPatternComponentResult/groups}} of prop of
+ navigationMatchResult,
+ then return false.
+
+ ISSUE: Need to formally define equality of ordered maps.
+
+ 1. Return true.
+
+
+
+The difference between '':link-to()'' and '':active-navigation()''
+is that the latter is only active while a navigation is in progress.
+
+Consider this example:
+
+
+
+Links that link to the --homepage get a lime color.
+When navigating to or from the --homepage,
+their color changes to hotpink for as long as the animation is active.
+
+Once the navigation has completed, the '':active-navigation()''
+selector no longer applies, and those links revert back to lime.
+
+
+
+
+
+In the following examples, all links that link to the --movie-detail route,
+get a lime color when a navigation is in progress.
+
+
+
+When navigating from /movies/1 to /movies/2:
+
+
+
+ Links that link to the --movie-detail route
+ with any :id
+ get a lime color
+ during the navigation.
+
+
+ Links that link to the --movie-detail route
+ whose target is /movies/1
+ (the “from” page)
+ get a hotpink color
+ during the navigation.
+
+
+ Links that link to the --movie-detail route
+ whose target is /movies/2
+ (the “to” page)
+ get a yellow color
+ during the navigation.
+
+
+
+When navigating from /movies/2 to /:
+
+
+
+ Links that link to the --movie-detail route
+ with any :id
+ get a lime color
+ during the navigation.
+
+
+ Links that link to the --movie-detail route
+ whose target is /movies/3
+ (the “from” page)
+ get a hotpink color
+ during the navigation.
+
+
+
+When navigating from / to /movies/3:
+
+
+
+ Links that link to the --movie-detail route
+ with any :id
+ get a lime color
+ during the navigation.
+
+
+ Links that link to the --movie-detail route
+ whose target is /movies/3
+ (the “to” page)
+ get a yellow color
+ during the navigation.
+
+
+
+
+
+
+
+A an example of the '':active-navigation()'' pseudo-class
+is this example which creates a view transition between
+a item in a list that contains a link (in this document)
+and the details page for that link (in a different document).
+This transition works even when the navigation is a back/forward navigation
+and even if the user has used a language selector UI
+to change the page into a different language (and thus change the URL).
+The use of the '':link-to()'' pseudo-class ensures that
+the view transition animations from or to the correct item in the list
+by matching the relevant parts of the navigation URL to the link URL.
+
+
+@view-transition {
+ /* allow cross-document view transitions */
+ navigation: auto;
+}
+
+@route --movie-detail {
+ /* match URLs like /en/movies/123 which is the English page
+ about a movie with ID 123. Be careful to specify the
+ language part with a "*" but the ID part with a named
+ :id parameter so that matching will require equal IDs
+ but allow differences of language. */
+ pattern: url-pattern("/*/movies/:id");
+}
+
+/* capture the overall area representing the movie, and a
+ sub-area for its poster image */
+
+/* match an element with class movie-container with a child
+ link that links to a movie whose id is the same as the
+ movie we are currently navigating to or from. (lang can
+ be different, though.)
+
+ This depends on the --movie-detail route
+ declaring the ID but not the language with a named
+ parameter, and the use of the 'with' keyword.
+
+ This means that both the of the link and the other URL of
+ the current navigation match the URL pattern defined by
+ the "@route --movie-detail" rule, and that the
+ id named group from both matches be the same. (However,
+ the URLs can be different because the * part of the
+ match, containing the language, can be different.)
+ */
+.movie-container:has(
+ > .movie-title:active-navigation(with --movie-detail)) {
+
+ view-transition-name: movie-container;
+
+ > .movie-poster {
+ view-transition-name: movie-poster;
+ }
+
+ /* leave the default cross-fade animation for both image
+ captures */
+}
+
+
+
+
+NOTE: Some of the design discussion for this feature has been in
+w3c/csswg-drafts#13163.
+
+
The '':trigger-link'' pseudo-class
+
+This specification defines a new
+'':trigger-link''
+that matches link elements that trigger the current navigation.
+
+The '':trigger-link'' pseudo-class matches any element where both:
+* the element matches '':any-link''
+* the [=current navigation state=] is not null, and element is its [=navigation state/source element=].
+
+Issue: should this apply to forms or submit buttons?
+
+
+
+A simple example of a '':trigger-link'' selector is this one,
+which sets the ''view-transition-name'' for an image thumbnail that is a child of the link that triggers the current navigation.
+
+
+
@@ -220,18 +752,20 @@ with <> defined as:
<> = ( <> ) | ( <> ) | <>
<> = <> |
<> |
- <>
+ <> |
+ <>
-<> = <> : <>
+<> = <> : <>
<> = at | with | from | to
-<> = <> | <>
-<> = <>
<> =
- between : <> and <>
+ between : <> and <>
<> = history : <>
<> = traverse | back | forward | reload
+
+<> = phase : <>
+<> = loading | ready | committed
ISSUE: Should we use ''at''/''with''/''from''/''to'' or ''current''/''other''/''from''/''to''?
@@ -267,63 +801,34 @@ as follows:
:: The result is the result of the child subexpression.
: <>
-:: : at: <>
- :: The result is whether the result of
- [=URL pattern/match|match a URL pattern=] is non-null
- given urlPattern as
- the [=navigation location URL pattern=] of <>
- and input as the document's [=Document/URL=].
-
- : with: <>
- :: The result is true if
- the [=current other URL=] other of the document is non-null and
- [=URL pattern/match|match a URL pattern=] is non-null when
- given urlPattern as
- the [=navigation location URL pattern=] of <>
- and input as other.
-
- : from: <>
- :: The result is true if
- the [=current from URL=] from of the document is non-null and
- [=URL pattern/match|match a URL pattern=] is non-null when
- given urlPattern as
- the [=navigation location URL pattern=] of <>
- and input as from.
-
- : to: <>
- :: The result is true if
- the [=current to URL=] to of the document is non-null and
- [=URL pattern/match|match a URL pattern=] is non-null when
- given urlPattern as
- the [=navigation location URL pattern=] of <>
- and input as to.
+:: The result is true if
+ the <> [=route-location/matches=] [=current navigation URL=] of the document given the <>.
: <>
-:: : between: <> and <>
+:: : between: <> and <>
:: The result is true if
- the [=current from URL=] from of the document is non-null,
- the [=current to URL=] to of the document is non-null,
- [=URL pattern/match|match a URL pattern=] is non-null
- given urlPattern as
- the [=navigation location URL pattern=] of one of the two <>s
- and input as from, and
- [=URL pattern/match|match a URL pattern=] is non-null
- given urlPattern as
- the [=navigation location URL pattern=] of the other of the two <>s
- and input as to.
+ the [=current navigation URL=] from of the document given ''from'' is non-null,
+ the [=current navigation URL=] to of the document ''to'' is non-null,
+ one of the two <>s
+ [=route-location/matches=] from,
+ and the other of the two <>s
+ [=route-location/matches=] to.
: <>
:: : history: traverse
:: True if the [=current navigation type=] is {{NavigationType/traverse}}.
: history: back
:: True if the [=current navigation type=] is {{NavigationType/traverse}} and
- the [=current navigation delta=] is less than 0.
+ the document's [=current navigation state=]'s [=navigation state/new index=] is less than its [=navigation state/old index=].
: history: forward
:: True if the [=current navigation type=] is {{NavigationType/traverse}} and
- the [=current navigation delta=] is greater than 0.
+ the document's [=current navigation state=]'s [=navigation state/new index=] is greater than its [=navigation state/old index=].
: history: reload
:: True if the [=current navigation type=] is {{NavigationType/reload}}.
+: <>
+:: The [=current navigation state=] is not null, and its [=navigation state/phase=] matches the given ''phase'' value.
+
: <>
::
The result is false.
@@ -332,31 +837,6 @@ as follows:
It exists only for future-compatibility,
so that new syntax additions do not invalidate too much of a <> in older user agents.
-The navigation location URL pattern of a <>
-depends on the type of <>:
-
-: <>
-:: the URL pattern represented by the ''@route'' rule referenced by the name.
-
-: <>
-:: The [=URL pattern=] represented by the function; see
- [=create a URL pattern for url-pattern()=].
-
-ISSUE: Should it also be possible to reference
-a name defined in a routemap?
-See the
-route matching explainer
-for details.
-
-A document's navigation API is
-the result of the following steps on document:
-
-1. Let window be the {{Window}} whose [=associated Document=] is document, or null if there is no such {{Window}}.
-
-1. If window is null, return null.
-
-1. Return window's [=navigation API=].
-
The condition of the ''@navigation'' rule
is the result of the <> in its prelude.
@@ -389,414 +869,108 @@ ISSUE: This should probably have a more formal definition of the function,
but I can't find the formal definitions of the existing ''if()'' functions
to model it after.
-
Pseudo-class for navigation-related links: '':link-to()''
-
-This specification defines a new
-'':link-to()'' functional pseudo-class
-that matches link elements that link to a certain URL.
-
-
-
-A simple example of a '':link-to()'' selector is this one,
-which matches any links that link to the site's homepage:
-
-
-
-A more interesting example of the '':link-to()'' pseudo-class
-is this example which creates a view transition between
-a item in a list that contains a link (in this document)
-and the details page for that link (in a different document).
-This transition works even when the navigation is a back/forward navigation
-and even if the user has used a language selector UI
-to change the page into a different language (and thus change the URL).
-The use of the '':link-to()'' pseudo-class ensures that
-the view transition animations from or to the correct item in the list
-by matching the relevant parts of the navigation URL to the link URL.
-
-
-@view-transition {
- /* allow cross-document view transitions */
- navigation: auto;
-}
-
-@route --movie-details-with-id {
- /* match URLs like /en/movie/123 which is the English page
- about a movie with ID 123. Be careful to specify the
- language part with a "*" but the ID part with a named
- :id parameter so that matching using the 'match-params'
- keyword (the default) will require equal IDs but allow
- differences of language. */
- pattern: url-pattern("/*/movie/:id");
-}
-
-/* capture the overall area representing the movie, and a
- sub-area for its poster image */
-
-/* match an element with class movie-container with a child
- link that links to a movie whose id is the same as the
- movie we are currently navigating to or from. (lang can
- be different, though.)
-
- This depends on the --movie-details-with-id route
- declaring the ID but not the language with a named
- parameter, and the use of match-params(navigation-with).
-
- This means that both the of the link and the other URL of
- the current navigation match the URL pattern defined by
- the "@route --movie-details-with-id" rule, and that the
- id named group from both matches be the same. (However,
- the URLs can be different because the * part of the
- match, containing the language, can be different.)
- */
-.movie-container:has(
- > .movie-title:link-to(--movie-details-with-id
- with match-params(navigation-with))) {
-
- view-transition-name: movie-container;
-
- > .movie-poster {
- view-transition-name: movie-poster;
- }
-
- /* leave the default cross-fade animation for both image
- captures */
-}
-
-
-
-
-The '':link-to()'' pseudo-class takes a single argument, a <>,
-and the pseudo-class matches any element where:
-* the element matches '':any-link''
-* the target of link matches the <>, as defined below.
-
-
-
-ISSUE: Should we use ''navigation-''(''at''/''with''/''from''/''to'') or
-''navigation-''(''current''/''other''/''from''/''to'')?
-
-ISSUE: Should the '':link-to()'' variant that has a <> have a different name,
-such as '':navigating-link()''?
-
-A <> matches the target of the link when both:
-* the <> matches the target of the link, and
-* either:
- * a <> is not present, or
- * the <> matches the target of the link,
- with the [=URL pattern=] represented by the <> as context
-
-A <> represents a [=URL pattern=].
-If the <> is a <>,
-then it represents the URL pattern
-represented by the <> function
-(see [=create a URL pattern for url-pattern()=]).
-If it is a <>, then it represents the URL pattern
-represented by the ''@route'' rule.
-
-A <> matches a URL
-when [=URL pattern/match|match a URL pattern=] is non-null
-given urlPattern as
-the [=URL pattern=] that it represents and
-input as the given URL.
-
-A <> matches the URL linkTarget
-(with a URL Pattern urlPattern as context)
-if the following steps return true:
-1. Let targetMatchResult be the result of
- [=URL pattern/match|match a URL pattern=]
- given urlPattern and linkTarget.
-1. If targetMatchResult is null, return false.
-
- NOTE: This doesn't really matter because
- in this case the <> also doesn't match.
-1. Let matchType be the <> of the
- <>.
-1. Let matchTarget be the <> argument
- of the <>.
-1. Let navigationURL be:
- : If matchTarget is ''navigation-at'',
- :: the document's [[=Document/URL=]].
- : Otherwise, if matchTarget is ''navigation-with'',
- :: the current other URL of the document.
- : Otherwise, if matchTarget is ''navigation-from'',
- :: the current from URL of the document.
- : Otherwise (Assert: matchTarget is ''navigation-to''),
- :: the current to URL of the document.
-1. If navigationURL is null, return false.
-1. : If matchType is ''match-pattern''
- :: Return true if
- the result of [=URL pattern/match|match a URL pattern=] given
- urlPattern and navigationURL is not null;
- otherwise return false.
-
- : If matchType is ''match-params''
- :: 1. Let navigationMatchResult be the result of
- [=URL pattern/match|match a URL pattern=] given
- navigationURL and urlPattern.
-
- 1. If either navigationMatchResult is null, return false.
-
- 1. For each property prop of {{URLPatternResult}} that is a
- {{URLPatternComponentResult}}:
-
- 1. If {{URLPatternComponentResult/groups}} of prop of
- targetMatchResult is not equal to
- {{URLPatternComponentResult/groups}} of prop of
- navigationMatchResult,
- then return false.
-
- ISSUE: Need to formally define equality of ordered maps.
-
- 1. Return true.
-
- : If matchType is ''match-url''
- :: Return true if linkTarget equals navigationURL;
- otherwise return false.
-
-NOTE: Some of the design discussion for this feature has been in
-w3c/csswg-drafts#13163.
-
-
Definitions of current navigation state
-
-Both the ''@navigation'' rule and the '':link-to()'' pseudo-class
-rely on the following definitions of
-the [=current other URL=], [=current from URL=], and [=current to URL=].
-
-The current from URL of a [=/document=] is a URL or null.
-It is defined as follows:
-
-1. If the [=document's navigation API=] of the document is non-null and
- its [=transition=] is non-null,
- its [=from entry=]'s {{NavigationHistoryEntry/url}}.
-
- NOTE: This part is for when the old document in the navigation
- is still the current document.
-
-1. If the [=document's navigation API=] of the document is non-null,
- its [=activation=] is non-null,
- the activation's {{NavigationActivation/from}} is non-null, and
- the document's [=has been revealed=] is false or
- was false at the start of the current [=task=],
- the activation's {{NavigationActivation/from}}'s
- {{NavigationHistoryEntry/url}}.
-
- NOTE: This part is for when the new document in the navigation
- has become the current document.
-
-1. Otherwise, null.
-
- NOTE: The previous two branches can also produce null results.
-
-The current to URL of a [=/document=] is a URL or null.
-It is defined as follows:
-
-1. If the [=document's navigation API=] of the document is non-null and
- its [=ongoing navigate event=] is non-null:
-
- 1. if the {{pageswap}} event has fired since that navigation began,
- and its {{PageSwapEvent/activation}} was non-null,
- and that {{PageSwapEvent/activation}}'s
- {{NavigationActivation/entry}}'s
- {{NavigationHistoryEntry/url}} is non-null,
- then that
- {{NavigationHistoryEntry/url}}.
-
- NOTE: This part does expose the result of redirects.
-
- NOTE: This part is not relevant to normal page rendering.
- However, it can be relevant to what is rendered
- when [=capturing the image=]
- for a [[css-view-transitions-2#cross-document-view-transitions|cross-document view transition]].
-
- ISSUE: Is the final "non-null" check needed?
-
- 1. otherwise, the [=ongoing navigate event=]'s
- {{NavigateEvent/destination}}'s
- {{NavigationDestination/url}}
-
- NOTE: This part does not expose the result of redirects.
-
- ISSUE: This assumes that the [=ongoing navigate event=]
- and the [=transition=] have the same lifetime,
- but this isn't really
- true if the event is intercepted.
- After
- whatwg/html#11690 /
- whatwg/html#11692.
- we could probably define this more like "from" above.
- But which lifetime is the one we want?
-
- NOTE: This part is for when the old document in the navigation
- is still the current document.
-
-1. If the [=document's navigation API=] of the document is non-null and
- its [=activation=] is non-null,
- the document's [=has been revealed=] is false or
- was false at the start of the current [=task=],
- and the activation's {{NavigationActivation/entry}}'s
- {{NavigationHistoryEntry/url}}.
-
- NOTE: This part is for when the new document in the navigation
- has become the current document.
-
- ISSUE: Does it make sense to expose this when
- the activation's {{NavigationActivation/from}} is null,
- and thus there is no [=current from URL=]?
-
-1. Otherwise, null.
-
- NOTE: The previous two branches can also produce null results.
-
-ISSUE: The above definitions of from and to apparently don't work right
-if you start a same-document navigation (e.g., with {{History/pushState}})
-in the middle of a cross-document navigation.
+
Processing model
-The current other URL of a [=/document=] is a URL or null.
-It is defined as follows:
+The at rules and pseudo-classes defined in this document rely on the [=current navigation state=].
-1. ISSUE: Write this!
+A navigation state is a [=struct=] with the following items:
-The current navigation type of a [=/document=] is a {{NavigationType}} or null.
-It is defined as follows:
+
+ : old URL
+ : new URL
+ :: a [=/URL=]
+
+ : type
+ :: a {{NavigationType}}
+
+ : old index
+ : new index
+ :: an integer
-1. If the [=document's navigation API=] of the document is non-null and
- its [=transition=] is non-null,
- the transition's {{NavigationTransition/navigationType}}.
+ : phase
+ :: `loading`, `ready`, or `committed`.
- NOTE: This part is for when the old document in the navigation
- is still the current document.
+ : source element
+ :: null or an {{Element}}.
+
-1. If the [=document's navigation API=] of the document is non-null and
- its [=activation=] is non-null,
- the document's [=has been revealed=] is false or
- was false at the start of the current [=task=],
- the activation's {{NavigationActivation/navigationType}}.
+
+To get the current navigation state of a {{Document}} |document|:
- NOTE: This part is for when the new document in the navigation
- has become the current document.
+1. If |document| is not [=Document/fully active=], return null.
-1. Otherwise, null.
+1. Let |navigation| be |document|'s [=relevant global object=]'s [=navigation API=].
-The current navigation delta of a [=/document=] is a {{NavigationType}} or null.
-It is defined as follows:
+1. Let |activation| be |navigation|'s {{Navigation/activation}}.
-1. If the [=document's navigation API=] of the document is non-null and
- its [=transition=] is non-null,
+1. If |document| has not [=has been revealed|been revealed=]:
+ 1. If |activation| is null, return null.
- 1. If the transition's {{NavigationTransition/navigationType}} is not {{NavigationType/traverse}}, null.
+ 1. [=Assert=]: |activation|'s {{NavigationActivation/entry}} is not null.
- 1. Otherwise,
- the transition's {{NavigationTransition/to}}'s {{NavigationDestination/index}}
- minus
- the transition's {{NavigationTransition/from}}'s {{NavigationHistoryEntry/index}}.
+ 1. Return a new [=navigation state=] whose
+ [=navigation state/old URL=] is |activation|'s {{NavigationActivation/from}}'s {{NavigationHistoryEntry/url}},
+ [=navigation state/new URL=] is |activation|'s {{NavigationActivation/entry}}'s {{NavigationHistoryEntry/url}},
+ [=navigation state/type=] is |activation|'s {{NavigationActivation/navigationType}},
+ [=navigation state/old index=] is |activation|'s {{NavigationActivation/from}}'s {{NavigationHistoryEntry/index}},
+ [=navigation state/new index=] is |activation|'s {{NavigationActivation/entry}}'s {{NavigationHistoryEntry/index}},
+ [=navigation state/phase=] is `committed`,
+ and [=navigation state/source element=] is null.
- NOTE: This part is for when the old document in the navigation
- is still the current document.
+ Note: this means that navigations that occur before the page is revealed, e.g. calling {{History/pushState()}} in the head do not reflect in CSS.
-1. If the [=document's navigation API=] of the document is non-null,
- its [=activation=] is non-null,
- the activation's {{NavigationActivation/from}} is non-null, and
- the document's [=has been revealed=] is false or
- was false at the start of the current [=task=],
+1. Let |navigateEvent| be the [=ongoing navigate event=] of |navigation|.
- 1. If the activation's {{NavigationActivation/navigationType}} is not {{NavigationType/traverse}}, null.
+1. Let |phase| be `loading`.
- 1. Otherwise,
- the activation's {{NavigationActivation/entry}}'s {{NavigationHistoryEntry/index}}
- minus
- the activation's {{NavigationActivation/from}}'s {{NavigationHistoryEntry/index}}.
+1. If |navigateEvent| is null and |navigation|'s [=traversing navigate event=] is not null:
+ 1. Set |navigateEvent| to |navigation|'s [=traversing navigate event=].
- NOTE: This part is for when the new document in the navigation
- has become the current document.
+ 1. Set |phase| to `ready`.
-1. Otherwise, null.
+1. If |navigateEvent| is null, return null.
-ISSUE: Generally improve integration with the HTML spec for these definitions,
-instead of monkeypatching.
-This includes the interaction with [=has been revealed=]
-and the interaction with the {{pageswap}} event,
-and other things where this section links to non-exported definitions.
+1. Return a new [=navigation state=] whose
+ [=navigation state/old URL=] is |document|'s [=Document/URL=],
+ [=navigation state/new URL=] is |navigateEvent|'s {{NavigateEvent/destination}}'s {{NavigationDestination/url}},
+ [=navigation state/type=] is |ongoingNavigateEvent|'s {{NavigateEvent/navigationType}},
+ [=navigation state/old index=] is |navigation|'s [=navigation API/current entry=]'s {{NavigationHistoryEntry/index}},
+ [=navigation state/new index=] is |navigateEvent|'s {{NavigateEvent/destination}}'s {{NavigationDestination/index}},
+ [=navigation state/phase=] is |phase|,
+ and [=navigation state/source element=] is |ongoingNavigateEvent|'s {{NavigateEvent/sourceElement}}.
-ISSUE: Generally figure out if these definitions should care about
-the [=ongoing navigate event=] or the [=transition=].
+
-
The ''url-pattern()'' function
+To get the current navigation URL given a {{Document}} |document| and a <> |relation|:
-
-
-The url-pattern() function represents a [=URL pattern=],
-which can be used to match URLs.
-
-
-<> = url-pattern( <> )
-
+: ''from''
+:: |state|'s [=navigation state/old URL=].
-This function represents a [=URL pattern=] that can be created
-using the steps of the create a URL pattern for url-pattern() algorithm:
+: ''at''
+:: |state|'s [=navigation state/new URL=] if |state|'s [=navigation state/phase=] is `committed`; Otherwise |state|'s [=navigation state/old URL=].
-1. Let arg be the <> argument to the ''url-pattern()'' function.
+: ''with''
+:: |state|'s [=navigation state/old URL=] if |state|'s [=navigation state/phase=] is `committed`; Otherwise |state|'s [=navigation state/new URL=].
-1. Let baseURL be the [=style resource base URL=] of
- the rule or declaration block containing the ''url-pattern()'' function.
+
-
- Do we want this to be the base URL all the time?
- For use of ''url-pattern()'' in ''@navigation'',
- it's likely more useful for the base URL
- to be the document URL rather than the style sheet URL.
- However, it would be very awkward for ''url-pattern()''
- to be inconsistent with ''url()''.
-
- Should we allow the base URL of ''url-pattern()''
- to be defined by the consumer?
- Should we introduce document-url-pattern()?
- Should we do something similar to
- [[css-images-3#ambiguous-urls]]
- (see )?
-
- Also see other proposed uses of {{URLPattern}} in CSS
- in ,
- for '':local-link''.
-
+To get the current navigation type of a [=/document=] |document|:
+ 1. If |document|'s [=current navigation state=] is non-null, return its [=navigation state/type=].
+ 1. Return null.
-1. Return the result of [=URL pattern/create|create a URL pattern=] given
- arg, baseURL, and an empty [=map=].
+The traversing navigate event is the [=ongoing navigate event=] which was reset when the [=ongoing navigation=] is set to `traversal`.
-NOTE: This function requires that its argument is quoted.
-This differs from the ''url()'' function,
-which allows its argument to be quoted or unquoted.
-To serialize a ''url-pattern()'' function f,
-[=serialize a function=] f,
-using [=serialize a string=] on the single argument
-to serialize f's contents.
-NOTE: This is defined this way because {{URLPattern}}
-intentionally does not provide a serialization.
+ISSUE: Improve integration with the HTML standard, especially the concept of [=traversing navigate event=] and unexported definitions.
Privacy Considerations
diff --git a/css-overflow-3/Overview.bs b/css-overflow-3/Overview.bs
index 7b02a033ee6c..1906c5fa7997 100644
--- a/css-overflow-3/Overview.bs
+++ b/css-overflow-3/Overview.bs
@@ -91,11 +91,12 @@ Introduction
which makes sense when the author's intent
is that the content not be shown.
- This specification introduces the long-standing de-facto 'overflow-x' and 'overflow-y' properties,
+ This specification defines the long-standing de-facto 'overflow-x' and 'overflow-y' properties,
adds a ''overflow/clip'' value,
+ introduces an 'overflow-clip-margin' property,
and defines overflow handling more fully.
-
- [Something something 'max-lines'.]
+ It also introduces control over smooth scrolling via 'scroll-behavior'
+ and for reserving space for the scrollbar via 'scrollbar-gutter'.
Note: This specification also reproduces the definition of the 'text-overflow' property
previously defined in [[CSS-UI-3]],
@@ -123,6 +124,11 @@ Module Interactions
and [[!CSS-UI-3]] section
5.2. Overflow Ellipsis: the text-overflow property.
+ When applied to 'display: table' elements,
+ the properties defined in this module apply to the [=table grid box=]
+ (not the [=table wrapper box=]).
+ [[!CSS2]] [[!CSS-TABLES-3]]
+
-
- Note: The scrollable overflow rectangle is always a rectangle
- in the box's own coordinate system, but might be non-rectangular
- in other coordinate systems due to transforms [[CSS3-TRANSFORMS]].
- This means scrollbars can sometimes appear when not actually necessary.
+ See [[#scrollable-overflow-calculation]] for details.
Scrolling Overflow
@@ -336,8 +234,9 @@ Scrolling Overflow
(through which the scrollable overflow area can be viewed)
coincides with its padding box,
and is called the scrollport.
- A box’s nearest scrollport
- is the [=scrollport=] of its nearest [=scroll container=] ancestor.
+ A box’s nearest scroll container
+ is the nearest [=scroll container=] ancestor in the [=containing block chain=].
+ (See [[#overflow-properties]] for control over whether a box clips or scrolls its overflow.)
Scrolling operations can be initiated by the user
(for example, by manipulating a scrollbar, swiping a touchscreen, or using keyboard controls)
@@ -364,12 +263,6 @@ Scrolling Overflow
Unless otherwise specified,
it is the [=block-start=] [=inline-start=] corner of the [=scrollable overflow rectangle=].
(For example, in a [=flex container=] it is the [=main-start=] [=cross-start=] corner.)
- Unless otherwise adjusted
- (e.g. [[css-align-3#overflow-scroll-position|by content alignment]] [[css-align-3]]),
- the area beyond the [=scroll origin=] in either axis
- is considered the unreachable scrollable overflow region:
- content rendered here is not accessible to the reader,
- see [[#scrollable]].
A [=scroll container=] is said to be scrolled to its [=scroll origin=]
when its [=scroll origin=] coincides with the corresponding corner of its [=scrollport=].
This [=scroll position=], the scroll origin position,
@@ -392,6 +285,13 @@ Scrolling Overflow
or away from the [=scroll origin=] is not defined.
Should each API define its coordinate model?
+ Unless otherwise adjusted
+ (e.g. [[css-align-3#overflow-scroll-position|by content alignment]] [[css-align-3]]),
+ the area beyond the [=scroll origin=] in either axis
+ is considered the unreachable scrollable overflow region:
+ content rendered here is not accessible to the reader,
+ see [[#scrollable]].
+
The root viewport, which scrolls the page [=canvas=],
uses the principal writing mode for determining
its [=scroll origin=] and [=initial scroll position=].
@@ -421,20 +321,39 @@ Scrolling Overflow
-->
-Scrolling and Clipping Overflow
+Clipping and Scrolling Overflow
+
+ The properties in this chapter specify whether and where a box’s [=overflow=] is clipped;
+ if so, whether it is a [=scroll container=];
+ and if so, in which axis(es) it is allowed to scroll (its scrollable axis(es)),
+ thus which of the following types of [=scroll container=] it is:
+
+
+
single-axis scroll container
+
+ A [=scroll container=] that is scrollable in only one axis.
+
+
dual-axis scroll container
+
+ A [=scroll container=] that is scrollable in both axes.
+
+
block-axis scroll container
+
inline-axis scroll container
+
x-axis scroll container
+
y-axis scroll container
+
+ A [=scroll container=] that is scrollable in the specified axis,
+ regardless of whether it can also scroll in the other axis.
+
Managing Overflow: the 'overflow-x', 'overflow-y', and 'overflow' properties
- These properties specify whether a box’s [=overflow=] is clipped,
- and if so,
- whether it is a [=scroll container=].
-
Name: overflow-x, overflow-y, overflow-block, overflow-inline
Value: visible | hidden | clip | scroll | auto
Initial: ''visible''
- Applies to: block containers [[!CSS2]], flex containers [[!CSS3-FLEXBOX]], grid containers [[!CSS3-GRID-LAYOUT]]
+ Applies to: [=block containers=] [[!CSS2]], [=flex containers=] [[!CSS-FLEXBOX-1]], [=grid containers=] [[!CSS-GRID-1]], and [=table grid boxes=] [[!CSS-TABLES-3]]
Inherited: no
Logical property group: overflow
Percentages: N/A
@@ -479,7 +398,6 @@ Managing Overflow: the 'overflow-x', 'overflow-y', and 'overflow' properties
There is no special handling of overflow, that is,
the box’s content is rendered outside the box if positioned there.
- The box is not a scroll container.
hidden
@@ -491,8 +409,7 @@ Managing Overflow: the 'overflow-x', 'overflow-y', and 'overflow' propertiesscroll container.
+ for example using the mechanisms defined in [[CSSOM-VIEW]].
clip
@@ -503,8 +420,7 @@ Managing Overflow: the 'overflow-x', 'overflow-y', and 'overflow' propertiesscroll container.
+ through any mechanism.
Unlike ''hidden'', this value does not cause
the element to establish a new formatting context.
@@ -516,8 +432,8 @@ Managing Overflow: the 'overflow-x', 'overflow-y', and 'overflow' properties
This value indicates that
the content is clipped to the [=overflow clip edge=],
- but can be scrolled into view
- (and therefore the box is a scroll container).
+ but can be scrolled into view.
+
Furthermore, if the user agent uses a scrolling mechanism
that is visible on the screen (such as a scroll bar or a panner),
that mechanism should be displayed
@@ -539,25 +455,31 @@ Managing Overflow: the 'overflow-x', 'overflow-y', and 'overflow' properties
The ''overflow/scroll'', ''overflow/auto'', and ''overflow/hidden'' values
- are known as the scrollable values of 'overflow'.
+ are known as the scrollable values of 'overflow'.
+ They cause the box to be a [=scroll container=]
+ and the affected axis to be a [=scrollable axis=].
+ A [=block box=] that becomes a [=scroll container=]
+ also establishes an [=independent formatting context=].
+
The ''overflow/visible'' and ''overflow/clip'' values
are known as the non-scrollable values.
-
- The ''visible''/''overflow/clip'' values of 'overflow'
- compute to ''overflow/auto''/''hidden'' (respectively)
- if one of 'overflow-x' or 'overflow-y' is neither ''visible'' nor ''overflow/clip''.
- On [=replaced elements=],
- a [=computed value|computed=] ''overflow/hidden'' value further resolves
- to a [=used value=] of ''overflow/clip''.
-
- If the computed value of 'overflow' on a block box
- is neither ''overflow/visible'' nor ''overflow/clip'' nor a combination thereof,
- it [=establishes an independent formatting context=] for its contents.
+ However, if the other axis specifies a [=scrollable value=],
+ a specified value of ''visible''
+ [=computed value|computes=] to ''overflow/auto'',
+ enabling scrolling in its axis.
+ If neither axis computes to a [=scrollable value=],
+ the box is not a [=scroll container=].
+ If only one axis computes to a [=scrollable value=]
+ (i.e. the other axis is ''overflow/clip''),
+ the box is a [=single-axis scroll container=].
User agents must also support
the overlay keyword
as a [=legacy value alias=] of ''overflow/auto''.
+ Note: The 'overflow' properties are expanded to apply to [=replaced elements=]
+ in Level 4.
+
Interaction of 'visibility' and 'overflow'
@@ -618,6 +540,37 @@ Overflow in Print and Other Static Media
for example, e-book readers paginate content,
but are interactive.
+
+Overflow Viewport Propagation
+
+ UAs must apply the 'overflow' values
+ set on the root element to the viewport
+ when the root element’s 'display' value is not ''display/none''.
+ However,
+ when the root element is an [[!HTML]] <{html}> element
+ (including XML syntax for HTML)
+ whose 'overflow' value is ''overflow/visible'' (in both axes),
+ and that element has as a child
+ a <{body}> element whose 'display' value is also not ''display/none'',
+ user agents must instead apply the 'overflow' values
+ of the first such child element to the viewport.
+ The element from which the value is propagated must then have
+ a used 'overflow' value of ''overflow/visible''.
+
+ Note: Using [=containment=] on the HTML <{html}> or <{body}> elements disables
+ this special handling of the HTML <{body}> element.
+ See the [[CSS-CONTAIN-1#contain-property]] for details.
+
+ Note: ''overflow: hidden'' on the root element
+ might not clip everything outside the [=Initial Containing Block=]
+ if the ICB is smaller than the viewport,
+ which can happen on mobile.
+
+ If ''overflow/visible'' is applied to the viewport,
+ it must be interpreted as ''overflow/auto''.
+ If ''overflow/clip'' is applied to the viewport,
+ it must be interpreted as ''overflow/hidden''.
+
Expanding Clipping Bounds: the 'overflow-clip-margin' property
@@ -668,46 +621,135 @@ Expanding Clipping Bounds: the 'overflow-clip-margin' property
* the [=overflow clip edge=] is clamped to stay within the element's [=padding box=].
(This does not affect the [=computed value|computed=] or [=used value=] of this property.)
- * the ''border-box'' value
- behaves as ''padding-box''
- and ignores any specified offset.
+ * the ''overflow-clip-margin/border-box'' value
+ ignores any specified offset
+ (and, due to the previous bullet point,
+ effectively acts as ''overflow-clip-margin/padding-box'')
Note: This property was previously defined to only affect ''overflow: clip''.
It now also affects [=scroll containers=],
but only to shrink the clipping edge.
+
+ Its own [=padding box=].
- UAs must apply the 'overflow-*' values
- set on the root element to the viewport
- when the root element’s 'display' value is not ''display/none''.
- However,
- when the root element is an [[!HTML]] <{html}> element
- (including XML syntax for HTML)
- whose 'overflow' value is ''overflow/visible'' (in both axes),
- and that element has as a child
- a <{body}> element whose 'display' value is also not ''display/none'',
- user agents must instead apply the 'overflow-*' values
- of the first such child element to the viewport.
- The element from which the value is propagated must then have
- a used 'overflow' value of ''overflow/visible''.
+
+ All [=line boxes=] it directly contains.
- Note: Using [=containment=] on the HTML <{html}> or <{body}> elements disables
- this special handling of the HTML <{body}> element.
- See the [[CSS-CONTAIN-1#contain-property]] for details.
+
+ The border boxes
+ of all boxes for which it is the containing block
+ and whose border boxes are positioned not wholly
+ within its [=unreachable scrollable overflow region=] (if any),
+ accounting for transforms by projecting each box onto
+ the plane of the element that establishes its 3D rendering context.
+ [[!CSS3-TRANSFORMS]]
- Note: ''overflow: hidden'' on the root element
- might not clip everything outside the [=Initial Containing Block=]
- if the ICB is smaller than the viewport,
- which can happen on mobile.
+ Issue: Is this description of handling transforms
+ sufficiently accurate?
- If ''overflow/visible'' is applied to the viewport,
- it must be interpreted as ''overflow/auto''.
- If ''overflow/clip'' is applied to the viewport,
- it must be interpreted as ''overflow/hidden''.
+ Border boxes with zero area
+ do not affect the [=scrollable overflow area=].
+
+
+ The margin areas of grid item and flex item boxes
+ for which the box establishes a containing block.
+
+ The UA may additionally include
+ the margin areas of other boxes
+ for which the box establishes a containing block;
+ however,
+ the conditions under which such margin areas are included
+ is undefined in this level.
+ This needs further testing and investigation;
+ is therefore deferred in this draft.
+
+
+ The [=scrollable overflow rectangles=] of all of the above boxes
+ (including zero-area boxes),
+ clipped to their [=overflow clip edge=]
+ if 'overflow' is not ''overflow/visible'' or 'contain' applies ''contain/paint'',
+ and accounting for transforms as described above.
+
+ Note: The 'clip', 'clip-path', and 'mask-*' properties [[!CSS-MASKING-1]]
+ do not affect the scrollable overflow area.
+ Only effects that clip to the [=overflow clip edge=] are taken into account.
+
+ Note: The [=scrollable overflow rectangle=] is always a rectangle
+ in its box's own coordinate system, but might be non-rectangular
+ in ancestor coordinate systems due to transforms [[CSS3-TRANSFORMS]].
+ This means scrollbars can sometimes appear when not actually necessary.
+
+
+ Additional padding added
+ to the [=scrollable overflow rectangle=]
+ as necessary to enable scroll positions
+ that satisfy the requirements of both
+ ''place-content: start'' and ''place-content: end'' alignment.
+
+ Note: This padding represents,
+ within the [=scrollable overflow rectangle=],
+ the box’s own padding
+ so that when its content is scrolled to its end,
+ there is padding between the edge of its [=in-flow=] (or floated) content
+ and the border edge of the box.
+ It typically ends up being exactly the same size as the box's own padding,
+ except in a few cases--
+ such as when an [=out-of-flow=] positioned element,
+ or the visible overflow of a descendent,
+ has already increased the size of the [=scrollable overflow rectangle=]
+ outside the conceptual “content edge” of the [=scroll container=]’s content.
+
+
+
+
+ Issue: Replace this image with a proper SVG.
+
+
+
+
+
+ Additionally, due to Web-compatibility constraints
+ (caused by authors exploiting legacy bugs to surreptitiously hide content from visual readers but not search engines and/or speech output),
+ UAs must clip any content in the [=unreachable scrollable overflow region=].
+
+ Note: The [=content-distribution properties=] can
+ [[css-align-3#overflow-scroll-position|alter the unreachable scrollable overflow region]]
+ to ensure that a [=scroll container=]’s [=alignment subject=]
+ is reachable after alignment.
+ [[css-align-3]]
+
+
+
+
+Scrolling Behaviors and Animations
+CSS provides several controls over how scrolling behaves when triggered.
+ * CSS Scroll Snap allows defining "snap positions",
+ which are scroll positions to which the [=scroll container=] is biased to land.
+ * CSS Overscroll Behavior
+ allows controlling what happens when scrolling past the end of the scrollable area.
+ * 'scroll-behavior', defined below, controls whether programmatic scrolling animates smoothly or not.
+
+ Note: For animating other things in conjunction with scrolling, see [[SCROLL-ANIMATIONS-1]].
Smooth Scrolling: the 'scroll-behavior' Property
@@ -1298,6 +1340,15 @@ ellipsis interaction with scrolling interfaces
This appendix is informative.
+ Significant changes since the 7 October 2025 Working Draft:
+ * Allow combining ''overflow: clip'' behavior in one axis with scrolling in the other,
+ to allow single-axis trapping for e.g. [=sticky positioning=].
+ (Issue 12289)
+ * Clarify which clipping affects limit contributions to the scrollable overflow area of the nearest [=scroll container=].
+ (Issue 8607)
+ * Clarify application of 'overflow' to tables.
+ (Isue 10881)
+
Significant changes since the 29 March 2023 Working Draft:
* Define that ''overflow: hidden'' is treated as ''overflow: clip'' on [=replaced elements=].
diff --git a/css-overflow-4/Overview.bs b/css-overflow-4/Overview.bs
index 260683891551..bda42d7115cd 100644
--- a/css-overflow-4/Overview.bs
+++ b/css-overflow-4/Overview.bs
@@ -24,6 +24,7 @@ spec:css-pseudo-4; type:selector; text:::first-letter
spec:css-pseudo-4; type:selector; text:::first-line
spec:css-writing-modes-4; type:dfn; text:start
spec:css-writing-modes-4; type:dfn; text:end
+spec:dom; type:dfn; for: Document; text:mode
url: https://drafts.csswg.org/selectors-3/#subject; type: dfn; text: subject;
@@ -925,11 +926,23 @@ Indicating Block-Axis Overflow: the 'block-ellipsis' property
If this results in the entire contents of the line box being displaced,
the line box is considered to contain a [=strut=], as defined in [[CSS2/visudet#leading]].
+
+ This requirement applies regardless of the document's [=mode=],
+ and is not affected by the [[quirks#the-blocks-ignore-line-height-quirk|line-height quirk]].
+
+
+
block-ellipsis-016.html
block-ellipsis-018.html
block-ellipsis-025.html
+ block-ellipsis-quirk-001.html
Displacing content to make room for the [=block overflow ellipsis=]
@@ -1305,6 +1318,7 @@ Forcing a Break After a Set Number of Lines: the 'max-lines' property
webkit-line-clamp-013.html
webkit-line-clamp-027.html
webkit-line-clamp-029.html
+ line-clamp-with-floats-007.html
Note: This implies that 'max-lines' has no effect when applied to [=multi-column containers=],
@@ -1696,6 +1710,8 @@ Handling of Excess Content: the 'continue' property
line-clamp-033.html
line-clamp-auto-033.html
line-clamp-auto-with-ruby-002.html
+ line-clamp-with-floats-003.html
+ line-clamp-with-floats-004.html
- Any [=line boxes=] that follow the [=clamp point=]
@@ -1759,6 +1775,7 @@ Handling of Excess Content: the 'continue' property
is always counted as [=ink overflow=] rather than [=scrollable overflow=].
+ line-clamp-with-floats-010.html
line-clamp-021.html
line-clamp-with-abspos-019.html
@@ -1768,12 +1785,20 @@ Handling of Excess Content: the 'continue' property
Within a [=line-clamp container=],
floats which have not been made into [=invisible boxes=]
- must be visually clipped to the [=content edge=]
+ must be visually clipped to the [=block-end=] [=content edge=]
of the [=line-clamp container=].
They do not introduce any clearance
that would make the [=line-clamp container=] increase its height,
and do not contribute to the [=scrollable overflow area=].
+
+ line-clamp-with-floats-001.html
+ line-clamp-with-floats-002.html
+ line-clamp-with-floats-005.html
+ line-clamp-with-floats-006.html
+ line-clamp-with-floats-010.html
+
+
If a [=block container=] contains a [=clamp point=],
within itself or in any of its descendants,
its [=automatic block size=] will not take into account any invisible boxes,
diff --git a/css-pseudo-4/Overview.bs b/css-pseudo-4/Overview.bs
index 996d4ced6af1..331854a6d17f 100644
--- a/css-pseudo-4/Overview.bs
+++ b/css-pseudo-4/Overview.bs
@@ -1810,7 +1810,9 @@ Additions to the CSS Object Model
The type attribute
is a string representing the type of the pseudo-element.
- This can be one of the following values:
+ This can be any standardized [=tree-abiding pseudo-element=]
+ that is not an [=element-backed pseudo-element=],
+ for example:
"::before"
@@ -1819,6 +1821,10 @@ Additions to the CSS Object Model
Represents the ''::after'' pseudo-element.
"::marker"
Represents the ''::marker'' pseudo-element.
+
"::backdrop"
+
Represents the ''::backdrop'' pseudo-element.
+
"::view-transition"
+
Represents the ''::view-transition'' pseudo-element.
The element attribute is the
@@ -1881,7 +1887,13 @@ Additions to the CSS Object Model
2. If |type| is failure,
return null.
- 3. Otherwise, return the {{CSSPseudoElement}} object
+ 3. If |type| is an [=element-backed pseudo-element=],
+ return null.
+
+ 4. If |type| is not a [=tree-abiding pseudo-element=],
+ return null.
+
+ 5. Otherwise, return the {{CSSPseudoElement}} object
representing the pseudo-element
that would match the selector |type|
with [=this=] as its [=originating element=].
diff --git a/css-shapes-1/Overview.bs b/css-shapes-1/Overview.bs
index f7764d0735a8..ab9d65831346 100644
--- a/css-shapes-1/Overview.bs
+++ b/css-shapes-1/Overview.bs
@@ -329,6 +329,11 @@ Basic Shapes
The <basic-shape> type
can be specified using basic shape functions.
+
+
+ <> = <> | <> | <> | <> | <> | <>
+
+
When using this syntax
to define shapes,
the reference box is defined
@@ -460,7 +465,7 @@ Supported Shapes
shape-functions/xywh-function-valid.html
-
rect() =
+
rect()
Defines a rectangle
via insets from the top and left edges of the [=reference box=].
diff --git a/css-shapes-2/Overview.bs b/css-shapes-2/Overview.bs
index 8fa209b74d03..90d54b081257 100644
--- a/css-shapes-2/Overview.bs
+++ b/css-shapes-2/Overview.bs
@@ -125,6 +125,13 @@ Basic Shapes
level 1
section.
+ This level extends the <> functions
+ to include ''shape()'':
+
+
+ <> = <> | <> | <> | <> | <> | <>
+
+
Supported Shapes
diff --git a/css-sizing-4/responsive-iframes-explainer.md b/css-sizing-4/responsive-iframes-explainer.md
index a1c0912328f7..464487f10cb6 100644
--- a/css-sizing-4/responsive-iframes-explainer.md
+++ b/css-sizing-4/responsive-iframes-explainer.md
@@ -29,9 +29,9 @@ In general, there is a lot of demand for this feature, as evidenced by:
## Solution
-The embedding document opts in via the `contain-intrinsic-size: from-element` CSS property on the `