diff --git a/files/en-us/web/css/reference/properties/width/index.md b/files/en-us/web/css/reference/properties/width/index.md index 2fcb041b063d622..1699f2b9f53e0f1 100644 --- a/files/en-us/web/css/reference/properties/width/index.md +++ b/files/en-us/web/css/reference/properties/width/index.md @@ -59,8 +59,6 @@ The specified value of `width` applies to the content area so long as its value /* values */ width: 300px; width: 25em; -width: anchor-size(width); -width: anchor-size(--my-anchor inline, 120%); /* value */ width: 75%; @@ -69,10 +67,15 @@ width: 75%; width: max-content; width: min-content; width: fit-content; -width: fit-content(20em); width: auto; width: stretch; +/* function values */ +width: fit-content(20em); +width: anchor-size(width); +width: anchor-size(--my-anchor inline, 120%); +width: calc-size(max-content, size / 2); + /* Global values */ width: inherit; width: initial; @@ -95,8 +98,12 @@ width: unset; - : The intrinsic minimum width. - {{cssxref("fit-content")}} - : Use the available space, but not more than [max-content](/en-US/docs/Web/CSS/Reference/Values/max-content), i.e., `min(max-content, max(min-content, stretch))`. +- {{cssxref("anchor-size()")}} + - : Sets the width relative to a dimension of an anchor element. When defining the `width` of an anchor-positioned element, the first parameter defaults to the associated anchor's width. If applied to a non-anchor-positioned element, it sets the width to the fallback value. If no fallback is defined, the declaration is ignored. +- {{cssxref("calc-size()")}} + - : Sets the width to a modified intrinsic size. - [`fit-content()`](/en-US/docs/Web/CSS/Reference/Values/fit-content_function) - - : Uses the fit-content formula with the available space replaced by the specified argument, i.e., `min(max-content, max(min-content, ))`. + - : Uses the fit-content formula with the available space replaced by the specified argument, clamping the width according to the formula `min(maximum size, max(minimum size, ))`. - `stretch` - : Sets the width of the element's [margin box](/en-US/docs/Learn_web_development/Core/Styling_basics/Box_model#parts_of_a_box) to the width of its [containing block](/en-US/docs/Web/CSS/Guides/Display/Containing_block#identifying_the_containing_block). It attempts to make the margin box fill the available space in the containing block, so in a way behaving similar to `100%` but applying the resulting size to the margin box rather than the box determined by [box-sizing](/en-US/docs/Web/CSS/Reference/Properties/box-sizing). @@ -119,23 +126,57 @@ Ensure that elements set with a `width` aren't truncated and/or don't obscure ot ### Default width +This example demonstrates basic usage and the default `auto` value. + +#### HTML + +We include two paragraphs; one with a class name. + +```html +

The MDN community writes really great documentation.

+

The MDN community writes really great documentation.

+``` + +#### CSS + +We make all paragraphs have a gold background, explicitly setting the second paragraph's `width` to `auto`. + ```css -p.gold { +p { background: gold; } +p.has-width { + width: auto; +} ``` +#### Results + +{{EmbedLiveSample("Default width", 600, 100)}} + +As `width` defaults to `auto`, both paragraphs are the same width. + +### Using length units + +This example demonstrates length width values. + +#### HTML + +We include two {{htmlelement("div")}} elements with some text. + ```html -

The MDN community writes really great documentation.

+
Width measured in px
+
Width measured in em
``` -{{EmbedLiveSample('Default_width', '500px', '64px')}} +#### CSS -### Example using pixels and ems +The `px_length` element is set to `200px` while the `em_length` element is set to be `20em` wide. Both elements also have different {{cssxref("background-color")}}, {{cssxref("color")}}, and {{cssxref("border")}} values to enable differentiating between the two when rendered. ```css .px_length { width: 200px; + background-color: red; color: white; border: 1px solid black; @@ -143,92 +184,125 @@ p.gold { .em_length { width: 20em; + background-color: white; color: red; border: 1px solid black; } ``` +#### Results + +{{EmbedLiveSample("Using length units", 600, 60)}} + +The `px_length` element will always be 200px wide. The rendered width of the `em_length` element depends on the font size. + +### Using percentages + +This example demonstrates using percentage values. + +#### HTML + +We include one {{htmlelement("div")}} element with some text. + ```html -
Width measured in px
-
Width measured in em
+
Width in percentage
``` -{{EmbedLiveSample('Example using pixels and ems', '500px', '64px')}} +#### CSS -### Example with percentage +We set the `width` of the element to be `20%` of the width of its parent container. ```css .percent { width: 20%; + background-color: silver; border: 1px solid red; } ``` -```html -
Width in percentage
-``` +#### Results -{{EmbedLiveSample('Example using percentage', '500px', '64px')}} +{{EmbedLiveSample("Using percentages", 600, 60)}} -### Example using "max-content" +### Using intrinsic sizes -```css -p.max-green { - background: lightgreen; - width: max-content; -} -``` +This example compares `max-content` and `min-content`, and introduces `calc-size`. + +#### HTML + +We include three paragraphs with the same content; just their class names differ. ```html

The MDN community writes really great documentation.

+

The MDN community writes really great documentation.

+

The MDN community writes really great documentation.

``` -{{EmbedLiveSample('Example using "max-content"', '500px', '64px')}} +#### CSS -### Example using "min-content" +We set one paragraph's `width` to `max-content`, the second to `min-content`, and the third to be twice the size of the `min-content` by using the `calc-size()` function. Each is given a different {{cssxref("background-color")}} and {{cssxref("border-style")}} to enable differentiating between the two. ```css +p.max-green { + width: max-content; + + background-color: lightgreen; + border-style: dotted; +} + p.min-blue { - background: lightblue; width: min-content; + + background-color: lightblue; + border-style: dashed; +} + +p.min-pink { + width: calc-size(min-content, size * 2); + + background-color: pink; + border-style: solid; } ``` -```html -

The MDN community writes really great documentation.

+```css hidden +@supports not (width: calc-size(min-content, size * 2)) { + body::after { + content: "Your browser doesn't support the calc-size() function yet."; + background-color: wheat; + display: block; + text-align: center; + padding: 1em; + } +} ``` -{{EmbedLiveSample('Example using "min-content"', '500px', '155px')}} +#### Results + +{{EmbedLiveSample("Using intrinsic sizes", 600, 230)}} + +The `max-content` example is as wide as the text. The `min-content` example is as wide as the widest word. The `calc-size()` example is set to be twice as wide as the `min-content`. -### Stretch width to fill the containing block +### Using the stretch keyword + +This example demonstrates the `stretch` value within a [flex](/en-US/docs/Web/CSS/Guides/Flexible_box_layout) container. #### HTML +We include a parent container with two child elements. + ```html
text
-
- -
stretch
``` #### CSS -```css hidden -@supports not (width: stretch) { - .parent { - display: none !important; - } - - body::after { - content: "Your browser doesn't support the `stretch` value yet."; - } -} -``` +We use the {{cssxref("display")}} property to make the parent a flex container, and set the second child's `width` the `stretch`. ```css .parent { @@ -247,9 +321,83 @@ p.min-blue { } ``` +```css hidden +@supports not (width: stretch) { + body::after { + content: "Your browser doesn't support the stretch value yet."; + background-color: wheat; + display: block; + text-align: center; + padding: 1em; + } +} +``` + #### Result -{{EmbedLiveSample('Stretch width to fill the containing block', 'auto', 250)}} +{{EmbedLiveSample("Using the stretch keyword", "auto", 100)}} + +By default, flex items are as wide as their content. The `stretch` value makes the element as wide as the available space allows, with the element's margin box otherwise clamped to the width of its containing block. + +### Using the anchor-size() function + +This example demonstrates using the `anchor-size()` function to define the width of an anchor-positioned element; we defined its width as a multiple of its anchor's height. + +#### HTML + +We specify two {{htmlelement("div")}} elements: one `anchor` element and one `infobox` element that we'll position relative to the anchor. + +```html +
⚓︎
+ +
+

Infobox.

+
+``` + +#### CSS + +We declare the `anchor` `
` as an anchor element by giving it an {{cssxref("anchor-name")}}. The positioned element has its {{cssxref("position")}} property set to `absolute`, and is associated with the anchor element via its {{cssxref("position-anchor")}} property. We also set absolute {{cssxref("height")}} and {{cssxref("width")}} dimensions on the anchor and define the width of the anchor-positioned element to be the width of the anchor using the `anchor-size()` function as the value of the `width` property. As a bonus, we also use the `anchor-size()` function to define the infobox's {{cssxref("left")}} position, making the gap between the anchor and the infobox one quarter of the height of the anchor. + +```css hidden +.anchor { + anchor-name: --my-anchor; + width: 120px; + height: 60px; + + font-size: 2rem; + background-color: lightpink; + text-align: center; + align-content: center; + outline: 1px solid black; +} + +.infobox { + position-anchor: --my-anchor; + position: absolute; + position-area: right; + width: anchor-size(width); + + left: calc( anchor-size(height) / 4 ) + + align-content: center; + color: darkblue; + background-color: azure; + outline: 1px solid #dddddd; +} +``` + +```css hidden +body { + padding: 5em; +} +``` + +#### Results + +{{EmbedLiveSample("Using the anchor-size() function", "auto", 200)}} + +Note how the infobox's width is always the same as the anchor element's width. ## Specifications @@ -265,7 +413,8 @@ p.min-blue { - {{cssxref("box-sizing")}} - {{cssxref("min-width")}}, {{cssxref("max-width")}} - {{cssxref("block-size")}}, {{cssxref("inline-size")}} -- {{cssxref("anchor-size()")}} - SVG {{SVGAttr("width")}} attribute - [Introduction to the CSS box model](/en-US/docs/Web/CSS/Guides/Box_model/Introduction) guide - [CSS box model](/en-US/docs/Web/CSS/Guides/Box_model) module +- [CSS anchor positioning](/en-US/docs/Web/CSS/Guides/Anchor_positioning) module +- [CSS values and units](/en-US/docs/Web/CSS/Guides/Values_and_units) module diff --git a/files/en-us/web/css/reference/values/anchor-size/index.md b/files/en-us/web/css/reference/values/anchor-size/index.md index 9e1fe987fa87234..7be84ba95c5951a 100644 --- a/files/en-us/web/css/reference/values/anchor-size/index.md +++ b/files/en-us/web/css/reference/values/anchor-size/index.md @@ -13,12 +13,15 @@ For detailed information on anchor features and usage, see the [CSS anchor posit ## Syntax ```css -/* sizing relative to anchor side */ -width: anchor-size(width); -block-size: anchor-size(block); -height: calc(anchor-size(self-inline) + 2em); +/* without parameters */ +anchor-size() -/* sizing relative to named anchor's side */ +/* anchor size parameter */ +anchor-size(width); +anchor-size(block); +anchor-size(self-inline); + +/* anchor-name and anchor-side */ width: anchor-size(--my-anchor width); block-size: anchor-size(--my-anchor block); @@ -249,7 +252,7 @@ body { .anchor { anchor-name: --my-anchor; width: 100px; - height: 100px; + height: 50px; } .infobox { @@ -262,7 +265,7 @@ We set some distinct property values on the positioned elements: - The positioned elements are tethered to the anchor with different {{cssxref("position-area")}} values that position the elements in different places around the anchor element. - The {{cssxref("height")}} of the first infobox is set to the same height as the anchor element: `anchor-size(height)` returns the anchor element's height. The element's {{cssxref("width")}} is set to double the anchor element's width using the `anchor-size()` function within a {{cssxref("calc()")}} function: `anchor-size(width)` retrieves the anchor element's width, which is then multiplied by two. -- The {{cssxref("height")}} of the second infobox is set to two-thirds of the anchor element's height, using a similar technique. +- The {{cssxref("height")}} of the second infobox is set to 80% of the anchor element's height, using a similar technique. - Margin values are included to provide some separation from the anchor element. ```css @@ -275,7 +278,7 @@ We set some distinct property values on the positioned elements: #infobox2 { position-area: top span-right; - height: calc(anchor-size(height) / 1.5); + height: calc(anchor-size(height) / 1.25); margin-bottom: 5px; } ``` @@ -284,7 +287,7 @@ We set some distinct property values on the positioned elements: {{EmbedLiveSample("Basic `anchor-size()` usage", "100%", "240")}} -Use your browser tools to inspect the anchor-positioned elements. The first infobox will be `100px` tall and `200px` wide, while the second infobox will have a height of approximately `66.7px`, with the `width` defaulting to {{cssxref("max-content")}}. +Use your browser tools to inspect the anchor-positioned elements. The first infobox will be `50px` tall and `200px` wide, while the second infobox will be `40px` tall, with the `width` defaulting to {{cssxref("max-content")}}. ### Position and margin example