1. 简介
本规范是相对于 CSS 尺寸第 3 级的差异规范。 它目前是一份探索性工作草案: 如果你正在实现任何内容,请以第 3 级作为参考。 一旦本草案达到 CR,我们会将第 3 级的文本合并到本草案中。
测试
通用尺寸测试
- dynamic-available-size-iframe.html (实时 测试) (源码)
- dynamic-change-inline-size-001.html (实时 测试) (源码)
- dynamic-change-inline-size-002.html (实时 测试) (源码)
- dynamic-change-inline-size-003.html (实时 测试) (源码)
- dynamic-change-inline-size-004.html (实时 测试) (源码)
- frameset-intrinsic-crash.html (实时 测试) (源码)
- inheritance-001.html (实时测试) (源码)
- inheritance-002.html (实时测试) (源码)
- min-width-max-width-precedence.html (实时 测试) (源码)
- min-width-max-width-precedence.html (实时 测试) (源码)
- replaced-max-size-saturation.html (实时 测试) (源码)
- responsive-iframe-no-match-element.html (实时 测试) (源码)
- textarea-large-padding-crash.html (实时 测试) (源码)
1.1. 模块交互
本模块扩展了 width、height、min-width、min-height、max-width、max-height 和 column-width 功能,这些功能定义于 [CSS2] 第 10 章以及 [CSS3COL]
1.2. 值定义
本规范遵循 [CSS2] 中的 CSS 属性 定义约定, 并使用 [CSS-VALUES-3] 中的 值定义语法。 本规范中未定义的值类型定义于 CSS 值和单位 [CSS-VALUES-3]。 与其他 CSS 模块组合使用时,可能会扩展这些值类型的定义。
除各属性定义中列出的属性特定值外, 本规范定义的所有属性 也都接受 CSS 全局关键字作为其属性值。 为便于阅读,这里没有明确重复列出它们。
2. 术语
3. 指定框尺寸
3.1. 尺寸属性
| 名称: | size |
|---|---|
| 值: | <'width'> <'height'>? |
| 初始值: | auto |
| 适用于: | 所有元素 |
| 继承: | 见各个属性 |
| 百分比: | 见各个属性 |
| 计算值: | 见各个属性 |
| 动画类型: | 见各个属性 |
| 规范顺序: | 依语法而定 |
size 属性是一个简写属性, 可在单个声明中设置 width 和 height。 如果省略第二个值, 则从第一个值复制。
size 简写属性不能用于 @page 上下文中, 因为 @page 已经有一个无关的 size 描述符, 用于设置页面尺寸。
size 属性需要从 CSSOM 中的 首选 简写顺序中排除, 以避免兼容性问题以及与 @page 的冲突。
| 名称: | min-size |
|---|---|
| 值: | <'min-width'> <'min-height'>? |
| 初始值: | auto |
| 适用于: | 所有元素 |
| 继承: | 见各个属性 |
| 百分比: | 见各个属性 |
| 计算值: | 见各个属性 |
| 动画类型: | 见各个属性 |
| 规范顺序: | 依语法而定 |
min-size 属性是一个简写属性, 可在单个声明中设置 min-width 和 min-height。 如果省略第二个值, 则从第一个值复制。
| 名称: | max-size |
|---|---|
| 值: | <'max-width'> <'max-height'>? |
| 初始值: | none |
| 适用于: | 所有元素 |
| 继承: | 见各个属性 |
| 百分比: | 见各个属性 |
| 计算值: | 见各个属性 |
| 动画类型: | 见各个属性 |
| 规范顺序: | 依语法而定 |
max-size 属性是一个简写属性, 可在单个声明中设置 max-width 和 max-height。 如果省略第二个值, 则从第一个值复制。
3.2. 新的尺寸值:contain、fit-content() 和 calc-size() 值
CSS 尺寸 3 § 3.2 尺寸值: <length-percentage>、auto | none、min-content、max-content 和 fit-content() 值
第 4 级增加了在 尺寸属性中使用 contain、fit-content() 和 calc-size() 值的能力, 从而将 <box-size> 产生式扩展如下:
<box-size> = <length-percentage> | stretch | contain | min-content | max-content | fit-content | fit-content() | calc-size()
| 名称: | width, height, min-width, min-height, max-width, max-height |
|---|---|
| 新值: | contain | fit-content(<length-percentage [0,∞]>) |
- fit-content(<length-percentage [0,∞]>)
-
使用 fit-content 公式,
但将可用空间替换为指定的参数,
即
min(max-content, max(min-content, <length-percentage>)), 其中 <length-percentage> 参数的解析方式 与独立出现的 <length-percentage> 值完全相同。负的 <length-percentage> 值无效。
测试
- auto-scrollbar-inside-stf-abspos.html (实时 测试) (源码)
- block-fit-content-as-initial.html (实时 测试) (源码)
- fit-content-length-percentage-001.html (实时 测试) (源码)
- fit-content-length-percentage-002.html (实时 测试) (源码)
- fit-content-length-percentage-003.html (实时 测试) (源码)
- fit-content-length-percentage-004.html (实时 测试) (源码)
- fit-content-length-percentage-005.html (实时 测试) (源码)
- fit-content-length-percentage-006.html (实时 测试) (源码)
- fit-content-length-percentage-007.html (实时 测试) (源码)
- fit-content-length-percentage-008.html (实时 测试) (源码)
- fit-content-length-percentage-009.html (实时 测试) (源码)
- fit-content-length-percentage-010.html (实时 测试) (源码)
- fit-content-length-percentage-011.html (实时 测试) (源码)
- fit-content-length-percentage-012.html (实时 测试) (源码)
- fit-content-length-percentage-013.html (实时 测试) (源码)
- fit-content-length-percentage-014.html (实时 测试) (源码)
- fit-content-length-percentage-015.html (实时 测试) (源码)
- fit-content-length-percentage-016.html (实时 测试) (源码)
- contain
-
如果框具有首选纵横比,
则应用contain-fit
尺寸确定,
尝试在尽可能保持其首选纵横比的同时
适应框的约束。
参见 § 6.1 Contain-fit 尺寸确定:在保持纵横比的同时拉伸。
如果框没有首选纵横比, 则应用stretch-fit 尺寸确定。
- calc-size()
-
参见 CSS 值 5 § 10. 使用内在尺寸进行计算:calc-size() 函数。
注: none 关键字 不能在 calc-size() 中使用。
注: 这些新值加入了 <calc-size()> 定义所称的 “在上下文中允许”的值集合。
4. 纵横比
图像通常具有自然纵横比, CSS 布局算法会在调整元素大小时 尝试保持这一纵横比。
aspect-ratio 属性允许为非替换元素 指定这种行为, 并可更改替换元素的有效纵横比。
我们仍在完善 本节的细节。 如果这里指定的任何行为 会导致具有替换元素且具有首选纵横比的元素, 与在 CSS2、 弹性布局和 网格布局 规范共同要求下(不应用本规范时)的行为不同, 那么这是一个错误,应报告给 CSSWG。 这里有一份尚未关闭的 aspect-ratio 议题列表。
4.1. 首选纵横比:aspect-ratio 属性
| 名称: | aspect-ratio |
|---|---|
| 值: | auto || <ratio> |
| 初始值: | auto |
| 适用于: | 除行内 框以及内部 ruby 或表格框之外的所有元素 |
| 继承: | 否 |
| 百分比: | 不适用 |
| 计算值: | 指定的关键字或一对数字 |
| 规范顺序: | 依语法而定 |
| 动画类型: | 按计算值 |
测试
- aspect-ratio-interpolation.html (实时 测试) (源码)
- abspos-001.html (实时 测试) (源码)
- abspos-002.html (实时 测试) (源码)
- abspos-003.html (实时 测试) (源码)
- abspos-004.html (实时 测试) (源码)
- abspos-005.html (实时 测试) (源码)
- abspos-006.html (实时 测试) (源码)
- abspos-007.html (实时 测试) (源码)
- abspos-008.html (实时 测试) (源码)
- abspos-009.html (实时 测试) (源码)
- abspos-010.html (实时 测试) (源码)
- abspos-011.html (实时 测试) (源码)
- abspos-012.html (实时 测试) (源码)
- abspos-013.html (实时 测试) (源码)
- abspos-014.html (实时 测试) (源码)
- abspos-015.html (实时 测试) (源码)
- abspos-016.html (实时 测试) (源码)
- abspos-017.html (实时 测试) (源码)
- abspos-018.html (实时 测试) (源码)
- abspos-019.html (实时 测试) (源码)
- abspos-020.html (实时 测试) (源码)
- abspos-021.html (实时 测试) (源码)
- auto-margins-001.html (实时 测试) (源码)
- block-aspect-ratio-001.html (实时 测试) (源码)
- block-aspect-ratio-002.html (实时 测试) (源码)
- block-aspect-ratio-003.html (实时 测试) (源码)
- block-aspect-ratio-004.html (实时 测试) (源码)
- block-aspect-ratio-005.html (实时 测试) (源码)
- block-aspect-ratio-006.html (实时 测试) (源码)
- block-aspect-ratio-007.html (实时 测试) (源码)
- block-aspect-ratio-008.html (实时 测试) (源码)
- block-aspect-ratio-009.html (实时 测试) (源码)
- block-aspect-ratio-010.html (实时 测试) (源码)
- block-aspect-ratio-011.html (实时 测试) (源码)
- block-aspect-ratio-012.html (实时 测试) (源码)
- block-aspect-ratio-013.html (实时 测试) (源码)
- block-aspect-ratio-014.html (实时 测试) (源码)
- block-aspect-ratio-015.html (实时 测试) (源码)
- block-aspect-ratio-016.html (实时 测试) (源码)
- block-aspect-ratio-017.html (实时 测试) (源码)
- block-aspect-ratio-018.html (实时 测试) (源码)
- block-aspect-ratio-019.html (实时 测试) (源码)
- block-aspect-ratio-020.html (实时 测试) (源码)
- block-aspect-ratio-021.html (实时 测试) (源码)
- block-aspect-ratio-022.html (实时 测试) (源码)
- block-aspect-ratio-023.html (实时 测试) (源码)
- block-aspect-ratio-024.html (实时 测试) (源码)
- block-aspect-ratio-025.html (实时 测试) (源码)
- block-aspect-ratio-026.html (实时 测试) (源码)
- block-aspect-ratio-027.html (实时 测试) (源码)
- block-aspect-ratio-028.html (实时 测试) (源码)
- block-aspect-ratio-029-crash.html (实时 测试) (源码)
- block-aspect-ratio-030.html (实时 测试) (源码)
- block-aspect-ratio-031.html (实时 测试) (源码)
- block-aspect-ratio-032.html (实时 测试) (源码)
- block-aspect-ratio-033.html (实时 测试) (源码)
- block-aspect-ratio-034.html (实时 测试) (源码)
- block-aspect-ratio-035.html (实时 测试) (源码)
- block-aspect-ratio-036.html (实时 测试) (源码)
- block-aspect-ratio-037.html (实时 测试) (源码)
- block-aspect-ratio-051-crash.html (实时 测试) (源码)
- block-aspect-ratio-052.html (实时 测试) (源码)
- block-aspect-ratio-053.html (实时 测试) (源码)
- block-aspect-ratio-054.html (实时 测试) (源码)
- block-aspect-ratio-055.html (实时 测试) (源码)
- block-aspect-ratio-056.html (实时 测试) (源码)
- block-aspect-ratio-058.html (实时 测试) (源码)
- block-aspect-ratio-with-margin-collapsing-001.html (实时 测试) (源码)
- block-aspect-ratio-with-margin-collapsing-002.html (实时 测试) (源码)
- box-sizing-dimensions.html (实时 测试) (源码)
- box-sizing-squashed.html (实时 测试) (源码)
- flex-aspect-ratio-001.html (实时 测试) (源码)
- flex-aspect-ratio-003.html (实时 测试) (源码)
- flex-aspect-ratio-005.html (实时 测试) (源码)
- flex-aspect-ratio-006.html (实时 测试) (源码)
- flex-aspect-ratio-007.html (实时 测试) (源码)
- flex-aspect-ratio-008.html (实时 测试) (源码)
- flex-aspect-ratio-009.html (实时 测试) (源码)
- flex-aspect-ratio-010.html (实时 测试) (源码)
- flex-aspect-ratio-011.html (实时 测试) (源码)
- flex-aspect-ratio-012.html (实时 测试) (源码)
- flex-aspect-ratio-013.html (实时 测试) (源码)
- flex-aspect-ratio-014.html (实时 测试) (源码)
- flex-aspect-ratio-015.html (实时 测试) (源码)
- flex-aspect-ratio-016.html (实时 测试) (源码)
- flex-aspect-ratio-017.html (实时 测试) (源码)
- flex-aspect-ratio-018.html (实时 测试) (源码)
- flex-aspect-ratio-019.html (实时 测试) (源码)
- flex-aspect-ratio-020.html (实时 测试) (源码)
- flex-aspect-ratio-021.html (实时 测试) (源码)
- flex-aspect-ratio-022.html (实时 测试) (源码)
- flex-aspect-ratio-023.html (实时 测试) (源码)
- flex-aspect-ratio-024.html (实时 测试) (源码)
- flex-aspect-ratio-027.html (实时 测试) (源码)
- flex-aspect-ratio-028.html (实时 测试) (源码)
- flex-aspect-ratio-029.html (实时 测试) (源码)
- flex-aspect-ratio-030.html (实时 测试) (源码)
- flex-aspect-ratio-032.html (实时 测试) (源码)
- flex-aspect-ratio-033.html (实时 测试) (源码)
- flex-aspect-ratio-034.html (实时 测试) (源码)
- flex-aspect-ratio-035.html (实时 测试) (源码)
- flex-aspect-ratio-036.html (实时 测试) (源码)
- flex-aspect-ratio-037.html (实时 测试) (源码)
- flex-aspect-ratio-038.html (实时 测试) (源码)
- flex-aspect-ratio-045.html (实时 测试) (源码)
- flex-aspect-ratio-046.html (实时 测试) (源码)
- flex-aspect-ratio-047.html (实时 测试) (源码)
- flex-aspect-ratio-048.html (实时 测试) (源码)
- flex-aspect-ratio-049.html (实时 测试) (源码)
- flex-aspect-ratio-050.html (实时 测试) (源码)
- flex-aspect-ratio-051.html (实时 测试) (源码)
- flex-aspect-ratio-052.html (实时 测试) (源码)
- flex-aspect-ratio-053.html (实时 测试) (源码)
- flex-aspect-ratio-054.html (实时 测试) (源码)
- flex-aspect-ratio-055.html (实时 测试) (源码)
- floats-aspect-ratio-001.html (实时 测试) (源码)
- fractional-aspect-ratio.html (实时 测试) (源码)
- grid-aspect-ratio-001.html (实时 测试) (源码)
- grid-aspect-ratio-002.html (实时 测试) (源码)
- grid-aspect-ratio-003.html (实时 测试) (源码)
- grid-aspect-ratio-004.html (实时 测试) (源码)
- grid-aspect-ratio-005.html (实时 测试) (源码)
- grid-aspect-ratio-006.html (实时 测试) (源码)
- grid-aspect-ratio-007.html (实时 测试) (源码)
- grid-aspect-ratio-008.html (实时 测试) (源码)
- grid-aspect-ratio-009.html (实时 测试) (源码)
- grid-aspect-ratio-010.html (实时 测试) (源码)
- grid-aspect-ratio-011.html (实时 测试) (源码)
- grid-aspect-ratio-012.html (实时 测试) (源码)
- grid-aspect-ratio-014.html (实时 测试) (源码)
- grid-aspect-ratio-015.html (实时 测试) (源码)
- grid-aspect-ratio-016.html (实时 测试) (源码)
- grid-aspect-ratio-017.html (实时 测试) (源码)
- grid-aspect-ratio-018.html (实时 测试) (源码)
- grid-aspect-ratio-019.html (实时 测试) (源码)
- grid-aspect-ratio-020.html (实时 测试) (源码)
- grid-aspect-ratio-021.html (实时 测试) (源码)
- grid-aspect-ratio-022.html (实时 测试) (源码)
- grid-aspect-ratio-023.html (实时 测试) (源码)
- grid-aspect-ratio-024.html (实时 测试) (源码)
- grid-aspect-ratio-025.html (实时 测试) (源码)
- grid-aspect-ratio-026.html (实时 测试) (源码)
- grid-aspect-ratio-027.html (实时 测试) (源码)
- grid-aspect-ratio-028.html (实时 测试) (源码)
- grid-aspect-ratio-029.html (实时 测试) (源码)
- grid-aspect-ratio-030.html (实时 测试) (源码)
- grid-aspect-ratio-031.html (实时 测试) (源码)
- grid-aspect-ratio-032.html (实时 测试) (源码)
- grid-aspect-ratio-033.html (实时 测试) (源码)
- grid-aspect-ratio-034.html (实时 测试) (源码)
- grid-aspect-ratio-035.html (实时 测试) (源码)
- grid-aspect-ratio-036.html (实时 测试) (源码)
- grid-aspect-ratio-037.html (实时 测试) (源码)
- grid-aspect-ratio-038.html (实时 测试) (源码)
- grid-aspect-ratio-040.html (实时 测试) (源码)
- grid-aspect-ratio-041.html (实时 测试) (源码)
- inheritance.html (实时 测试) (源码)
- intrinsic-size-001.html (实时 测试) (源码)
- intrinsic-size-002.html (实时 测试) (源码)
- intrinsic-size-003.html (实时 测试) (源码)
- intrinsic-size-004.html (实时 测试) (源码)
- intrinsic-size-005.html (实时 测试) (源码)
- intrinsic-size-006.html (实时 测试) (源码)
- intrinsic-size-007.html (实时 测试) (源码)
- intrinsic-size-008.html (实时 测试) (源码)
- intrinsic-size-009.html (实时 测试) (源码)
- intrinsic-size-011.html (实时 测试) (源码)
- intrinsic-size-012.html (实时 测试) (源码)
- intrinsic-size-013.html (实时 测试) (源码)
- intrinsic-size-014.html (实时 测试) (源码)
- intrinsic-size-015.html (实时 测试) (源码)
- intrinsic-size-016.html (实时 测试) (源码)
- intrinsic-size-017.html (实时 测试) (源码)
- intrinsic-size-018.html (实时 测试) (源码)
- intrinsic-size-019.html (实时 测试) (源码)
- intrinsic-size-020.html (实时 测试) (源码)
- intrinsic-size-021.html (实时 测试) (源码)
- intrinsic-size-022.html (实时 测试) (源码)
- intrinsic-size-023.html (实时 测试) (源码)
- intrinsic-size-024.html (实时 测试) (源码)
- intrinsic-size-025.html (实时 测试) (源码)
- large-aspect-ratio-crash.html (实时 测试) (源码)
- aspect-ratio-computed.html (实时 测试) (源码)
- aspect-ratio-invalid.html (实时 测试) (源码)
- aspect-ratio-valid.html (实时 测试) (源码)
- percentage-resolution-001.html (实时 测试) (源码)
- percentage-resolution-002.html (实时 测试) (源码)
- percentage-resolution-003.html (实时 测试) (源码)
- percentage-resolution-004.html (实时 测试) (源码)
- percentage-resolution-005.html (实时 测试) (源码)
- quirks-mode-001.html (实时 测试) (源码)
- quirks-mode-002.html (实时 测试) (源码)
- quirks-mode-003.html (实时 测试) (源码)
- replaced-element-001.html (实时 测试) (源码)
- replaced-element-002.html (实时 测试) (源码)
- replaced-element-003.html (实时 测试) (源码)
- replaced-element-004.html (实时 测试) (源码)
- replaced-element-005.html (实时 测试) (源码)
- replaced-element-006.html (实时 测试) (源码)
- replaced-element-007.html (实时 测试) (源码)
- replaced-element-008.html (实时 测试) (源码)
- replaced-element-009.html (实时 测试) (源码)
- replaced-element-010.html (实时 测试) (源码)
- replaced-element-011.html (实时 测试) (源码)
- replaced-element-012.html (实时 测试) (源码)
- replaced-element-013.html (实时 测试) (源码)
- replaced-element-014.html (实时 测试) (源码)
- replaced-element-015.html (实时 测试) (源码)
- replaced-element-016.html (实时 测试) (源码)
- replaced-element-017.html (实时 测试) (源码)
- replaced-element-018.html (实时 测试) (源码)
- replaced-element-019.html (实时 测试) (源码)
- replaced-element-020.html (实时 测试) (源码)
- replaced-element-021.html (实时 测试) (源码)
- replaced-element-022.html (实时 测试) (源码)
- replaced-element-023.html (实时 测试) (源码)
- replaced-element-024.html (实时 测试) (源码)
- replaced-element-025.html (实时 测试) (源码)
- replaced-element-026.html (实时 测试) (源码)
- replaced-element-027.html (实时 测试) (源码)
- replaced-element-028.html (实时 测试) (源码)
- replaced-element-029.html (实时 测试) (源码)
- replaced-element-030.html (实时 测试) (源码)
- replaced-element-031.html (实时 测试) (源码)
- replaced-element-034.html (实时 测试) (源码)
- replaced-element-035.html (实时 测试) (源码)
- replaced-element-036.html (实时 测试) (源码)
- replaced-element-037.html (实时 测试) (源码)
- replaced-element-042.html (实时 测试) (源码)
- replaced-element-045.html (实时 测试) (源码)
- replaced-element-046.html (实时 测试) (源码)
- replaced-element-049.html (实时 测试) (源码)
- replaced-element-dynamic-aspect-ratio.html (实时 测试) (源码)
- select-element-001.html (实时 测试) (源码)
- sign-function-aspect-ratio.html (实时 测试) (源码)
- small-aspect-ratio-crash.html (实时 测试) (源码)
- table-element-001.html (实时 测试) (源码)
- zero-or-infinity-001.html (实时 测试) (源码)
- zero-or-infinity-002.html (实时 测试) (源码)
- zero-or-infinity-003.html (实时 测试) (源码)
- zero-or-infinity-004.html (实时 测试) (源码)
- zero-or-infinity-005.html (实时 测试) (源码)
- zero-or-infinity-006.html (实时 测试) (源码)
- zero-or-infinity-007.html (实时 测试) (源码)
- zero-or-infinity-008.html (实时 测试) (源码)
- zero-or-infinity-009.html (实时 测试) (源码)
- zero-or-infinity-010.html (实时 测试) (源码)
此属性为框设置一个首选纵横比, 它将用于计算 auto 尺寸 以及其他一些布局函数。
- auto
- 具有自然纵横比的替换元素 使用该纵横比; 否则该框没有首选纵横比。 涉及纵横比的尺寸计算 始终使用内容框的尺寸。
- <ratio>
- 框的首选纵横比是指定的 width / height 比率。 涉及纵横比的尺寸计算 使用由 box-sizing 指定的框尺寸。
- auto && <ratio>
- 如果 auto 和 <ratio> 同时指定, 则首选纵横比为指定的 width / height 比率, 除非它是一个具有自然纵横比的替换元素, 在这种情况下改用该自然纵横比。 在所有情况下,涉及纵横比的尺寸计算 始终使用内容框的尺寸。
注: 具有首选纵横比并不会 使一个框成为替换元素; 专用于替换元素的布局规则 通常不适用于具有首选纵横比的非替换框。 例如,一个非替换的绝对定位框 会将 justify-self: normal 视为 stretch,而不是 start (CSS 框对齐 3 § 6.1.2 绝对定位框), 即使它具有首选纵横比
CSS2.1 并未清晰地区分 替换元素与具有纵横比的元素; 需要找出具体哪些情况不明确,并对其作出定义, 要么在相应的第 3 级规范中,要么在这里。
< ul > < li > …< li > …< li > …< li > …</ ul >
ul{ display : grid; grid-template-columns : repeat ( auto-fill, minmax ( 12 em , 1 fr )); } li{ aspect-ratio : 1 /1 ; overflow : auto; }
iframe
元素的
width 和 height 属性
来设置 aspect-ratio 属性,
为 iframe 提供一个用于尺寸确定的纵横比,
使其行为与具有该纵横比的图像完全相同。
< iframe src = "https://www.youtube.com/embed/0Gr1XSyxZy0" width = 560 height = 315 >
@supports ( aspect-ratio:attr ( width number) /1 ) { iframe{ aspect-ratio : attr ( width number) /attr ( height number); width : 100 % ; height : auto; } }
如果一个替换元素唯一的自然 尺寸 是自然宽度或自然 高度, 为其提供首选纵横比 也会赋予它缺失的自然高度或宽度, 方法是通过首选纵横比 传递已有的尺寸。
4.2. 首选纵横比对自动尺寸的影响
当一个框具有首选纵横比时, 它的自动尺寸 的计算方式与一个在该轴上没有自然尺寸、但具有自然纵横比的替换元素相同, 例如参见 CSS2 § 10 和 CSS 弹性框模型第 1 级 § 9.2。 首选尺寸计算 依赖此纵横比的轴 称为比率依赖轴, 如果其输入尺寸也是确定的, 则所得尺寸是确定的。 相反的轴(比率依赖轴的尺寸依赖于它) 称为比率确定轴。
注: 首选纵横比 只有在框的至少一个尺寸 是自动的时才会产生影响。 如果 width 和 height 都不是自动尺寸, 则它不会影响其首选 尺寸。
当我们把所有 尺寸信息移到这里, 而不是强行塞进 2.1 时, 核心原则就只是: 比率确定轴中解析后的首选尺寸 (在应用 min/max 之前) 会通过该比率传递。 min/max 约束随后再进行传递, 然后分别应用到各个轴,而不再考虑纵横比。
4.2.1. 外边距折叠
对于外边距折叠(CSS 2 § 8.3.1 折叠 外边距), 如果块轴是比率依赖轴, 则不认为它具有计算后的 block-size 值 auto。
4.3. 自动的基于内容的最小尺寸
为避免非预期的溢出, 一个具有首选纵横比的框, 如果它既不是替换元素, 也不是该轴上的滚动容器, 则它在比率依赖轴上的 自动最小尺寸 是其min-content 尺寸, 并受其最大尺寸限制。
div{ aspect-ratio : 1 /1 ; /* 'width' 和 'height' 都默认为 'auto' */ }
+----------+ +----------+ +----------+
| ~~~~~~~~ | | ~~~~~~~~ | | ~~~~~~~~ |
| ~~~~~~~~ | | ~~~~~~~~ | | ~~~~~~~~ |
| ~~~~~~~ | | ~~~~~~~~ | | ~~~~~~~~ |
| | | ~~~ | | ~~~~~~~~ |
+----------+ +----------+ | ~~~~~~~~ |
| ~~~~~~ |
+----------+
但是,当指定 overflow: auto 时, 即使内容过多的框也会保持 1:1 的纵横比 (并像通常一样,通过变为可滚动来处理溢出)。
div{ overflow : auto; aspect-ratio : 1 /1 ; }
+----------+ +----------+ +----------+ | ~~~~~~~~ | | ~~~~~~~~ | | ~~~~~~~~^| | ~~~~~~~~ | | ~~~~~~~~ | | ~~~~~~~~ | | ~~~~~~~ | | ~~~~~~~~ | | ~~~~~~~~ | | | | ~~~ | | ~~~~~~~~v| +----------+ +----------+ +----------+
覆盖 min-height 属性也会保持 1:1 的纵横比, 但如果没有通过其他方式处理, 会导致内容溢出框。
div{ aspect-ratio : 1 /1 ; min-height : 0 ; }
+----------+ +----------+ +----------+
| ~~~~~~~~ | | ~~~~~~~~ | | ~~~~~~~~ |
| ~~~~~~~~ | | ~~~~~~~~ | | ~~~~~~~~ |
| ~~~~~~~ | | ~~~~~~~~ | | ~~~~~~~~ |
| | | ~~~ | | ~~~~~~~~ |
+----------+ +----------+ +-~~~~~~~~-+
~~~~~~
< div style = "height: 100px; aspect-ratio: 1/1;" > < span style = "display: inline-block; width: 50px;" ></ span > < span style = "display: inline-block; width: 150px;" ></ span > </ div >
容器的 width 为 auto, 因此通过纵横比解析为 100px。 然而,其 min-width 也是 auto, 因而解析为 150px。 因此,容器最终的宽度为 150px。 若要在确定容器尺寸时忽略其内容, 可以指定 min-width: 0。
测试
- block-aspect-ratio-038.html (实时 测试) (源码)
- block-aspect-ratio-039.html (实时 测试) (源码)
- fieldset-element-001.html (实时 测试) (源码)
- fieldset-element-002.html (实时 测试) (源码)
- flex-aspect-ratio-002.html (实时 测试) (源码)
- flex-aspect-ratio-004.html (实时 测试) (源码)
- flex-aspect-ratio-025.html (实时 测试) (源码)
- flex-aspect-ratio-026.html (实时 测试) (源码)
- flex-aspect-ratio-040.html (实时 测试) (源码)
- flex-aspect-ratio-041.html (实时 测试) (源码)
- flex-aspect-ratio-042.html (实时 测试) (源码)
- flex-aspect-ratio-043.html (实时 测试) (源码)
- flex-aspect-ratio-044.html (实时 测试) (源码)
- grid-aspect-ratio-039.html (实时 测试) (源码)
- grid-aspect-ratio-042.html (实时 测试) (源码)
- intrinsic-size-010.html (实时 测试) (源码)
4.4. 最小/最大尺寸传递
任一轴 (origin 轴)中的尺寸约束 会通过首选纵横比传递, 并按如下方式应用于另一轴(destination 轴)中任何不确定的 最小、最大或首选尺寸:
-
首先,任何确定的最小尺寸 都会从 origin 轴转换并传递 到 destination 轴。 此传递后的最小值受 destination 轴中任何确定的首选或最大尺寸 的上限限制。
-
然后,任何确定的最大尺寸 都会从 origin 轴转换并传递 到 destination。 此传递后的最大值受 destination 轴中任何确定的首选或最小尺寸 的下限限制, 以及传递后的最小值(如果有)的下限限制。
注: 因此,任何确定的尺寸都完全不受 传递约束的影响; 传递后的最小值永远不会使元素超过确定的首选/最大尺寸, 传递后的最大值也不会使元素违反其首选/最小尺寸。
注: 基本原则是,尺寸约束 通过纵横比传递到另一侧, 在不违反受影响轴上任何显式指定尺寸的前提下, 尽可能保持纵横比。 (这也是形成 CSS2 第 10.4 节约束表内容的原则。)
< div id = container style = "height: 100px; float: left;" > < div id = item style = "height: 100%; aspect-ratio: 1/1;" > content</ div > </ div >
由于 #item 的高度是相对于确定容器解析的百分比,
因此无论是其内在尺寸贡献还是最终布局,
该项目的宽度都会解析为 100px,
所以容器的宽度也会确定为 100px。
< div id = container style = "height: auto; float: left;" > < div id = item style = "height: 100%; aspect-ratio: 1/1;" > content</ div > </ div >
在下一个示例中, 项目的百分比高度无法解析,因此表现得如同 auto (参见 CSS 2 § 10.5 内容高度:'height' 属性)。 由于现在两个轴都具有自动 尺寸, 高度会成为比率依赖轴。 计算该框的内在尺寸贡献 会产生一个由其内容得出的宽度, 并根据该宽度和纵横比计算高度, 从而得到一个正方形框(以及容器), 其尺寸等于单词“content”的宽度。
测试
- replaced-element-032.html (实时 测试) (源码)
- replaced-element-033.html (实时 测试) (源码)
- block-aspect-ratio-040.html (实时 测试) (源码)
- block-aspect-ratio-041.html (实时 测试) (源码)
- block-aspect-ratio-042.html (实时 测试) (源码)
- block-aspect-ratio-043.html (实时 测试) (源码)
- block-aspect-ratio-044.html (实时 测试) (源码)
- block-aspect-ratio-045.html (实时 测试) (源码)
- block-aspect-ratio-046.html (实时 测试) (源码)
- block-aspect-ratio-047.html (实时 测试) (源码)
- block-aspect-ratio-048.html (实时 测试) (源码)
- block-aspect-ratio-049.html (实时 测试) (源码)
- flex-aspect-ratio-039.html (实时 测试) (源码)
- replaced-element-039.html (实时 测试) (源码)
- replaced-element-040.html (实时 测试) (源码)
- replaced-element-041.html (实时 测试) (源码)
- replaced-element-043.html (实时 测试) (源码)
- replaced-element-044.html (实时 测试) (源码)
- image-max-width-and-height-behaves-as-auto.html (实时 测试) (源码)
- min-max-content-orthogonal-flow-crash-001.html (实时 测试) (源码)
本节的编写方式可能不正确。[议题 #6071]
5. 内在尺寸确定
5.1. 内在尺寸
5.2. 覆盖受包含的内在尺寸:contain-intrinsic-* 属性
| 名称: | contain-intrinsic-width, contain-intrinsic-height, contain-intrinsic-block-size, contain-intrinsic-inline-size |
|---|---|
| 值: | auto? [ none | <length [0,∞]> ] |
| 初始值: | none |
| 适用于: | 具有尺寸包含的元素 |
| 继承: | 否 |
| 百分比: | 不适用 |
| 计算值: | 按指定值,其中 <length> 值会被计算 |
| 规范顺序: | 依语法而定 |
| 动画类型: | 按计算值类型 |
| 逻辑属性 组: | contain-intrinsic-size |
测试
- auto-014.html (实时 测试) (源码)
- auto-015.html (实时 测试) (源码)
- auto-016.html (实时 测试) (源码)
- auto-017.html (实时 测试) (源码)
- auto-018.html (实时 测试) (源码)
- contain-intrinsic-size-001.html (实时 测试) (源码)
- contain-intrinsic-size-002.html (实时 测试) (源码)
- contain-intrinsic-size-003.html (实时 测试) (源码)
- contain-intrinsic-size-004.html (实时 测试) (源码)
- contain-intrinsic-size-005.html (实时 测试) (源码)
- contain-intrinsic-size-006.html (实时 测试) (源码)
- contain-intrinsic-size-007.html (实时 测试) (源码)
- contain-intrinsic-size-008.html (实时 测试) (源码)
- contain-intrinsic-size-009.html (实时 测试) (源码)
- contain-intrinsic-size-010.html (实时 测试) (源码)
- contain-intrinsic-size-011.html (实时 测试) (源码)
- contain-intrinsic-size-012.html (实时 测试) (源码)
- contain-intrinsic-size-013.html (实时 测试) (源码)
- contain-intrinsic-size-014.html (实时 测试) (源码)
- contain-intrinsic-size-015.html (实时 测试) (源码)
- contain-intrinsic-size-016.html (实时 测试) (源码)
- contain-intrinsic-size-017.html (实时 测试) (源码)
- contain-intrinsic-size-018.html (实时 测试) (源码)
- contain-intrinsic-size-019.html (实时 测试) (源码)
- contain-intrinsic-size-020.html (实时 测试) (源码)
- contain-intrinsic-size-021.html (实时 测试) (源码)
- contain-intrinsic-size-022.html (实时 测试) (源码)
- contain-intrinsic-size-023.html (实时 测试) (源码)
- contain-intrinsic-size-024.html (实时 测试) (源码)
- contain-intrinsic-size-025.html (实时 测试) (源码)
- contain-intrinsic-size-026.html (实时 测试) (源码)
- contain-intrinsic-size-027.html (实时 测试) (源码)
- contain-intrinsic-size-028.html (实时 测试) (源码)
- contain-intrinsic-size-029.html (实时 测试) (源码)
- contain-intrinsic-size-030.html (实时 测试) (源码)
- contain-intrinsic-size-031.html (实时 测试) (源码)
- contain-intrinsic-size-032.html (实时 测试) (源码)
- contain-intrinsic-size-logical-001.html (实时 测试) (源码)
- contain-intrinsic-size-logical-002.html (实时 测试) (源码)
- contain-intrinsic-size-logical-003.html (实时 测试) (源码)
- forget-on-disconnect-in-iframe.html (实时 测试) (源码)
- contain-intrinsic-size-computed.html (实时 测试) (源码)
- contain-intrinsic-size-invalid.html (实时 测试) (源码)
- contain-intrinsic-size-valid.html (实时 测试) (源码)
这些属性允许具有尺寸 包含的元素指定 一个显式 内在内部尺寸, 从而使框进行尺寸确定时,仿佛其流内内容 的总宽度和高度 与指定的显式内在内部尺寸相匹配 (而不是像空框那样进行尺寸确定)。
注: 这并不总是等价于 假设元素拥有一个指定显式内在 内部尺寸的子元素来进行布局。 例如,一个拥有指定尺寸子元素的网格容器 仍会按照指定的网格确定尺寸, 通常最终会得到比指定值更大的内容尺寸。
- none | <length>
-
如果没有其他 contain-intrinsic-size 值 (例如 auto) 提供显式内在内部尺寸, 那么相应的轴或者没有显式内在内部尺寸 (如果指定了 none), 或者具有指定 <length> 的显式内在内部尺寸。
- auto
-
如果指定了 auto, 并且元素具有上次记忆的尺寸 且当前正在跳过其内容, 则其在相应轴上的显式内在内部尺寸 是该轴上的上次记忆的尺寸。
注: 例如, 当具有 content-visibility: auto 的元素位于屏幕外时,就会发生这种情况。
如果一个元素在某个轴上具有显式内在内部尺寸, 那么在按照尺寸 包含的正常方式对元素进行布局之后, 该轴上的内容尺寸会改为被视为显式内在内部尺寸, 而不是布局中计算出的尺寸, 并在必要时再次执行布局。 (如果它在两个轴上都具有显式内在内部尺寸, 这意味着可以跳过第一次布局。)
这四个属性属于一个逻辑属性组。
注: 具有尺寸 包含的元素会被当作没有内容来布局 [CSS-CONTAIN-1], 在许多情况下,这会使元素折叠为零内部高度。 可以通过显式指定一个经过选择以显示预期内容的 height 来纠正这一点, 但在某些布局系统中,这可能产生意料之外的效果, 例如弹性布局和网格布局, 它们会将显式的 height 视为比基于内容的隐式高度更强的指令。 因此,该元素的布局可能与 仅仅填充内容直到该高度时的布局存在很大差异。 为元素提供显式内在内部尺寸 可以保留在布局中忽略其内容所带来的性能优势, 同时仍允许它像具有内容那样确定尺寸。
| 名称: | contain-intrinsic-size |
|---|---|
| 值: | [ auto? [ none | <length [0,∞]> ] ]{1,2} |
| 初始值: | 见各个属性 |
| 适用于: | 见各个属性 |
| 继承: | 见各个属性 |
| 百分比: | 见各个属性 |
| 计算值: | 见各个属性 |
| 动画类型: | 见各个属性 |
| 规范顺序: | 依语法而定 |
contain-intrinsic-size 是一个简写属性, 用于设置 contain-intrinsic-width 和 contain-intrinsic-height 属性。
第一个值表示 contain-intrinsic-width 值, 第二个值表示 contain-intrinsic-height 值。 如果只给出一个值, 则它应用于两个属性。
5.2.1. 上次记忆的尺寸
尺寸包含对于确保页面能够高效渲染非常有价值, 它限制了因元素渲染发生变化 而可能触发的布局工作范围。 然而,它对作者也有很强的限制, 要求作者正确预测元素的尺寸; 如果这个猜测不正确, 即使只差一点, 也可能导致难看的滚动条或内容被意外隐藏。
contain-intrinsic-size 的 auto 关键字提供了一种折中方案: 如果一个元素曾经不受尺寸包含约束, 此值会使元素记住其尺寸 (由布局按正常方式计算); 随后,如果元素之后获得尺寸包含, 它就会使用记住的尺寸, 从而既获得尺寸包含的性能优势, 又很可能能根据其内容准确确定尺寸。
只有能够作为 ResizeObserver
目标的元素才能具有上次
记忆的尺寸。
-
在确定并传递
ResizeObserver事件时, 如果一个元素在 contain-intrinsic-size 属性中具有 auto 关键字, 能够作为ResizeObserver目标, 但没有尺寸包含, 则将其主框当前的内部尺寸 记录为其上次 记忆的尺寸。 -
在确定并传递
ResizeObserver事件时, 如果一个元素具有上次记忆的尺寸, 但其 contain-intrinsic-size 属性中没有 auto 关键字, 则移除其上次记忆的尺寸。
注: 上次记忆的尺寸是附加在 元素上的状态, 而不是附加在该元素生成的某个特定框上。 只要元素在 contain-intrinsic-size 属性中保留 auto 关键字, 即使经历诸如切换到/从 display: none 这样的变化, 它仍会记住其上次记忆的尺寸。
测试
- auto-001.html (实时 测试) (源码)
- auto-002.html (实时 测试) (源码)
- auto-003.html (实时 测试) (源码)
- auto-004.html (实时 测试) (源码)
- auto-005.html (实时 测试) (源码)
- auto-006.html (实时 测试) (源码)
- auto-007.html (实时 测试) (源码)
- auto-008.html (实时 测试) (源码)
- auto-009.html (实时 测试) (源码)
- auto-010.html (实时 测试) (源码)
- auto-011.html (实时 测试) (源码)
- auto-012.html (实时 测试) (源码)
- auto-013.html (实时 测试) (源码)
5.2.2. 与 overflow: auto 的交互
contain-intrinsic-size 属性提供了对 作者预期元素内容大小的估计, 但这个估计不是真实内容, 也不代表需要向用户显示任何东西。 因此,具有 overflow: auto 的元素不得因为 contain-intrinsic-size 而生成滚动条。
但是,如果 contain-intrinsic-size 表明一个足够大的尺寸, 使得元素若实际包含该尺寸的内容时会生成滚动条, 那么应当按照这种假设内容, 将元素的尺寸确定为仿佛它生成了这些滚动条。
div{ width : max-content; contain-intrinsic-size : 100 px 100 px ; overflow : auto; }
元素最终的宽度为 100px,高度为 100px: contain-intrinsic-size 提供了 max-content 宽度, 以及高度。
如果元素随后具有高度为 150px 的内容, 它会显示垂直滚动条; 如果滚动条不是叠加式的, 它会占用这 100px 宽度中的一部分, 从而为内容流动留下更小的空间 (通常大约为 84px)。 (参见 CSS 溢出 3 § 4 滚动条与布局。)
即使现在可用于内容的水平空间少于 100px, 也不会仅仅因为 contain-intrinsic-size 指示了 100px 的宽度就生成水平滚动条; 只有当实际内容 包含不可断开的部分 且其宽度大于剩余空间时,才会发生这种情况。
div{ width : max-content; contain-intrinsic-size : 100 px 100 px ; height : 50 px ; overflow : auto; }
元素具有固定的 50px 高度, 但 contain-intrinsic-size 指示了 100px 的“估计内容高度”。 因此,元素假定在填充实际内容时 它将需要一个垂直滚动条, 从而得到一个略大于 100px 的 max-content 宽度 (通常大约为 116px), 以容纳由 contain-intrinsic-size 估计的 100px max-content 宽度, 以及垂直滚动条的宽度(通常大约为 16px)。
但是,即使元素基于需要滚动条的假设预留了空间, 它也不会真的生成滚动条, 除非实际内容发生溢出: 如果最终包含的内容高度低于 50px, 则完全不会生成垂直滚动条, 但元素仍然会有 116px 宽。
5.3. 响应式尺寸的 iframe:frame-sizing 属性
| 名称: | frame-sizing |
|---|---|
| 值: | auto | content-width | content-height | content-block-size | content-inline-size |
| 初始值: | auto |
| 适用于: | 替换元素(但详情见下文) |
| 继承: | 否 |
| 百分比: | 不适用 |
| 计算值: | 按指定值 |
| 规范顺序: | 依语法而定 |
| 动画类型: | 离散 |
一些替换元素可以包含“普通”的流式内容,
例如 HTML
iframe。
出于隐私和安全原因,
默认情况下,这些元素
不会向外部页面暴露任何有关其内部内容尺寸的信息,
而是仅使用一个静态的、预先确定的内在尺寸,
并使其内容可滚动。
frame-sizing 属性
允许这些元素选择暴露其实际内容尺寸,
该尺寸称为其内部布局内在尺寸。
各值含义如下:
- auto
-
忽略元素的内部布局内在尺寸(如果有)。
- content-width
- content-height
- content-block-size
- content-inline-size
- content-height
-
如果元素具有内部布局内在尺寸, 则其内在尺寸 的相应维度 (宽度或高度) 取自内部布局内在尺寸。 (另一个维度按正常方式确定。)
逻辑方向根据元素的书写 模式解析。 (而不是嵌入文档的书写模式。)
哪些元素可以具有内部布局内在尺寸,
以及该尺寸如何确定,
由文档语言决定。
在 HTML 中,只有
iframe
元素可以具有内部布局内在
尺寸,
而且只有在所包含文档也通过
元素选择启用时才可以。
(参见 § 5.3.1 HTML iframe 详细信息。)
< meta name = "responsive-embedded-sizing" > < div style = "height: 500px" ></ div >
并且嵌入它的文档具有以下 CSS:
iframe{ frame-sizing : content-height; }
iframe
的高度最初会是默认的 iframe 高度(通常为 150px),
但在 iframe 的文档加载后会更新为 500px。
此外,
内部文档可以调用 window.requestResize()
以在之后更新其内部布局内在尺寸。
5.3.1.
HTML
iframe
详细信息
在 HTML 中,只有
iframe
元素可以具有内部布局内在尺寸,
并且只有当
iframe
的嵌入文档以适当方式选择启用时才可以。
HTML Document
对象
关联有一个响应式嵌入尺寸标志,
其初始状态为未设置。
在文档初始解析期间,
根据以下哪种情况最先发生,
将其设置为 true 或 false:
-
如果遇到
元素, 则将其设置为 true。< meta name = responsive-embedded-sizing > -
如果
body元素被打开(显式或隐式), 或由解析器插入文档, 则将其设置为 false。
一旦设置为 true 或 false,
在该 Document
的整个生命周期内,该标志的值都不会再次更改。
注: 目前,HTML
meta
元素出现在 HTML 文档的
head
中,
是嵌入文档在 HTML 中选择启用此功能的唯一方式。
这意味着
iframe
中的 SVG 文档无法这样做。
注: 由于 HTML 解析器的一些特殊行为,
meta
元素在技术上可以出现在
head
和
body
元素之间,
并会被重新设为
head
的子元素。
对于 <meta name=responsive-embedded-sizing> 元素来说,这仍然是有效位置,
因为此时
body
尚未被打开。
请注意,大多数 HTML 元素都会隐式打开一个
body
元素,
即使
body
起始标签并不存在;
如果文档完全缺少这样的元素,
则会自动生成并插入一个空元素。
内部布局内在尺寸首先根据
嵌入文档在触发 DOMContentLoaded
事件之后的第一次布局结果来设置,
并在 load
事件于 Window
上触发时再次设置。
嵌入文档后续的内容、样式或布局变化
不会自动影响内部布局内在
尺寸,
但请参见 requestResize()。
嵌入文档还可以具有一个锁定的嵌入 ICB 尺寸, 其初始值为 null。 如果文档在执行布局时,其响应式嵌入尺寸标志为 true, 且其锁定的嵌入 ICB 尺寸为 null, 则会将其当前初始包含块尺寸记录为其锁定的嵌入 ICB 尺寸。 在后续布局中, 它会使用其锁定的嵌入 ICB 尺寸, 而不是按正常方式计算其初始包含块尺寸。
注: 这种对 ICB 的冻结 降低了出现布局循环的可能性 (例如 iframe 文档的尺寸略大于其 ICB, 然后父 iframe 调整尺寸以匹配, 下一次布局又使其略大于 ICB, 如此无限循环)。
我们是否需要提供一种方式 强制 iframe 忘记其锁定的嵌入 ICB 尺寸? 也许可以关闭再重新开启 frame-sizing?
导航 iframe 的文档 会使它忘记其锁定的嵌入 ICB 尺寸。 只要新文档的响应式嵌入尺寸标志尚未设置, 它就不会忘记其内部布局内在尺寸。 一旦标志被设置(无论为 true 还是 false), 内部布局内在尺寸就会被遗忘; 如果标志被设置为 true, 则两者之后都会按正常方式重新计算。
5.3.2.
对 Window
接口的扩展
partial interface Window {undefined requestResize (); };
requestResize() 时:
-
令 navigable 为以 this 作为其内容窗口的可导航对象。 如果 navigable 不是子可导航对象, 则抛出一个
NotAllowedErrorDOMException。 -
令 host element 为其内容可导航对象是 navigable 的可导航容器。 如果 host element 不是 HTML
iframe元素, 则抛出一个NotAllowedErrorDOMException。 -
令 document 为 this 的活动文档。 如果 document 的响应式嵌入尺寸标志 未设置或为 false, 则抛出一个
NotAllowedErrorDOMException。 -
如果 document 有待处理的样式或布局更改, 则执行这些更改。
5.4. 内在尺寸贡献
5.5. 将 Min-Content 尺寸贡献归零:min-intrinsic-sizing 属性
| 名称: | min-intrinsic-sizing |
|---|---|
| 值: | legacy | zero-if-scroll || zero-if-extrinsic |
| 初始值: | legacy |
| 适用于: | 除行内 框之外的所有元素 |
| 继承: | 否 |
| 百分比: | 不适用 |
| 计算值: | 按指定值 |
| 规范顺序: | 依语法而定 |
| 动画类型: | 离散 |
此属性定义非替换框的min-content 贡献 是否会在特定情况下被“压缩”。 各值含义如下:
- legacy
- 框的min-content 贡献 按正常方式处理。
- zero-if-scroll
- 如果框在该轴上是滚动 容器, 则框的min-content 贡献 会被“压缩”。
- zero-if-extrinsic
-
如果框具有一个外在的
首选或最大尺寸,
则框的min-content 贡献
会被“压缩”。
注: 这是大多数替换元素的默认行为。
*, ::before, ::after{ min-intrinsic-sizing : zero-if-scroll; }
如果滚动容器包含表格或很长的不可断开文本行等大型项目, 这可以防止它把祖先元素的尺寸撑大。 同时,它允许非滚动容器的框 继续影响其祖先的min-content 尺寸。
注: zero-if-scroll 的行为本来会是更好的 默认值, 但由于 Web 兼容性问题,它不能作为初始值。:(
“压缩后”的min-content 贡献 通过假装框为空来计算, 但在考虑由显式的 min-content、max-content 和 fit-content 值 对尺寸属性施加的尺寸约束时除外。
5.6. 新的列尺寸值:stretch、min-content、max-content、fit-content 和 fit-content() 值
| 名称: | column-width |
|---|---|
| 新值: | <box-size> |
| 计算值: | 按指定值,其中 <length-percentage> 值会被计算 |
| 动画类型: | 按计算值类型 |
当作为 column-width 的值使用时, 这些新关键字指定最佳列宽:
- stretch
- 将最佳列宽指定为多列容器的stretch-fit 行内尺寸。
- min-content
- 将最佳列宽指定为多列容器内容的min-content 行内尺寸。
- max-content
- 将最佳列宽指定为多列容器内容的max-content 行内尺寸。
- fit-content
- 将最佳列宽指定为
min(max-content 行内尺寸, max(min-content 行内尺寸, stretch-fit 行内尺寸))。 - fit-content(<length-percentage>)
-
将最佳列宽指定为
min(max-content 尺寸, max(min-content 尺寸, <length-percentage>))
注: 列宽不会因列而异。 当列宽由多列容器的内容决定时 (如上述关键字), 会考虑其全部内容, 并由所有列共享计算出的宽度。
6. 外在尺寸确定
6.1. Contain-fit 尺寸确定:在保持纵横比的同时拉伸
Contain-fit 尺寸确定本质上应用 stretch-fit 尺寸确定, 但会减小框在一个轴上的尺寸, 以保持框的首选纵横比, 类似于 contain 关键字在 object-fit 和 background-size 属性中的行为。
首先,确定一个目标矩形:
- 初始目标矩形的尺寸为框的包含块尺寸, 任何不确定尺寸都假定为无穷大。 如果两个维度都是不确定的, 则初始目标矩形被设置为 与该框在进行stretch-fit 尺寸确定时的外边缘相匹配。
- 接下来,如果框具有非 none 的 max-width 或 max-height, 则目标矩形在受影响维度上会被限制为 小于或等于框的外边距框的“最大尺寸”, 即如果框按其 max-width/height 进行尺寸确定时, 其外边距框所具有的尺寸。 (请注意,与正常的框尺寸确定 规则一致, 此“最大尺寸”的下限受到框的 min-width/min-height 的影响。)
- 最后,目标矩形会在一个维度上缩小 到使其与框的首选纵横比匹配所需的最小程度。
每个维度上的 contain-fit 尺寸 是将框通过 stretch-fit 方式适配到目标矩形后得到的尺寸。
复制 stretch-fit 最终在外边距折叠方面采用的处理方式。
如果某个维度存在最小尺寸, 且在遵循纵横比时会导致目标矩形溢出, 我们应该遵循纵横比还是让图像变形? 如果是前者,我们需要增加一个类似于 #2 的步骤来应用相关最小值。
6.2. 百分比尺寸确定
…
变更
自 2021 年 5 月 5 日工作草案以来的变更
自 2021 年 5 月 5 日 工作草案以来的重要变更包括:
-
向尺寸 属性新增 calc-size()。 (议题 6265)
-
新增 frame-sizing 属性定义。 (1771)
-
从第 3 级导入 fit-content(),并将 fit-content 和 stretch 降回第 3 级。 (议题 10601)
-
引入 <box-size> 语法产生式,以整合尺寸 值。 (议题 13478)
-
禁止重新排序 contain-intrinsic-size 中的值。 (议题 6391)。
-
仅当元素正在跳过其内容时, 才为 contain-intrinsic-* 属性的 auto 值使用上次记忆的尺寸, 以避免出现虚假尺寸。 (议题 6308)。
-
明确哪些元素会获得上次记忆的尺寸以及何时获得。 (议题 6220)
-
为 contain-intrinsic-size 属性新增逻辑属性组。 (议题 2822)。
-
更改 contain-intrinsic-size 的语法,以允许更 灵活的值组合。 (议题 8407)。
-
禁止 contain-intrinsic-* 属性使用负长度。 (议题 11945)。
-
通过 'contain-intrinsic-size/from-element' 值新增响应式尺寸的 iframe。 (议题 1771)。
-
明确 Flexbox 的stretch-fit 尺寸确定行为与 stretch 略有不同。 (议题 11784)。
-
新增 Web 平台测试覆盖。
-
其他各种小的编辑修正和改进。
自 2020 年 10 月 20 日工作草案以来的变更
自 2020 年 10 月 20 日 工作草案以来的重要变更包括:
-
起草 min-intrinsic-sizing 属性, 以更好地控制滚动容器的 min-content 贡献。 (议题 1865, 议题 4585)
-
为 contain-intrinsic-size 新增长写属性, 以独立控制各个轴。 (议题 5432)
-
为 contain-intrinsic-size 起草 auto 值, 以允许“记住”先前计算出的尺寸。 (议题 5668, 议题 5815)
-
定义 aspect-ratio 中退化比率的处理方式。 (议题 5557)
-
定义 aspect-ratio 如何影响替换元素的自然尺寸。 (议题 5306)
-
修正 § 4.4 最小/最大尺寸传递 一节中的一些错误, 使其行为不会与 CSS2 / CSS 弹性布局 / 等规范定义的行为冲突。 (议题 6071)
自 2020 年 5 月 26 日 首次公开工作草案以来的重要变更包括:
-
将比率确定轴定义为一个术语。
-
定义 min/max 尺寸约束会跨纵横比传递, (议题 5257)
此外,任一轴中的尺寸约束 (origin 轴) 会通过首选纵横比 按如下方式传递到另一轴(destination 轴):
-
首先,任何确定的最小 尺寸都会从 origin 轴转换并传递 到 destination 轴。 此传递后的最小值受 destination 轴中任何确定的首选或最大 尺寸的上限限制。
-
然后,任何确定的最大 尺寸都会从 origin 轴转换并传递 到 destination。 此传递后的最大值受 destination 轴中任何确定的首选或最小 尺寸的下限限制, 以及传递后的最小值(如果有)的下限限制。
注: 基本原则是,尺寸 约束会通过纵横比传递到另一侧, 在不违反受影响轴上任何显式指定尺寸的前提下, 尽可能保持纵横比。
-
-
明确在一个只具有一个自然 尺寸的替换元素上,aspect-ratio 会确定另一个维度。 (议题 5306)
如果一个替换元素唯一的自然维度 是自然宽度或自然高度, 为其提供首选纵横比 也会赋予其缺失的自然高度或宽度, 方法是通过首选纵横比 传递已有的尺寸。
-
定义 aspect-ratio 会抑制外边距自身折叠 (议题 5328)
对于外边距折叠(CSS 2 § 8.3.1 折叠外边距), 如果块轴是比率依赖轴, 则不认为它具有计算后的 block-size 值 auto。
自第 3 级以来的新增内容
- 为尺寸属性新增 fit-content() 函数和 contain 关键字。
- 新增 aspect-ratio 属性。
- 新增 contain-intrinsic-width、contain-intrinsic-height、contain-intrinsic-block-size 和 contain-intrinsic-inline-size 属性, 以及它们的简写属性 contain-intrinsic-size。
- 新增 min-intrinsic-sizing 属性。
- 新增 frame-sizing 属性。
致谢
特别感谢 Aaron Gustafson、L. David Baron 对本模块作出的贡献。
隐私考虑
本规范未引入新的隐私考虑。
安全考虑
本规范未引入新的安全考虑。