1. 介绍
本节非规范性内容。
CSS 2.1 定义了四种布局模式——根据盒子与其兄弟和祖先盒子的关系确定盒子的尺寸和位置的算法:
-
块布局,适用于文档布局
-
内联布局,适用于文本布局
-
表格布局,适用于以表格格式布局二维数据
-
定位布局,适用于不考虑文档中其他元素而非常明确地定位元素
本模块引入了一种新的布局模式,弹性布局,用于更加复杂的应用和网页布局。
1.1. 概述
本节非规范性内容。
弹性布局在表面上与块布局类似。 它缺少许多块布局中用于文本或文档的复杂属性,比如 浮动 和 多栏。 但弹性布局获得了简单且强大的工具, 可用于分配空间和对齐内容,这也正是 Web 应用和复杂网页常常需要的。 一个弹性容器的内容:
-
目录使用弹性布局横向排列商品行,并确保行内项目高度一致。 每个商品本身又是一个纵向弹性容器,垂直排列其内容。
-
在每个商品内,源文档内容顺序是标题、描述和图片。 这样有利于语音呈现和无 CSS 浏览器下的顺序。 为了更吸引人的视觉效果,使用 order 把图片从内容后面提升到顶部, 并用 align-self 实现水平居中。
-
在购买按钮上方加一个auto 外边距, 可以把按钮推到底部,无论描述高度如何。
#deals{ display : flex; /* 弹性布局,行内项目高度一致 */ flex-flow: row wrap; /* 允许项目换行为多行 */ } .sale-item{ display : flex; /* 每个项目用弹性布局 */ flex-flow: column; /* 项目内容垂直排列 */ } .sale-item > img{ order : -1 ; /* 图片提前到其他内容之前(视觉顺序) */ align-self: center; /* 图片交叉轴居中(水平居中) */ } .sale-item > button{ margin-top : auto; /* 自动顶边距将按钮推到底部 */ }
< section id = "deals" > < section class = "sale-item" > < h1 > 电脑入门套装</ h1 > < p > 如果你的预算有限,这是你能买到的最好的电脑。< ul > < li > 电脑< li > 显示器< li > 键盘< li > 鼠标</ ul > < img src = "images/computer.jpg" alt = "你将获得:一台白色电脑和配套外设。" > < button > 立即购买</ button > </ section > < section class = "sale-item" > …</ section > …</ section >
电脑入门套装
如果你的预算有限,这是你能买到的最好的电脑。
- 电脑
- 显示器
- 键盘
- 鼠标
打印机
只能打印 ASCII 艺术。
- 不含纸张和墨水。
1.2. 模块交互
本模块扩展了 display 属性 [CSS2], 增加了新的块级和内联级 display 类型, 并定义了一种新的格式化上下文,以及用于控制其布局的属性。 本模块定义的属性均不适用于 ::first-line 和 ::first-letter 伪元素。
CSS 盒对齐模块扩展并替代了此处引入的对齐属性定义 (justify-content, align-items, align-self, align-content) 。
测试
1.3. 值定义
本规范采用 CSS 属性定义约定 [CSS2], 并使用 值定义语法 [CSS-VALUES-3]。 本规范未定义的值类型在 CSS Values & Units [CSS-VALUES-3] 中定义。 与其他 CSS 模块结合时,这些值类型定义可能会扩展。
除了各自定义中列出的属性专用值外, 本规范定义的所有属性也接受 CSS 全局关键字 作为属性值。 为便于阅读未一一列出。
2. 弹性布局盒模型及术语
弹性容器是由 display 属性计算为 flex 或 inline-flex 的元素生成的盒。 弹性容器的普通流内子元素称为 弹性项目,并使用弹性布局模型进行布局。
与偏向于 块和内联流向 的块和内联布局不同, 弹性布局偏向于 弹性方向。 为便于讨论弹性布局, 本节定义了一组弹性流向相关术语。 flex-flow 的值和 书写模式决定了这些术语如何映射到物理方向(上/右/下/左)、轴线(垂直/水平)和尺寸(宽度/高度)。
- 主轴
- 主维度
- 主轴是弹性容器内弹性项目布局的主要轴线。 它沿着主维度延伸。
- 主起点
- 主终点
- 弹性项目在容器内从 主起点边开始,依次放置到 主终点边。
- 主尺寸
- 主尺寸属性
-
主尺寸指的是 弹性容器 或 弹性项目 的 宽度
或 高度,
取决于哪个位于 主轴方向。
它的 主尺寸属性 是其 width 或 height
属性,
取决于哪个位于 主轴方向。
同理,其 最小和 最大主尺寸属性 分别是
min-width/max-width 或 min-height/max-height 属性,
取决于哪个位于 主轴方向,
并决定其 最小/最大主尺寸。
在 弹性布局中, 主尺寸由 flex 属性控制, 而不是直接由 主尺寸属性控制。
注意:这意味着任何对弹性项目在 主轴方向上的已用尺寸(width、height、inline size、block size) 的引用都指其弹性伸缩后的 主尺寸。
- 交叉轴
- 交叉维度
- 与 主轴 垂直的轴称为 交叉轴, 沿着 交叉维度 延伸。
- 交叉起点
- 交叉终点
- 弹性行从 交叉起点边开始填充并放入容器, 依次到 交叉终点边。
- 交叉尺寸
- 交叉尺寸属性
- 交叉尺寸指 弹性容器或 弹性项目的 宽度 或 高度, 取决于其所在的 交叉维度。 其 交叉尺寸属性为 width 或 height 属性, 取决于 交叉维度。 同理,最小和最大交叉尺寸属性为 min-width/max-width 或 min-height/max-height 属性, 取决于 交叉维度, 决定其 最小/最大交叉尺寸。
本规范用到的其他尺寸术语,详见 CSS 内在与外在尺寸。[CSS-SIZING-3]
3. 弹性容器:flex 和 inline-flex display 属性值
- flex
-
该值会使元素生成一个 弹性容器 盒,
当其处于 流式布局 时,该盒为 块级。
测试
- baseline-synthesis-001.html (在线测试) (源码)
- baseline-synthesis-002.html (在线测试) (源码)
- baseline-synthesis-003.html (在线测试) (源码)
- baseline-synthesis-004.html (在线测试) (源码)
- baseline-synthesis-vert-lr-line-under.html (在线测试) (源码)
- display-flex-001.htm (在线测试) (源码)
- dynamic-change-simplified-layout-002.html (在线测试) (源码)
- dynamic-change-simplified-layout.html (在线测试) (源码)
- fixedpos-video-in-abspos-quirk-crash.html (在线测试) (源码)
- flexbox_flex-0-0-0.html (在线测试) (源码)
- flexbox_flex-0-0-0-unitless.html (在线测试) (源码)
- flexbox_flex-0-0-1-unitless-basis.html (在线测试) (源码)
- flexbox_flex-0-0-auto.html (在线测试) (源码)
- flexbox_flex-0-0-auto-shrink.html (在线测试) (源码)
- flexbox_flex-0-0.html (在线测试) (源码)
- flexbox_flex-0-0-N.html (在线测试) (源码)
- flexbox_flex-0-0-Npercent.html (在线测试) (源码)
- flexbox_flex-0-0-Npercent-shrink.html (在线测试) (源码)
- flexbox_flex-0-0-N-shrink.html (在线测试) (源码)
- flexbox_flex-0-0-N-unitless-basis.html (在线测试) (源码)
- flexbox_flex-0-1-0.html (在线测试) (源码)
- flexbox_flex-0-1-0-unitless.html (在线测试) (源码)
- flexbox_flex-0-1-1-unitless-basis.html (在线测试) (源码)
- flexbox_flex-0-1-auto.html (在线测试) (源码)
- flexbox_flex-0-1-auto-shrink.html (在线测试) (源码)
- flexbox_flex-0-1.html (在线测试) (源码)
- flexbox_flex-0-1-N.html (在线测试) (源码)
- flexbox_flex-0-1-Npercent.html (在线测试) (源码)
- flexbox_flex-0-1-Npercent-shrink.html (在线测试) (源码)
- flexbox_flex-0-1-N-shrink.html (在线测试) (源码)
- flexbox_flex-0-1-N-unitless-basis.html (在线测试) (源码)
- flexbox_flex-0-auto.html (在线测试) (源码)
- flexbox_flex-0-N-0.html (在线测试) (源码)
- flexbox_flex-0-N-0-unitless.html (在线测试) (源码)
- flexbox_flex-0-N-auto.html (在线测试) (源码)
- flexbox_flex-0-N-auto-shrink.html (在线测试) (源码)
- flexbox_flex-0-N.html (在线测试) (源码)
- flexbox_flex-0-N-N.html (在线测试) (源码)
- flexbox_flex-0-N-Npercent.html (在线测试) (源码)
- flexbox_flex-0-N-Npercent-shrink.html (在线测试) (源码)
- flexbox_flex-0-N-N-shrink.html (在线测试) (源码)
- flexbox_flex-1-0-0.html (在线测试) (源码)
- flexbox_flex-1-0-0-unitless.html (在线测试) (源码)
- flexbox_flex-1-0-auto.html (在线测试) (源码)
- flexbox_flex-1-0-auto-shrink.html (在线测试) (源码)
- flexbox_flex-1-0.html (在线测试) (源码)
- flexbox_flex-1-0-N.html (在线测试) (源码)
- flexbox_flex-1-0-Npercent.html (在线测试) (源码)
- flexbox_flex-1-0-Npercent-shrink.html (在线测试) (源码)
- flexbox_flex-1-0-N-shrink.html (在线测试) (源码)
- flexbox_flex-1-1-0.html (在线测试) (源码)
- flexbox_flex-1-1-0-unitless.html (在线测试) (源码)
- flexbox_flex-1-1-auto.html (在线测试) (源码)
- flexbox_flex-1-1-auto-shrink.html (在线测试) (源码)
- flexbox_flex-1-1.html (在线测试) (源码)
- flexbox_flex-1-1-N.html (在线测试) (源码)
- flexbox_flex-1-1-Npercent.html (在线测试) (源码)
- flexbox_flex-1-1-Npercent-shrink.html (在线测试) (源码)
- flexbox_flex-1-1-N-shrink.html (在线测试) (源码)
- flexbox_flex-1-N-0.html (在线测试) (源码)
- flexbox_flex-1-N-0-unitless.html (在线测试) (源码)
- flexbox_flex-1-N-auto.html (在线测试) (源码)
- flexbox_flex-1-N-auto-shrink.html (在线测试) (源码)
- flexbox_flex-1-N.html (在线测试) (源码)
- flexbox_flex-1-N-N.html (在线测试) (源码)
- flexbox_flex-1-N-Npercent.html (在线测试) (源码)
- flexbox_flex-1-N-Npercent-shrink.html (在线测试) (源码)
- flexbox_flex-1-N-N-shrink.html (在线测试) (源码)
- flexbox_flex-N-0-0.html (在线测试) (源码)
- flexbox_flex-N-0-0-unitless.html (在线测试) (源码)
- flexbox_flex-N-0-auto.html (在线测试) (源码)
- flexbox_flex-N-0-auto-shrink.html (在线测试) (源码)
- flexbox_flex-N-0.html (在线测试) (源码)
- flexbox_flex-N-0-N.html (在线测试) (源码)
- flexbox_flex-N-0-Npercent.html (在线测试) (源码)
- flexbox_flex-N-0-Npercent-shrink.html (在线测试) (源码)
- flexbox_flex-N-0-N-shrink.html (在线测试) (源码)
- flexbox_flex-N-1-0.html (在线测试) (源码)
- flexbox_flex-N-1-0-unitless.html (在线测试) (源码)
- flexbox_flex-N-1-auto.html (在线测试) (源码)
- flexbox_flex-N-1-auto-shrink.html (在线测试) (源码)
- flexbox_flex-N-1.html (在线测试) (源码)
- flexbox_flex-N-1-N.html (在线测试) (源码)
- flexbox_flex-N-1-Npercent.html (在线测试) (源码)
- flexbox_flex-N-1-Npercent-shrink.html (在线测试) (源码)
- flexbox_flex-N-1-N-shrink.html (在线测试) (源码)
- flexbox_flex-N-N-0.html (在线测试) (源码)
- flexbox_flex-N-N-0-unitless.html (在线测试) (源码)
- flexbox_flex-N-N-auto.html (在线测试) (源码)
- flexbox_flex-N-N-auto-shrink.html (在线测试) (源码)
- flexbox_flex-N-N.html (在线测试) (源码)
- flexbox_flex-N-N-N.html (在线测试) (源码)
- flexbox_flex-N-N-Npercent.html (在线测试) (源码)
- flexbox_flex-N-N-Npercent-shrink.html (在线测试) (源码)
- flexbox_flex-N-N-N-shrink.html (在线测试) (源码)
- flexbox_flex-formatting-interop.html (在线测试) (源码)
- flexbox_generated-flex.html (在线测试) (源码)
- flexbox_generated.html (在线测试) (源码)
- flexbox_generated-nested-flex.html (在线测试) (源码)
- flexbox-iframe-intrinsic-size-001.html (在线测试) (源码)
- flexbox_item-bottom-float.html (在线测试) (源码)
- flexbox_item-clear.html (在线测试) (源码)
- flexbox_item-float.html (在线测试) (源码)
- flexbox_item-top-float.html (在线测试) (源码)
- flexbox_item-vertical-align.html (在线测试) (源码)
- flexbox_block.html (在线测试) (源码)
- flexbox_box-clear.html (在线测试) (源码)
- flexbox_display.html (在线测试) (源码)
- flexbox_fbfc2.html (在线测试) (源码)
- flexbox_fbfc.html (在线测试) (源码)
- flexbox_nested-flex.html (在线测试) (源码)
- flexbox-root-node-001a.html (在线测试) (源码)
- flexbox-root-node-001b.html (在线测试) (源码)
- flexbox_stf-fixpos.html (在线测试) (源码)
- flexbox_stf-float.html (在线测试) (源码)
- flexbox_stf-inline-block.html (在线测试) (源码)
- flexbox_stf-table-caption.html (在线测试) (源码)
- flexbox_stf-table-cell.html (在线测试) (源码)
- flexbox_stf-table.html (在线测试) (源码)
- flexbox_stf-table-row-group.html (在线测试) (源码)
- flexbox_stf-table-row.html (在线测试) (源码)
- flexbox_stf-table-singleline-2.html (在线测试) (源码)
- flexbox_stf-table-singleline.html (在线测试) (源码)
- flexbox_table-fixed-layout.html (在线测试) (源码)
- flexbox-with-multi-column-property.html (在线测试) (源码)
- flexbox_computedstyle_display.html (在线测试) (源码)
- grid-flex-item-001.html (在线测试) (源码)
- grid-flex-item-002.html (在线测试) (源码)
- grid-flex-item-003.html (在线测试) (源码)
- grid-flex-item-004.html (在线测试) (源码)
- grid-flex-item-005.html (在线测试) (源码)
- grid-flex-item-006.html (在线测试) (源码)
- grid-flex-item-007.html (在线测试) (源码)
- flexbox_interactive_flex-transitions.html (manual test) (源码)
- flexbox_interactive_order-transitions-2.html (manual test) (源码)
- flexbox_interactive_order-transitions.html (manual test) (源码)
- nested-flex-image-loading-invalidates-intrinsic-sizes.html (在线测试) (源码)
- percentage-margins-001.html (在线测试) (源码)
- stretch-after-sibling-size-change.html (在线测试) (源码)
- stretched-child-in-nested-flexbox-001.html (在线测试) (源码)
- stretched-child-in-nested-flexbox-002.html (在线测试) (源码)
- stretched-child-in-nested-flexbox-003.html (在线测试) (源码)
- stretched-child-shrink-on-relayout.html (在线测试) (源码)
- stretch-flex-item-checkbox-input.html (在线测试) (源码)
- stretch-flex-item-radio-input.html (在线测试) (源码)
- stretching-orthogonal-flows.html (在线测试) (源码)
- table-with-percent-intrinsic-width.html (在线测试) (源码)
- inline-flex
-
该值会使元素生成一个 弹性容器 盒,
当其处于 流式布局 时,该盒为 内联级。
测试
- 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 (在线测试) (源码)
- flexbox_computedstyle_display-inline.html (在线测试) (源码)
- intrinsic-width-orthogonal-writing-mode.html (在线测试) (源码)
弹性容器为其内容建立了一个新的 弹性格式化上下文。 这与建立块格式化上下文类似,只是使用弹性布局而不是块布局。 例如,浮动不会侵入弹性容器, 并且弹性容器的外边距不会与其内容的外边距折叠。 弹性容器为其内容形成包含块, 和块容器完全一样。 [CSS2] overflow 属性适用于弹性容器。
测试
- 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.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 (在线测试) (源码)
弹性容器不是块容器,因此一些基于块布局假设设计的属性在弹性布局环境下并不适用。尤其:
-
vertical-align 对弹性项目无效。
-
::first-line 和 ::first-letter 伪元素不适用于 弹性容器, 弹性容器也不会为其祖先贡献 首格式化行或首字母。
测试
- 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 (在线测试) (源码)
如果元素指定的display 属性为 inline-flex, 那么在某些情况下其display属性会被计算为 flex: CSS 2.1 第9.7节中的表格会添加一行, 其中 "Specified Value" 列为 inline-flex, "Computed Value" 列为 flex。
4. 弹性项目
每个弹性容器的流内子元素都会成为 弹性项目, 每个子文本序列会被包裹在一个匿名 块容器 弹性项目中。 但是,如果整个文本序列仅包含 文档空白字符(即能被white-space属性影响的字符), 则不会渲染(就像其文本节点被设置为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 (在线测试) (源码)
- 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 (在线测试) (源码)
弹性项目的示例:
< div style = "display:flex" > <!-- 弹性项目:块级子元素 --> < div id = "item1" > block</ div > <!-- 弹性项目:浮动元素,浮动会被忽略 --> < div id = "item2" style = "float: left;" > float</ div > <!-- 弹性项目:匿名块盒包裹内联内容 --> anonymous item 3<!-- 弹性项目:内联子元素 --> < span > item 4<!-- 弹性项目不会 在块元素周围分割 --> < q style = "display: block" id = not-an-item > item 4</ q > item 4</ span > </ div >
注意,元素间的空白会消失:它不会成为独立的弹性项目,即使元素间的文本确实会被包裹在匿名弹性项目中。
还要注意,匿名项目的盒子不可设置样式,因为没有元素可以分配样式规则。但其内容会继承弹性容器的样式(如字体设置)。
弹性项目 为其内容建立独立的格式化上下文。 但弹性项目自身是弹性级盒子,而不是块级盒子: 它们参与其容器的弹性格式化上下文,而不是块格式化上下文。
注意: 阅读本规范的作者可能想要跳过下面的盒子生成与静态定位细节。
如果元素最近的祖先元素(跳过 display:contents 祖先)的 计算 display值为 flex 或 inline-flex, 那么该元素自身的display值将会被 块化。 (块化值转换的详细信息见 CSS2.1§9.7 [CSS2] 及 CSS Display 3 § 2.7 自动盒类型转换。)
注意: 即使 flex 或 inline-flex 元素最终没有生成 弹性容器盒子, 块化仍然会发生。例如当其是 替换元素 或处于 display: none 子树中时。
注意: 某些 display 的值通常会在原始盒子外创建匿名盒。 如果这样的盒子是 弹性项目, 会先块化,因此不会再创建匿名盒。例如,两个连续的弹性项目 display: table-cell, 会变成两个独立的display: block 弹性项目,而不是被包裹为一个匿名表格。
对于 display: table 的弹性项目, 表格包装盒会成为弹性项目, 因此 align-self 属性适用于它。 任何 caption 盒的内容会参与表格包装盒的 min-content 和 max-content 尺寸计算。 但与 width、 height 一样, flex 长属性应用于表格盒时如下: 弹性项目的最终尺寸通过布局计算, 假定表格包装盒的边缘与表格盒内容边缘之间的距离都属于表格盒的 border+padding 区域, 并且表格盒就是弹性项目。
4.1. 绝对定位的弹性子项
由于绝对定位元素脱离了文档流,弹性容器的绝对定位子元素不会参与弹性布局。
弹性容器的绝对定位子元素的 交叉轴方向的 静态定位矩形边缘, 是该弹性容器的内容边缘。 静态定位矩形的 主轴方向的边缘, 是子元素作为唯一弹性项目时, 其外边距边缘 应该被放置的位置, 前提是子元素和弹性容器都是其已用尺寸的固定尺寸盒子。 (在此情况下,子元素的auto外边距视为零。)
测试
- abspos-autopos-htb-ltr.html (在线测试) (源码)
- abspos-autopos-htb-rtl.html (在线测试) (源码)
- abspos-autopos-vlr-ltr.html (在线测试) (源码)
- abspos-autopos-vlr-rtl.html (在线测试) (源码)
- abspos-autopos-vrl-ltr.html (在线测试) (源码)
- abspos-autopos-vrl-rtl.html (在线测试) (源码)
- dynamic-align-self-001.html (在线测试) (源码)
- flex-abspos-staticpos-align-self-safe-002.html (在线测试) (源码)
- flex-abspos-staticpos-align-self-safe-003.html (在线测试) (源码)
- abspos-descendent-001.html (在线测试) (源码)
- flex-abspos-staticpos-align-content-001.html (在线测试) (源码)
- flex-abspos-staticpos-align-self-001.html (在线测试) (源码)
- flex-abspos-staticpos-align-self-002.html (在线测试) (源码)
- flex-abspos-staticpos-align-self-003.html (在线测试) (源码)
- flex-abspos-staticpos-align-self-004.html (在线测试) (源码)
- flex-abspos-staticpos-align-self-005.html (在线测试) (源码)
- flex-abspos-staticpos-align-self-006.html (在线测试) (源码)
- flex-abspos-staticpos-align-self-007.html (在线测试) (源码)
- flex-abspos-staticpos-align-self-008.html (在线测试) (源码)
- flex-abspos-staticpos-align-self-rtl-001.html (在线测试) (源码)
- flex-abspos-staticpos-align-self-rtl-002.html (在线测试) (源码)
- flex-abspos-staticpos-align-self-rtl-003.html (在线测试) (源码)
- flex-abspos-staticpos-align-self-rtl-004.html (在线测试) (源码)
- flex-abspos-staticpos-align-self-safe-001.html (在线测试) (源码)
- flex-abspos-staticpos-align-self-vertWM-001.html (在线测试) (源码)
- flex-abspos-staticpos-align-self-vertWM-002.html (在线测试) (源码)
- flex-abspos-staticpos-align-self-vertWM-003.html (在线测试) (源码)
- flex-abspos-staticpos-align-self-vertWM-004.html (在线测试) (源码)
- flex-abspos-staticpos-fallback-justify-content-001.html (在线测试) (源码)
- flex-abspos-staticpos-justify-content-001.html (在线测试) (源码)
- flex-abspos-staticpos-justify-content-002.html (在线测试) (源码)
- flex-abspos-staticpos-justify-content-003.html (在线测试) (源码)
- flex-abspos-staticpos-justify-content-004.html (在线测试) (源码)
- flex-abspos-staticpos-justify-content-005.html (在线测试) (源码)
- flex-abspos-staticpos-justify-content-006.html (在线测试) (源码)
- flex-abspos-staticpos-justify-content-007.html (在线测试) (源码)
- flex-abspos-staticpos-justify-content-008.html (在线测试) (源码)
- flex-abspos-staticpos-justify-content-rtl-001.html (在线测试) (源码)
- flex-abspos-staticpos-justify-content-rtl-002.html (在线测试) (源码)
- flex-abspos-staticpos-justify-content-vertWM-001.html (在线测试) (源码)
- flex-abspos-staticpos-justify-content-vertWM-002.html (在线测试) (源码)
- flex-abspos-staticpos-justify-self-001.html (在线测试) (源码)
- flex-abspos-staticpos-margin-001.html (在线测试) (源码)
- flex-abspos-staticpos-margin-002.html (在线测试) (源码)
- flex-abspos-staticpos-margin-003.html (在线测试) (源码)
- flexbox_absolute-atomic.html (在线测试) (源码)
- flexbox-abspos-child-001a.html (在线测试) (源码)
- flexbox-abspos-child-001b.html (在线测试) (源码)
- flexbox-abspos-child-002.html (在线测试) (源码)
- flexbox_inline-abspos.html (在线测试) (源码)
- position-absolute-001.html (在线测试) (源码)
- position-absolute-002.html (在线测试) (源码)
- position-absolute-003.html (在线测试) (源码)
- position-absolute-004.html (在线测试) (源码)
- position-absolute-005.html (在线测试) (源码)
- position-absolute-006.html (在线测试) (源码)
- position-absolute-007.html (在线测试) (源码)
- position-absolute-008.html (在线测试) (源码)
- position-absolute-009.html (在线测试) (源码)
- position-absolute-010.html (在线测试) (源码)
- position-absolute-011.html (在线测试) (源码)
- position-absolute-012.html (在线测试) (源码)
- position-absolute-013.html (在线测试) (源码)
- position-absolute-014.html (在线测试) (源码)
- position-absolute-015.html (在线测试) (源码)
- position-absolute-containing-block-001.html (在线测试) (源码)
- position-absolute-containing-block-002.html (在线测试) (源码)
- flex-content-alignment-with-abspos-001.html (在线测试) (源码)
- dynamic-grid-flex-abspos.html (在线测试) (源码)
- flexbox_stf-abspos.html (在线测试) (源码)
- flex-item-position-relative-001.html (在线测试) (源码)
4.2. 弹性项目的外边距和内边距
弹性项目上的百分比外边距和内边距, 与块盒上的一样, 都是相对于包含块的内联尺寸计算的, 例如左右/上下百分比都相对于其包含块的宽度在水平书写模式下计算。
auto 外边距会扩展以吸收相应维度的多余空间。 它们可以用于对齐,或用于将相邻弹性项目分开。 详见使用 auto 外边距进行对齐。
测试
4.3. 弹性项目的Z轴排序
弹性项目的绘制方式与内联块几乎完全一致 [CSS2], 唯一不同点是使用order调整后的文档顺序, 替代原始文档顺序, 并且z-index属性值只要不是 auto, 都会创建一个堆叠上下文, 即使position 为static(行为与position为relative时完全一致)。
注意: 定位在弹性项目之外的后代元素,依然参与弹性项目建立的堆叠上下文。
测试
- 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 (在线测试) (源码)
4.4. 折叠项
在弹性项目上指定 visibility:collapse 会使其成为一个折叠弹性项目, 其效果类似于表格行或表格列上的 visibility:collapse: 折叠弹性项目会完全从渲染中移除, 但会留下一个“支撑”,以保持弹性行的交叉轴尺寸稳定。 因此,如果弹性容器只有一行, 动态折叠或展开项目 可能会改变弹性容器的 主尺寸, 但保证不会影响其交叉尺寸,也不会导致页面其它布局“晃动”。 然而,折叠后会重新进行弹性行换行, 所以有多行的弹性容器的交叉尺寸可能会改变,也可能不会改变。
虽然折叠弹性项目不会被渲染, 但它们仍然会出现在格式化结构中。 因此,与display:none元素不同 [CSS2], 依赖盒子出现在格式化结构中的效果 (如计数器递增或动画与过渡的运行) 仍然会作用于折叠项。
测试
@media ( min-width:60 em ) { /* 仅当空间足够时使用双栏布局 (相对于默认文本尺寸)*/ div{ display : flex; } #main{ flex : 1 ; /* 主内容区占据所有剩余空间 */ order:1 ; /* 放在导航栏右侧 */ min-width:12 em ; /* 优化主内容区尺寸 */ } } /* 菜单项使用弹性布局使 visibility:collapse 生效 */ nav > ul > li{ display : flex; flex-flow : column; } /* 未被激活时动态折叠子菜单 */ nav > ul > li:not ( :target) :not ( :hover) > ul{ visibility : collapse; }
< div > < article id = "main" > 有趣的内容阅读</ article > < nav > < ul > < li id = "nav-about" >< a href = "#nav-about" > 关于</ a > …< li id = "nav-projects" >< a href = "#nav-projects" > 项目</ a > < ul > < li >< a href = "…" > 艺术</ a > < li >< a href = "…" > 建筑</ a > < li >< a href = "…" > 音乐</ a > </ ul > < li id = "nav-interact" >< a href = "#nav-interact" > 互动</ a > …</ ul > </ nav > </ div > < footer > …
为了计算支撑的尺寸,弹性布局首先会在所有项目未折叠的情况下进行,然后对每个折叠弹性项目用一个支撑替换,保持该项目原本所在行的交叉尺寸。 关于 visibility:collapse 如何与弹性布局交互的规范定义,参见弹性布局算法。
注意: 在任何弹性项目上使用 visibility:collapse 都会导致弹性布局算法在中途重复执行,重新运行最耗资源的步骤。 建议作者在项目不会动态折叠/展开时继续使用 display:none 隐藏项目, 因为这样对布局引擎更高效。 (由于仅在更改 visibility 时需要重复部分步骤, 所以“visibility: collapse”仍推荐用于动态场景。)
4.5. 弹性项目的自动最小尺寸
注意: auto 关键字, 表示 自动最小尺寸, 是 min-width 和 min-height 属性的新初始值。 该关键字此前在本规范中定义,现在已由 CSS Sizing 模块定义。
为了给弹性项目提供更合理的默认最小尺寸, 当 弹性项目的主轴方向 自动最小尺寸的已用值, 且其计算的 overflow值为不可滚动时, 其自动最小尺寸为基于内容的最小尺寸; 对于滚动容器,自动最小尺寸一如既往为零。
基于内容的最小尺寸 对于弹性项目,取决于该 弹性项目是否为替换元素:
- 对于替换元素
- 对于非替换元素
内容尺寸建议、 指定尺寸建议和 传递尺寸建议在此计算中会考虑相关的 min/max/首选尺寸属性, 以确保基于内容的最小尺寸不会影响作者提供的约束, 定义如下:
- 指定尺寸建议
- 如果该项目的首选 主尺寸是确定的且不是 自动的, 那么指定尺寸建议即为该尺寸。 否则无定义。
- 传递尺寸建议
- 如果该项目有首选纵横比, 且其首选 交叉尺寸是确定的, 那么传递尺寸建议即为该尺寸 (如有最小和 最大 交叉尺寸且为确定的则加以限制), 并通过纵横比转换。 否则无定义。
- 内容尺寸建议
- 内容尺寸建议是 最小内容尺寸 在主轴方向上, 若有首选纵横比, 则通过纵横比转换,并受任何确定的 最小和 最大 交叉尺寸限制。
测试
- 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 (在线测试) (源码)
- flexbox_computedstyle_min-auto-size.html (在线测试) (源码)
- flexbox_computedstyle_min-height-auto.html (在线测试) (源码)
- flexbox_computedstyle_min-width-auto.html (在线测试) (源码)
- select-element-zero-height-001.html (在线测试) (源码)
- select-element-zero-height-002.html (在线测试) (源码)
注意: 基于内容的最小尺寸 是一种内在尺寸贡献, 因此CSS Sizing 3 § 5.2 内在贡献中的循环百分比条款适用。
在计算盒子的内在尺寸(如盒子的最小内容尺寸)时, 基于内容的最小尺寸 会导致该轴上的盒子尺寸变为不确定(即使其width属性指定了确定的尺寸)。 注意,这意味着针对该尺寸计算的百分比会表现为 auto。
在除计算内在尺寸之外的任何用途, 基于内容的最小尺寸 (不同于显式的min-content等 最小尺寸)不会强制盒子的尺寸变为不确定。 但是,如果某个百分比是在应用此最小值前根据盒子尺寸解析的,则必须在应用后重新基于新尺寸解析该百分比。
特别是,当弹性尺寸用于文档的主要内容区时,最好设置一个显式的相对字体的最小宽度,如min-width: 12em。 基于内容的最小宽度可能导致一个大表格或大图片将整个内容区拉伸到溢出区域,从而使文本行过长、难以阅读。
还要注意,当对内容量大的项目使用基于内容的尺寸时,布局引擎必须遍历所有内容才能找到其最小尺寸,而如果作者设置了显式最小值则无需遍历。 (不过对于内容较少的项目,这种遍历影响很小,因此不会影响性能。)
测试
- aspect-ratio-intrinsic-size-001.html (在线测试) (源码)
- aspect-ratio-intrinsic-size-002.html (在线测试) (源码)
- aspect-ratio-intrinsic-size-003.html (在线测试) (源码)
- aspect-ratio-intrinsic-size-004.html (在线测试) (源码)
- aspect-ratio-intrinsic-size-005.html (在线测试) (源码)
- aspect-ratio-intrinsic-size-006.html (在线测试) (源码)
- aspect-ratio-intrinsic-size-007.html (在线测试) (源码)
- aspect-ratio-intrinsic-size-008.html (在线测试) (源码)
- aspect-ratio-intrinsic-size-009.html (在线测试) (源码)
- aspect-ratio-intrinsic-size-010.html (在线测试) (源码)
- aspect-ratio-transferred-max-size.html (在线测试) (源码)
- flex-item-content-is-min-width-max-content.html (在线测试) (源码)
5. 排序与方向
弹性容器中的内容可以以任意方向和顺序进行布局。 这让作者能够轻松实现以前需要复杂或易碎方法才能达到的效果, 比如使用 float 和 clear 属性的技巧。 这些功能通过 flex-direction、flex-wrap 和 order 属性来实现。
注意: 弹性布局的重新排序能力有意只影响视觉渲染, 保持语音顺序和基于源码的导航不变。 这让作者能够调整视觉呈现效果, 同时让源码顺序在非 CSS 用户代理和诸如语音或顺序导航等线性模型中保持不变。 参见 CSS Display 3 § 3.1 重新排序与可访问性 以及 弹性布局概述,其中有利用这种区分提升可访问性的示例。
作者不得使用 order 或 *-reverse 作为 flex-flow/flex-direction 的值来替代正确的源码顺序, 因为这样会破坏文档的可访问性。
5.1. 弹性流方向:flex-direction 属性
| 名称: | flex-direction |
|---|---|
| 值: | row | row-reverse | column | column-reverse |
| 初始值: | row |
| 适用于: | 弹性容器 |
| 是否继承: | 否 |
| 百分比: | 不适用 |
| 计算值: | 指定关键字 |
| 规范顺序: | 按语法 |
| 动画类型: | 离散 |
flex-direction 属性指定 弹性项目 在弹性容器中的放置方式, 通过设置弹性容器的 主轴 方向。 这决定了弹性项目的布局方向。
- row
-
弹性容器的 主轴 与当前 内联轴
的方向一致。
main-start 和 main-end 的方向分别等同于当前 inline-start 和 inline-end,
即 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
-
与 row 相同,
只是 main-start 和 main-end 的方向被交换。
测试
- flexbox_direction-row-reverse.html (在线测试) (源码)
- flexbox-mbp-horiz-001-reverse.xhtml (在线测试) (源码)
- flexbox-mbp-horiz-001-rtl-reverse.xhtml (在线测试) (源码)
- multi-line-wrap-with-row-reverse.html (在线测试) (源码)
- flexbox_justifycontent-right-001.html (在线测试) (源码)
- flexbox_justifycontent-start.html (在线测试) (源码)
- flexbox_justifycontent-start-rtl.html (在线测试) (源码)
- column
-
弹性容器的 主轴 与当前 块轴
的方向一致。
main-start 和 main-end 的方向分别等同于当前
block-start 和 block-end,
即 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
- 与 column 相同, 只是 main-start 和 main-end 的方向被交换。
注意: 反向值不会改变盒子的顺序: 与 writing-mode 和 direction [CSS3-WRITING-MODES] 类似, 它们只会改变流动方向。 绘制顺序、语音顺序和顺序导航的顺序都不会受到影响。
注意: 根据 justify-content 的值, flex-direction 的反向值可能会影响 既是 弹性容器 又是 滚动容器 的初始滚动位置。 参见 CSS Box Alignment 3 § 5.3 溢出对齐与滚动容器。
测试
- 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 (在线测试) (源码)
- flexbox_computedstyle_flex-direction-column.html (在线测试) (源码)
- flexbox_computedstyle_flex-direction-column-reverse.html (在线测试) (源码)
- flexbox_computedstyle_flex-direction-invalid.html (在线测试) (源码)
- flexbox_computedstyle_flex-direction-row.html (在线测试) (源码)
- flexbox_computedstyle_flex-direction-row-reverse.html (在线测试) (源码)
5.2. 弹性行换行:flex-wrap 属性
| 名称: | flex-wrap |
|---|---|
| 值: | nowrap | wrap | wrap-reverse |
| 初始值: | nowrap |
| 适用于: | 弹性容器 |
| 是否继承: | 否 |
| 百分比: | 不适用 |
| 计算值: | 指定关键字 |
| 规范顺序: | 按语法 |
| 动画类型: | 离散 |
flex-wrap 属性用于控制弹性容器是 单行 还是 多行, 以及 交叉轴 的方向, 该方向决定了新行的堆叠方向。
- nowrap
- 弹性容器为 单行。
- wrap
- 弹性容器为 多行。
- wrap-reverse
- 与 wrap 相同。
对于不是 wrap-reverse 的值, cross-start 方向等同于当前 inline-start 或 block-start 方向(取决于哪个是 交叉轴), 而 cross-end 方向则与 cross-start 方向相反。 当 flex-wrap 为 wrap-reverse 时, cross-start 和 cross-end 的方向会被交换。
注意: 根据 align-content 的值, wrap-reverse 作为 flex-wrap 的值时, 可能会影响既是 弹性容器 又是 滚动容器 的初始滚动位置。 参见 CSS Box Alignment 3 § 5.3 溢出对齐与滚动容器。
测试
- 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 (在线测试) (源码)
- multi-line-wrap-reverse-column-reverse.html (在线测试) (源码)
- multi-line-wrap-reverse-row-reverse.html (在线测试) (源码)
- flexbox_computedstyle_flex-wrap-invalid.html (在线测试) (源码)
- flexbox_computedstyle_flex-wrap-nowrap.html (在线测试) (源码)
- flexbox_computedstyle_flex-wrap-wrap.html (在线测试) (源码)
- flexbox_computedstyle_flex-wrap-wrap-reverse.html (在线测试) (源码)
- multiline-min-preferred-width.html (在线测试) (源码)
- multiline-reverse-wrap-baseline.html (在线测试) (源码)
5.3. 弹性方向与换行:flex-flow 简写属性
| 名称: | flex-flow |
|---|---|
| 值: | <'flex-direction'> || <'flex-wrap'> |
| 初始值: | 见各单独属性 |
| 适用于: | 见各单独属性 |
| 是否继承: | 见各单独属性 |
| 百分比: | 见各单独属性 |
| 计算值: | 见各单独属性 |
| 动画类型: | 见各单独属性 |
| 规范顺序: | 按语法 |
测试
- box-sizing-001.html (在线测试) (源码)
- button-column-wrap-crash.html (在线测试) (源码)
- column-intrinsic-size-aspect-ratio-crash.html (在线测试) (源码)
- css-flexbox-row.html (在线测试) (源码)
- css-flexbox-row-reverse.html (在线测试) (源码)
- css-flexbox-row-reverse-wrap.html (在线测试) (源码)
- css-flexbox-row-reverse-wrap-reverse.html (在线测试) (源码)
- css-flexbox-row-wrap.html (在线测试) (源码)
- css-flexbox-row-wrap-reverse.html (在线测试) (源码)
- css-flexbox-test1.html (在线测试) (源码)
- flexbox-flex-direction-column.htm (在线测试) (源码)
- flexbox-flex-direction-column-percentage-ignored.html (在线测试) (源码)
- flexbox-flex-direction-column-reverse.htm (在线测试) (源码)
- flexbox-flex-direction-default.htm (在线测试) (源码)
- flexbox-flex-direction-row.htm (在线测试) (源码)
- flexbox-flex-direction-row-reverse.htm (在线测试) (源码)
- flex-direction-column-001-visual.html (visual test) (源码)
- flex-direction-column.html (在线测试) (源码)
- flex-direction-column-overlap-001.html (在线测试) (源码)
- flex-direction-column-reverse-001-visual.html (visual test) (源码)
- flex-direction-column-reverse-002-visual.html (visual test) (源码)
- flex-direction-column-reverse.html (在线测试) (源码)
- flex-direction.html (在线测试) (源码)
- flex-direction-modify.html (在线测试) (源码)
- flex-direction-row-001-visual.html (visual test) (源码)
- flex-direction-row-002-visual.html (visual test) (源码)
- flex-direction-row-reverse-001-visual.html (visual test) (源码)
- flex-direction-row-reverse-002-visual.html (visual test) (源码)
- flex-direction-row-reverse.html (在线测试) (源码)
- flex-direction-row-vertical.html (在线测试) (源码)
- flex-direction-with-element-insert.html (在线测试) (源码)
- flexbox-flex-flow-001.html (在线测试) (源码)
- flexbox-flex-flow-002.html (在线测试) (源码)
- flexbox_flow-column-reverse-wrap.html (在线测试) (源码)
- flexbox_flow-column-reverse-wrap-reverse.html (在线测试) (源码)
- flexbox_flow-column-wrap.html (在线测试) (源码)
- flexbox_flow-column-wrap-reverse.html (在线测试) (源码)
- flexbox_flow-row-wrap.html (在线测试) (源码)
- flexbox_flow-row-wrap-reverse.html (在线测试) (源码)
- flex-flow-001.html (在线测试) (源码)
- flex-flow-002.html (在线测试) (源码)
- flex-flow-003.html (在线测试) (源码)
- flex-flow-004.html (在线测试) (源码)
- flex-flow-005.html (在线测试) (源码)
- flex-flow-006.html (在线测试) (源码)
- flex-flow-007.html (在线测试) (源码)
- flex-flow-008.html (在线测试) (源码)
- flex-flow-009.html (在线测试) (源码)
- flex-flow-010.html (在线测试) (源码)
- flex-flow-011.html (在线测试) (源码)
- flex-flow-012.html (在线测试) (源码)
- flex-flow-013.html (在线测试) (源码)
- flex-wrap-002.html (在线测试) (源码)
- flex-wrap-003.html (在线测试) (源码)
- flex-wrap-004.html (在线测试) (源码)
- flex-wrap-005.html (在线测试) (源码)
- flex-wrap-006.html (在线测试) (源码)
- flexbox_computedstyle_flex-flow-column.html (在线测试) (源码)
- flexbox_computedstyle_flex-flow-column-nowrap.html (在线测试) (源码)
- flexbox_computedstyle_flex-flow-column-reverse.html (在线测试) (源码)
- flexbox_computedstyle_flex-flow-column-reverse-nowrap.html (在线测试) (源码)
- flexbox_computedstyle_flex-flow-column-reverse-wrap.html (在线测试) (源码)
- flexbox_computedstyle_flex-flow-column-wrap.html (在线测试) (源码)
- flexbox_computedstyle_flex-flow-column-wrap-reverse.html (在线测试) (源码)
- flexbox_computedstyle_flex-flow-nowrap.html (在线测试) (源码)
- flexbox_computedstyle_flex-flow-row.html (在线测试) (源码)
- flexbox_computedstyle_flex-flow-row-nowrap.html (在线测试) (源码)
- flexbox_computedstyle_flex-flow-row-reverse.html (在线测试) (源码)
- flexbox_computedstyle_flex-flow-row-reverse-nowrap.html (在线测试) (源码)
- flexbox_computedstyle_flex-flow-row-reverse-wrap.html (在线测试) (源码)
- flexbox_computedstyle_flex-flow-row-reverse-wrap-reverse.html (在线测试) (源码)
- flexbox_computedstyle_flex-flow-row-wrap.html (在线测试) (源码)
- flexbox_computedstyle_flex-flow-row-wrap-reverse.html (在线测试) (源码)
- flexbox_computedstyle_flex-flow-wrap.html (在线测试) (源码)
- multiline-column-max-height.html (在线测试) (源码)
- flex-direction-computed.html (在线测试) (源码)
- flex-direction-invalid.html (在线测试) (源码)
- flex-direction-valid.html (在线测试) (源码)
- flex-flow-computed.html (在线测试) (源码)
- flex-flow-invalid.html (在线测试) (源码)
- flex-flow-shorthand.html (在线测试) (源码)
- flex-flow-valid.html (在线测试) (源码)
- flex-wrap-computed.html (在线测试) (源码)
- flex-wrap-invalid.html (在线测试) (源码)
- flex-wrap-valid.html (在线测试) (源码)
flex-flow 属性是 flex-direction 和 flex-wrap 属性的简写, 两者共同定义了弹性容器的主轴和交叉轴。
div | |
div | |
div |
| 英文 | 日文 |
|---|---|
|
|
5.4. 重新排序与可访问性:order 属性
弹性项目默认按照它们在源文档中的顺序显示和布局,
这代表了它们的逻辑顺序。
非视觉媒体(如语音)的渲染、
顺序导航模式的默认遍历顺序(比如通过链接循环,
参考 tabindex
[HTML]),
以及内容在非 CSS UA 中的表现,
也都使用这个顺序。
order 属性可以用来改变弹性项目的排序, 改为以 order-modified document order 进行布局, 以使它们在二维视觉画布上的空间排列 与在语音、顺序导航等线性表现中的逻辑顺序不同。 参见 CSS Display 3 § 3 显示顺序:order 属性。[CSS-DISPLAY-3]
注意: 由于视觉感知是二维且非线性的, 所需的盒子顺序并不总与非视觉媒体和非CSS UA使用的逻辑顺序一致。
作者必须仅使用 order 来进行视觉上的内容重排, 而不是逻辑上的重排。 如果样式表使用 order 来实现逻辑重排,则是不符合规范的。
<!DOCTYPE html> < header > ...</ header > < main > < article > ...</ article > < nav > ...</ nav > < aside > ...</ aside > </ main > < footer > ...</ footer >
使用弹性布局可轻松实现如下:
main{ display : flex; } main > article{ order : 2 ; min-width : 12 em ; flex : 1 ; } main > nav{ order : 1 ; width : 200 px ; } main > aside{ order : 3 ; width : 200 px ; }
额外福利是, 所有列默认都会等高, 主内容会根据需要自动撑满屏幕宽度。 此外, 可以结合媒体查询,在窄屏下切换为全竖直布局:
@media all and( max-width:600 px ) { /* 太窄,无法支持三列布局 */ main{ flex-flow : column; } main > article, main > nav, main > aside{ /* 返回文档顺序 */ order:0 ; width : auto; } }
(更智能换行的多行弹性容器用法留给读者自行练习。)
6. 弹性行
弹性项目在 弹性容器内会被布局和对齐在 弹性行 中, 这是布局算法用于分组和对齐的假想容器。 弹性容器可以是 单行 或 多行, 取决于 flex-wrap 属性:
-
单行弹性容器(即 flex-wrap: nowrap) 会把所有子元素都布局在一行内, 即使这会导致内容溢出。
-
多行弹性容器(即 flex-wrap: wrap 或 flex-wrap: wrap-reverse) 会将 弹性项目分布到多行, 类似于文本因太宽而换到新行。 当创建了额外的行时, 它们会根据 flex-wrap 属性沿着弹性容器的 交叉轴 堆叠。 每一行至少包含一个 弹性项目, 除非弹性容器本身完全为空。
#flex{ display : flex; flex-flow : row wrap; width : 300 px ; } .item{ width : 80 px ; }
< div id = "flex" > < div class = "item" > 1</ div > < div class = "item" > 2</ div > < div class = "item" > 3</ div > < div class = "item" > 4</ div > </ div >
由于容器宽度为 300px,只能有三个项目在一行内。 它们占据了 240px,还剩下 60px 的剩余空间。 因为 flex-flow 属性指定了 多行弹性容器 (因为值里出现了 wrap 关键字), 这个弹性容器会创建一行来容纳最后一个项目。
一旦内容被分成多行, 每行会独立布局; 弹性长度和 justify-content 以及 align-self 属性只会考虑当前行上的项目。
在 多行 弹性容器(即使只有一行), 每行的 交叉尺寸都是容纳该行上 弹性项目所需的最小尺寸 (受 align-self 对齐影响), 并且这些行会通过 align-content 属性在弹性容器中对齐。 在 单行 弹性容器中, 该行的 交叉尺寸就是弹性容器自身的 交叉尺寸, 并且 align-content 无效。 一行的 主尺寸总是与弹性容器内容区的 主尺寸一致。
测试
7. 弹性
弹性布局的核心特性是让 弹性项目“弹性伸缩”, 通过改变它们的宽度/高度来填满 主维度的可用空间。 这通过 flex 属性完成。 弹性容器会把剩余空间按项目的 flex grow factor 比例分配给项目, 以填满容器, 或根据 flex shrink factor 比例收缩项目以防止溢出。
如果一个 弹性项目 的 flex-grow 和 flex-shrink 都为零, 则称其为 完全无弹性, 否则称为 有弹性。
7.1. flex 简写属性
| 名称: | flex |
|---|---|
| 值: | none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ] |
| 初始值: | 0 1 auto |
| 适用于: | 弹性项目 |
| 是否继承: | 否 |
| 百分比: | 见各单独属性 |
| 计算值: | 见各单独属性 |
| 动画类型: | 按计算值类型 |
| 规范顺序: | 按语法 |
测试
- 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 (在线测试) (源码)
- flex-computed.html (在线测试) (源码)
- flex-invalid.html (在线测试) (源码)
- flex-shorthand.html (在线测试) (源码)
- flex-valid.html (在线测试) (源码)
flex 属性用于指定弹性尺寸的各组成部分: 弹性因子 (grow 和 shrink) 以及 弹性基础值。 当一个盒子为 弹性项目 时,会优先参考 flex,而不是 主尺寸属性, 以决定盒子的 主尺寸。 如果盒子不是 弹性项目,则 flex 没有效果。
注意: flex 各长属性的初始值等同于 flex: 0 1 auto。 这与在 flex 简写属性省略时的默认值不同 (实际上是 1 1 0px), 这样 flex 简写可以更好地适应 最常见的情况。
- <'flex-grow'>
-
此 <number
[0,∞]> 组件设置 flex-grow 长属性并指定 弹性增长因子,
用于决定当分配正剩余空间时,
弹性项目相对于同一弹性容器内其他 弹性项目 的增长比例。
若未指定,则默认为 1。
测试
- 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 (在线测试) (源码)
- flexbox_computedstyle_flex-shorthand-0-auto.html (在线测试) (源码)
- flexbox_computedstyle_flex-shorthand-auto.html (在线测试) (源码)
- flexbox_computedstyle_flex-shorthand.html (在线测试) (源码)
- flexbox_computedstyle_flex-shorthand-initial.html (在线测试) (源码)
- flexbox_computedstyle_flex-shorthand-invalid.html (在线测试) (源码)
- flexbox_computedstyle_flex-shorthand-none.html (在线测试) (源码)
- flexbox_computedstyle_flex-shorthand-number.html (在线测试) (源码)
- flexbox_computedstyle_flex-grow-0.html (在线测试) (源码)
- flexbox_computedstyle_flex-grow-invalid.html (在线测试) (源码)
- flexbox_computedstyle_flex-grow-number.html (在线测试) (源码)
- flexbox_interactive_flex-grow-transitions.html (manual test) (源码)
- flex-grow-computed.html (在线测试) (源码)
- flex-grow-invalid.html (在线测试) (源码)
- flex-grow-valid.html (在线测试) (源码)
- table-item-flex-percentage-min-width.html (在线测试) (源码)
- table-item-flex-percentage-width.html (在线测试) (源码)
Flex 值在 0 到 1 之间时有一些特殊行为: 当该行上的 flex 值总和小于 1 时, 它们只会占据不到 100% 的剩余空间。
项目的 flex-grow 值 实际上是对剩余空间某一比例的请求, 1 表示“请求 100% 剩余空间”; 如果该行上的项目总请求超过 100%, 会按比例重新分配,全部用满剩余空间。 但如果项目请求的总量少于全部剩余空间 (比如三个项目每个都是 flex-grow: .25) 那么每个项目会正好获得它请求的份额 (每个分到 25%,剩下的 25% 空间则不填充)。 详见 § 9.7 解决弹性长度, 了解剩余空间分配的具体细节。
当 flex-grow 趋近于 0 时, 这种模式是为了保证行为连续 (意味着项目想要不占剩余空间)。 如果没有这种模式,flex-grow: 1 的项目会占据全部剩余空间; 而 flex-grow: 0.1 的项目也会如此, flex-grow: 0.01 也是, 依此类推, 直到值非常小以至于下溢为 0, 项目突然完全不占剩余空间。 有了这种行为, 当 flex-grow 小于 1 时, 项目会逐渐减少对剩余空间的占据, 在为零时平滑过渡为不占空间。
除非确实需要“部分填充”行为, 作者应坚持使用 ≥ 1 的值; 例如,使用 1 和 2 通常比用 .33 和 .67 更好, 因为如果项目被添加、移除或换行时更能达到预期效果。
- <'flex-shrink'>
-
此 <number
[0,∞]> 组件设置 flex-shrink 长属性并指定 弹性收缩因子,
用于决定当分配负剩余空间时,
弹性项目相对于同一弹性容器内其他 弹性项目 的收缩比例。
若未指定,则默认为 1。
测试
- 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 (在线测试) (源码)
- flexbox_computedstyle_flex-shrink-0.html (在线测试) (源码)
- flexbox_computedstyle_flex-shrink-invalid.html (在线测试) (源码)
- flexbox_computedstyle_flex-shrink-number.html (在线测试) (源码)
- flexbox_interactive_flex-shrink-transitions.html (manual test) (源码)
- flexbox_interactive_flex-shrink-transitions-invalid.html (manual test) (源码)
- flex-shrink-computed.html (在线测试) (源码)
- flex-shrink-invalid.html (在线测试) (源码)
- flex-shrink-valid.html (在线测试) (源码)
- table-item-flex-percentage-min-width.html (在线测试) (源码)
- table-item-flex-percentage-width.html (在线测试) (源码)
注意: 在分配负空间时,flex shrink factor 会与 flex base size 相乘。 这样会按照项目可收缩的程度来分配负空间, 例如,一个较小的项目不会在较大的项目明显变小之前就缩小到零。
- <'flex-basis'>
-
此组件用于设置 flex-basis 长属性,
用于指定 弹性基础值:
即在根据弹性因子分配剩余空间之前,
弹性项目的初始 主尺寸。
测试
- flex-basis-composition.html (在线测试) (源码)
- flex-basis-content-crash.html (在线测试) (源码)
- 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 (在线测试) (源码)
- flexbox_computedstyle_flex-basis-0.html (在线测试) (源码)
- flexbox_computedstyle_flex-basis-0percent.html (在线测试) (源码)
- flexbox_computedstyle_flex-basis-auto.html (在线测试) (源码)
- flexbox_computedstyle_flex-basis-percent.html (在线测试) (源码)
- flexbox_interactive_flex-basis-transitions.html (manual test) (源码)
- flex-basis-computed.html (在线测试) (源码)
- flex-basis-invalid.html (在线测试) (源码)
- flex-basis-valid.html (在线测试) (源码)
- table-as-item-percent-width-cell-001.html (在线测试) (源码)
<'flex-basis'> 接受与 width 和 height 属性相同的值 (但 auto 的处理方式不同) 以及 content 关键字:
- auto
- 当在 弹性项目 上指定时,auto 关键字 会将 主尺寸属性 的值作为实际使用的 flex-basis。 如果该值本身也是 auto,则实际使用的值为 content。
- content
-
表示一个基于 自动尺寸 的值,依据 弹性项目的内容。
(通常等同于 max-content
size,
但会针对 首选宽高比、
固有尺寸约束、
以及正交流作出调整;
具体可参见 详细说明与§ 9 弹性布局算法。)
注意: 此值在 Flexible Box 布局最初发布时并未包含, 因此部分较早的实现可能不支持。 可以通过将 auto 与主尺寸(width 或 height)设为 auto 来实现等效效果。
- <'width'>
- 对于其它值,flex-basis 的解析方式与 width 和 height 一致。
在 flex 简写属性中省略时,其指定值为 0。
- none
- 关键字 none 展开为 0 0 auto。
没有单位的零在未被两个弹性因子前置时,必须被解释为弹性因子。 为避免误解或无效声明, 作者应为 <'flex-basis'> 组件指定带单位的零, 或在其前面加上两个弹性因子。
7.1.1. flex 的基本值
本节仅供参考。
下方列表总结了四个 flex 值的效果, 代表最常用的几种情况:
- flex: initial
- 等价于 flex: 0 1 auto。(这也是初始值。) 项目尺寸由 width/height 属性决定。 (如果项目的 主尺寸属性 计算为 auto, 那么弹性项目的尺寸将由内容决定。) 在有正剩余空间时,使弹性项目不可伸展, 但在空间不足时允许其收缩到最小尺寸。 可以使用 对齐能力或auto 外边距在 主轴 上对齐弹性项目。
- flex: auto
- 等价于 flex: 1 1 auto。 项目尺寸由 width/height 属性决定, 但会变为完全弹性,可以吸收 主轴 上的所有剩余空间。 如果所有项目都是 flex: auto、flex: initial 或 flex: none, 那么在项目尺寸确定后,所有正剩余空间将平均分配给 flex: auto 的项目。
- flex: none
- 等价于 flex: 0 0 auto。 此值会根据 width/height 属性设置项目尺寸, 但会让弹性项目变为 完全无弹性。 这与 initial 类似, 但弹性项目即使溢出也不允许收缩。
- flex: <number [1,∞]>
- 等价于 flex: <number [1,∞]> 1 0。 让弹性项目可伸展,并将 flex basis 设为零, 结果就是项目可获得弹性容器中指定比例的剩余空间。 如果弹性容器中的所有项目都使用此模式, 它们的尺寸会按指定的弹性因子成比例分配。
测试
默认情况下,弹性项目不会缩小到低于其最小内容尺寸 (即最长单词或定尺寸元素的长度)。 如需改变这一行为,可设置 min-width 或 min-height 属性。 (参见 § 4.5 弹性项目的自动最小尺寸。)
7.2. 弹性的组成部分
弹性的各个组成部分可以通过独立的长属性进行控制。
鼓励作者使用 flex 简写属性控制弹性, 而不是直接使用各长属性, 因为简写属性会正确重置未指定的组件, 以适应常见用法。
7.2.1. flex-grow 属性
| 名称: | flex-grow |
|---|---|
| 值: | <number [0,∞]> |
| 初始值: | 0 |
| 适用于: | 弹性项目 |
| 是否继承: | 否 |
| 百分比: | 不适用 |
| 计算值: | 指定数值 |
| 规范顺序: | 按语法 |
| 动画类型: | 按计算值类型 |
测试
- 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_computedstyle_flex-grow-0.html (在线测试) (源码)
- flexbox_computedstyle_flex-grow-invalid.html (在线测试) (源码)
- flexbox_computedstyle_flex-grow-number.html (在线测试) (源码)
- flexbox_interactive_flex-grow-transitions.html (manual test) (源码)
- flex-grow-computed.html (在线测试) (源码)
- flex-grow-invalid.html (在线测试) (源码)
- flex-grow-valid.html (在线测试) (源码)
鼓励作者优先使用 flex 简写属性来控制弹性, 而不是直接使用 flex-grow, 因为简写属性能正确重置未指定的组件, 更好地满足常见用法。
flex-grow 属性将 弹性增长因子 设置为指定的 <number>。 不允许负值。
7.2.2. flex-shrink 属性
| 名称: | flex-shrink |
|---|---|
| 值: | <number [0,∞]> |
| 初始值: | 1 |
| 适用于: | 弹性项目 |
| 是否继承: | 否 |
| 百分比: | 不适用 |
| 计算值: | 指定值 |
| 规范顺序: | 按语法 |
| 动画类型: | 数值 |
测试
- 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 (在线测试) (源码)
- flexbox_computedstyle_flex-shrink-0.html (在线测试) (源码)
- flexbox_computedstyle_flex-shrink-invalid.html (在线测试) (源码)
- flexbox_computedstyle_flex-shrink-number.html (在线测试) (源码)
- flexbox_interactive_flex-shrink-transitions.html (manual test) (源码)
- flexbox_interactive_flex-shrink-transitions-invalid.html (manual test) (源码)
- flex-shrink-computed.html (在线测试) (源码)
- flex-shrink-invalid.html (在线测试) (源码)
- flex-shrink-valid.html (在线测试) (源码)
鼓励作者优先使用 flex 简写属性来控制弹性, 而不是直接使用 flex-shrink, 因为简写属性能正确重置未指定的组件, 更好地满足常见用法。
flex-shrink 属性将 弹性收缩因子 设置为指定的 <number>。 不允许负值。
7.2.3. flex-basis 属性
| 名称: | flex-basis |
|---|---|
| 值: | content | <'width'> |
| 初始值: | auto |
| 适用于: | 弹性项目 |
| 是否继承: | 否 |
| 百分比: | 相对于 弹性容器 的内部 主尺寸 |
| 计算值: | 指定关键字或计算出的 <length-percentage> 值 |
| 规范顺序: | 按语法 |
| 动画类型: | 按计算值类型 |
测试
- flex-basis-composition.html (在线测试) (源码)
- flex-basis-content-crash.html (在线测试) (源码)
- 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 (在线测试) (源码)
- flexbox_computedstyle_flex-basis-0.html (在线测试) (源码)
- flexbox_computedstyle_flex-basis-0percent.html (在线测试) (源码)
- flexbox_computedstyle_flex-basis-auto.html (在线测试) (源码)
- flexbox_computedstyle_flex-basis-percent.html (在线测试) (源码)
- flexbox_interactive_flex-basis-transitions.html (manual test) (源码)
- flex-basis-computed.html (在线测试) (源码)
- flex-basis-invalid.html (在线测试) (源码)
- flex-basis-valid.html (在线测试) (源码)
鼓励作者使用 flex 简写属性来控制弹性, 而不是直接使用 flex-basis, 因为简写属性会正确重置未指定的组件, 更好地适应常见用法。
flex-basis 属性用于设置 弹性基础值。 它接受与 width 和 height 属性相同的值,以及 content 关键字。
对于除了 auto 和 content(如上定义)以外的所有值, flex-basis 的解析方式与在水平书写模式下 width 的解析方式相同 [CSS2], 但如果某个值在 width 下会解析为 auto, 那么在 flex-basis 下则解析为 content。 例如,flex-basis 的百分比值, 是根据弹性项目的包含块(即其 弹性容器)进行解析; 如果该包含块的尺寸是 不确定的, 那么 flex-basis 的实际值为 content。 另一个推论是,flex-basis 决定了内容盒子的尺寸, 除非有其它属性(如 box-sizing [CSS3UI])做了特殊规定。
8. 对齐
当弹性容器的内容完成弹性伸缩,所有弹性项目的尺寸确定后, 就可以在弹性容器内对齐这些项目。
margin 属性可用于对齐项目,其方式与块布局中的外边距类似,但更强大。弹性项目也支持 CSS Box Alignment 的对齐属性, 能够轻松地通过关键字对项目进行主轴 main axis 和交叉轴 cross axis 的对齐。 这些属性让许多常见的对齐类型变得简单, 包括一些在 CSS 2.1 中很难实现的效果, 如水平居中和垂直居中。
注意: 虽然对齐属性定义在 CSS Box Alignment [CSS-ALIGN-3], 弹性盒布局在此复述了相关属性的定义, 以避免产生规范性依赖,这样有助于规范推进。 这些属性目前仅适用于弹性布局, 直到 CSS Box Alignment Level 3 完成并定义其在其他布局模式下的效果。 此外,Box Alignment 模块中定义的新值也会适用于弹性盒布局; 换言之,一旦 Box Alignment 模块完成, 这里的定义将由其取代。
8.1. 使用 auto 外边距进行对齐
本节为非规范性内容。 关于外边距如何影响弹性项目的规范性定义,请参见 弹性布局算法 一节。
弹性项目上的 auto 外边距的效果与块流中的 auto 外边距非常相似:
-
在计算弹性基础值和弹性长度时,auto 外边距被视为 0。
-
在通过 justify-content 和 align-self 进行对齐之前, 该维度上的所有正剩余空间都会分配给 auto 外边距。
-
溢出的盒子会忽略其 auto 外边距,并在 end 方向溢出。
测试
- 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 (在线测试) (源码)
注意: 如果剩余空间被分配给 auto 外边距, 对齐属性在该方向上将不起作用, 因为外边距会“偷走”弹性分配后留下的所有剩余空间。
nav > ul{ display : flex; } nav > ul > #login{ margin-left : auto; }
< nav > < ul > < li >< a href = /about > 关于</ a > < li >< a href = /projects > 项目</ a > < li >< a href = /interact > 互动</ a > < li id = "login" >< a href = /login > 登录</ a > </ ul > </ nav >
8.2. 轴对齐:justify-content 属性
| 名称: | justify-content |
|---|---|
| 值: | flex-start | flex-end | center | space-between | space-around |
| 初始值: | flex-start |
| 适用于: | 弹性容器 |
| 是否继承: | 否 |
| 百分比: | 不适用 |
| 计算值: | 指定关键字 |
| 规范顺序: | 按语法 |
| 动画类型: | 离散 |
测试
- 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 (在线测试) (源码)
- flexbox_computedstyle_justify-content-center.html (在线测试) (源码)
- flexbox_computedstyle_justify-content-flex-end.html (在线测试) (源码)
- flexbox_computedstyle_justify-content-flex-start.html (在线测试) (源码)
- flexbox_computedstyle_justify-content-space-around.html (在线测试) (源码)
- 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 (visual test) (源码)
- justify-content_flex-end.html (visual test) (源码)
- justify-content_flex-start.html (visual test) (源码)
- justify-content-sideways-001.html (在线测试) (源码)
- justify-content_space-around.html (visual test) (源码)
- justify-content_space-between-001.html (visual test) (源码)
- justify-content_space-between-002.html (在线测试) (源码)
- scrollbars-auto.html (在线测试) (源码)
- scrollbars.html (在线测试) (源码)
- scrollbars-no-margin.html (在线测试) (源码)
justify-content 属性用于将 弹性项目 沿弹性容器当前行的 主轴对齐。 此操作会在所有弹性长度和 auto 外边距 都已处理后进行。 一般用于分配当某一行上的所有 弹性项目都不可伸展, 或可伸展但已达到最大尺寸时剩余的自由空间。 还可以在项目溢出到行外时,控制其对齐方式。
- flex-start
- 弹性项目会向该行起始方向排列。 行上第一个 弹性项目 的 main-start 外边距紧贴行的 main-start 边缘, 后续每个 弹性项目都紧贴前一个项目。
- flex-end
- 弹性项目会向该行末尾排列。 行上最后一个 弹性项目 的 main-end 外边距紧贴行的 main-end 边缘, 前面的每个 弹性项目都紧贴后一个项目。
- center
- 弹性项目会向该行中心排列。 行上的 弹性项目彼此紧贴,并在行中央对齐, 行 main-start 边缘与第一个项目之间, 以及行 main-end 边缘与最后一个项目之间的间距相等。 (如果剩余空间为负,弹性项目会在两个方向上等量溢出。)
- space-between
- 弹性项目会在行内均匀分布。 若剩余空间为负或该行只有一个 弹性项目, 则此值会退回为 safe flex-start。 否则, 行上第一个 弹性项目 的 main-start 外边距紧贴行的 main-start 边缘, 行上最后一个 弹性项目 的 main-end 外边距紧贴行的 main-end 边缘, 行内其他 弹性项目均匀分布,相邻项目间距相同。
- space-around
-
弹性项目会在行内均匀分布,并且两端的空隙为单个间距的一半。
若剩余空间为负或该行只有一个 弹性项目,
则此值会退回为 safe center。
否则,行上的 弹性项目会分布,
相邻 弹性项目之间间距相同,
第一个、最后一个 弹性项目与弹性容器边缘的间距是项目间距的一半。
测试
- 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 (在线测试) (源码)
五个 justify-content 关键字及其对一个三色弹性容器的影响示意图。
8.3. 交叉轴对齐:align-items 和 align-self 属性
| 名称: | align-items |
|---|---|
| 值: | flex-start | flex-end | center | baseline | stretch |
| 初始值: | stretch |
| 适用于: | 弹性容器 |
| 是否继承: | 否 |
| 百分比: | 不适用 |
| 计算值: | 指定关键字 |
| 规范顺序: | 按语法 |
| 动画类型: | 离散 |
测试
- align-items-007.html (在线测试) (源码)
- align-items-008.html (在线测试) (源码)
- align-items-009.html (在线测试) (源码)
- align-items-baseline-column-horz.html (在线测试) (源码)
- align-items-baseline-column-vert.html (在线测试) (源码)
- align-items-baseline-column-vert-lr-flexbox-item.html (在线测试) (源码)
- align-items-baseline-column-vert-lr-grid-item.html (在线测试) (源码)
- align-items-baseline-column-vert-lr-items.html (在线测试) (源码)
- align-items-baseline-column-vert-lr-table-item.html (在线测试) (源码)
- align-items-baseline-column-vert-rl-flexbox-item.html (在线测试) (源码)
- align-items-baseline-column-vert-rl-grid-item.html (在线测试) (源码)
- align-items-baseline-column-vert-rl-items.html (在线测试) (源码)
- align-items-baseline-column-vert-rl-table-item.html (在线测试) (源码)
- align-items-baseline-overflow-non-visible.html (在线测试) (源码)
- align-items-baseline-row-horz.html (在线测试) (源码)
- align-items-baseline-row-vert.html (在线测试) (源码)
- align-items-baseline-vert-lr-column-horz-flexbox-item.html (在线测试) (源码)
- align-items-baseline-vert-lr-column-horz-grid-item.html (在线测试) (源码)
- align-items-baseline-vert-lr-column-horz-items.html (在线测试) (源码)
- align-items-baseline-vert-lr-column-horz-table-item.html (在线测试) (源码)
- align-items-baseline-vert-rl-column-horz-flexbox-item.html (在线测试) (源码)
- align-items-baseline-vert-rl-column-horz-grid-item.html (在线测试) (源码)
- align-items-baseline-vert-rl-column-horz-items.html (在线测试) (源码)
- align-items-baseline-vert-rl-column-horz-table-item.html (在线测试) (源码)
- multiline-align-self.html (在线测试) (源码)
- column-flex-child-with-max-width.html (在线测试) (源码)
- dynamic-stretch-change.html (在线测试) (源码)
- flexbox_align-items-baseline.html (在线测试) (源码)
- flexbox_align-items-center-2.html (在线测试) (源码)
- flexbox_align-items-center-3.html (在线测试) (源码)
- flexbox_align-items-center.html (在线测试) (源码)
- flexbox-align-items-center-nested-001.html (在线测试) (源码)
- flexbox_align-items-flexend-2.html (在线测试) (源码)
- flexbox_align-items-flexend.html (在线测试) (源码)
- flexbox_align-items-flexstart-2.html (在线测试) (源码)
- flexbox_align-items-flexstart.html (在线测试) (源码)
- flexbox_align-items-stretch-2.html (在线测试) (源码)
- flexbox_align-items-stretch-3.html (在线测试) (源码)
- flexbox_align-items-stretch-4.html (在线测试) (源码)
- flexbox_align-items-stretch.html (在线测试) (源码)
- flexbox_computedstyle_align-items-baseline.html (在线测试) (源码)
- flexbox_computedstyle_align-items-center.html (在线测试) (源码)
- flexbox_computedstyle_align-items-flex-end.html (在线测试) (源码)
- flexbox_computedstyle_align-items-flex-start.html (在线测试) (源码)
- flexbox_computedstyle_align-items-invalid.html (在线测试) (源码)
- flexbox_computedstyle_align-items-stretch.html (在线测试) (源码)
- position-relative-percentage-top-001.html (在线测试) (源码)
- position-relative-percentage-top-002.html (在线测试) (源码)
- position-relative-percentage-top-003.html (在线测试) (源码)
- relayout-align-items.html (在线测试) (源码)
- stretch-input-in-column.html (在线测试) (源码)
- stretch-requires-computed-auto-size.html (在线测试) (源码)
- table-as-item-stretch-cross-size-2.html (在线测试) (源码)
- table-as-item-stretch-cross-size-3.html (在线测试) (源码)
- table-as-item-stretch-cross-size-4.html (在线测试) (源码)
- table-as-item-stretch-cross-size-5.html (在线测试) (源码)
- table-as-item-stretch-cross-size.html (在线测试) (源码)
| 名称: | align-self |
|---|---|
| 值: | auto | flex-start | flex-end | center | baseline | stretch |
| 初始值: | auto |
| 适用于: | 弹性项目 |
| 是否继承: | 否 |
| 百分比: | 不适用 |
| 计算值: | 指定关键字 |
| 规范顺序: | 按语法 |
| 动画类型: | 离散 |
测试
- align-self-006.html (visual test) (源码)
- align-self-010.html (visual test) (源码)
- 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 (在线测试) (源码)
- flexbox_computedstyle_align-self-baseline.html (在线测试) (源码)
- flexbox_computedstyle_align-self-center.html (在线测试) (源码)
- flexbox_computedstyle_align-self-flex-end.html (在线测试) (源码)
- flexbox_computedstyle_align-self-flex-start.html (在线测试) (源码)
- flexbox_computedstyle_align-self-invalid.html (在线测试) (源码)
- flexbox_computedstyle_align-self-stretch.html (在线测试) (源码)
弹性项目可以在弹性容器当前行的 交叉轴上对齐, 类似于 justify-content,但方向垂直。align-items 设置弹性容器所有 项目(包括匿名 弹性项目)的默认对齐方式。align-self 可以为单个 弹性项目覆盖这种默认对齐方式。 (对于匿名弹性项目,align-self 总是与其所属弹性容器上的 align-items 值一致。)
如果 弹性项目的任一交叉轴外边距为 auto,则 align-self 失效。
各值含义如下:
- auto
- 交叉轴对齐由父盒子的 align-items 控制。 (这是 align-self 的初始值。)
- flex-start
- 弹性项目的 cross-start 外边距紧贴行的 cross-start 边缘。
- flex-end
- 弹性项目的 cross-end 外边距紧贴行的 cross-end 边缘。
- center
- 弹性项目的外边距盒在该行的 交叉轴居中。 (如果弹性行的 交叉尺寸小于 弹性项目的尺寸, 项目会在两个方向上等量溢出。)
- baseline
- 弹性项目 参与基线对齐: 行上所有参与基线对齐的 弹性项目其基线会对齐, 与基线距离 cross-start 外边距最远的项目紧贴行的 cross-start 边缘。 如果项目在该轴上没有基线, 则会从 弹性项目的边框盒合成一个基线。
- stretch
-
如果 弹性项目 的 交叉尺寸属性 计算为 auto,
且交叉轴外边距都不是 auto,
则 弹性项目会被拉伸。
其最终值是让项目外边距盒的 交叉尺寸尽量与该行等高所需的长度,
同时还会考虑 min-height/min-width/max-height/max-width 的限制。
注意: 如果弹性容器的高度受限, 此值可能会导致 弹性项目内容溢出项目盒。
弹性项目的 cross-start 外边距紧贴行的 cross-start 边缘。
测试
- align-items-005.htm (在线测试) (源码)
- align-self-004.html (在线测试) (源码)
- align-self-005.html (在线测试) (源码)
- css-flexbox-height-animation-stretch.html (手动 测试) (源码)
五个 align-items 关键字及其对一个四色弹性容器的影响示意图。
8.4. 弹性行的收纳:align-content 属性
| 名称: | align-content |
|---|---|
| 值: | flex-start | flex-end | center | space-between | space-around | stretch |
| 初始值: | stretch |
| 适用于: | 多行 弹性容器 |
| 是否继承: | 否 |
| 百分比: | 不适用 |
| 计算值: | 指定关键字 |
| 规范顺序: | 按语法 |
| 动画类型: | 离散 |
align-content 属性用于在弹性容器内对齐弹性行, 当交叉轴有剩余空间时, 类似于 justify-content 对齐主轴上的项目。 注意:此属性对 单行 弹性容器无效。 各值含义如下:
- flex-start
- 行向弹性容器起始方向排列。 弹性容器内第一行的 cross-start 边缘紧贴弹性容器的 cross-start 边缘, 后续每行紧贴前一行。
- flex-end
- 行向弹性容器末尾排列。 最后一行的 cross-end 边缘紧贴弹性容器的 cross-end 边缘, 前面的每行紧贴后一行。
- center
- 行在弹性容器中央排列。 所有行彼此紧贴,并在弹性容器中心对齐, 弹性容器 cross-start 内容边缘与第一行之间, 以及容器 cross-end 内容边缘与最后一行之间的空隙相等。 (若剩余空间为负,所有行会在两个方向等量溢出。)
- space-between
- 行在弹性容器内均匀分布。 若剩余空间为负或弹性容器内只有一条 弹性行, 则此值退回为 safe flex-start。 否则, 弹性容器内第一行的 cross-start 边缘紧贴容器的 cross-start 内容边缘, 最后一行的 cross-end 边缘紧贴容器的 cross-end 内容边缘, 其他行均匀分布,相邻行间距一致。
- space-around
- 行在弹性容器内均匀分布,且两端空隙为单个间距的一半。 若剩余空间为负, 则此值退回为 safe center。 否则,所有行分布时,相邻行间距一致, 第一行和最后一行与容器边缘的空隙是行间距的一半。
- stretch
- 行会拉伸以占据剩余空间。 若剩余空间为负, 此值退回为 flex-start。 否则, 所有行平均分配剩余空间,增加其交叉尺寸。
注意: 只有 多行 弹性容器的交叉轴才有剩余空间可用于对齐弹性行, 因为 单行弹性容器唯一的行会自动拉伸填满空间。
align-content 关键字及其对一个 多行弹性容器的影响示意图。
测试
- align-content_center.html (在线测试) (源码)
- align-content_flex-end.html (在线测试) (源码)
- align-content_flex-start.html (在线测试) (源码)
- align-content-horiz-001a.html (在线测试) (源码)
- align-content-horiz-001b.html (在线测试) (源码)
- align-content-horiz-002.html (在线测试) (源码)
- align-content_space-around.html (在线测试) (源码)
- align-content_space-between.html (在线测试) (源码)
- align-content_stretch.html (在线测试) (源码)
- align-content-vert-001a.html (在线测试) (源码)
- align-content-vert-001b.html (在线测试) (源码)
- align-content-vert-002.html (在线测试) (源码)
- align-content-wmvert-001.html (在线测试) (源码)
- align-content-wrap-001.html (在线测试) (源码)
- align-content-wrap-002.html (在线测试) (源码)
- align-content-wrap-003.html (在线测试) (源码)
- align-content-wrap-004.html (在线测试) (源码)
- align-content-wrap-005.html (在线测试) (源码)
- flex-align-content-center.html (在线测试) (源码)
- flex-align-content-end.html (在线测试) (源码)
- flex-align-content-space-around.html (在线测试) (源码)
- flex-align-content-space-between.html (在线测试) (源码)
- flex-align-content-start.html (在线测试) (源码)
- flexbox_align-content-center.html (在线测试) (源码)
- flexbox_align-content-flexend.html (在线测试) (源码)
- flexbox_align-content-flexstart.html (在线测试) (源码)
- flexbox_align-content-spacearound.html (在线测试) (源码)
- flexbox_align-content-spacebetween.html (在线测试) (源码)
- flexbox_align-content-stretch-2.html (在线测试) (源码)
- flexbox_align-content-stretch.html (在线测试) (源码)
- flexbox_computedstyle_align-content-center.html (在线测试) (源码)
- flexbox_computedstyle_align-content-flex-end.html (在线测试) (源码)
- flexbox_computedstyle_align-content-flex-start.html (在线测试) (源码)
- flexbox_computedstyle_align-content-space-around.html (在线测试) (源码)
- flexbox_computedstyle_align-content-space-between.html (在线测试) (源码)
8.5. 弹性容器基线
为了让 弹性容器自身能够参与基线对齐(例如当弹性容器本身作为外部弹性容器中的弹性项目时), 它需要提交最能代表其内容的基线位置。 为此, 弹性容器的基线按照如下方式确定 (在用order重排,并考虑flex-direction后):
- first/last 主轴基线集
- 当 内联轴与弹性容器的主轴方向一致时, 基线按照如下方式确定:
- first/last 交叉轴基线集
- 当 内联轴与弹性容器的交叉轴方向一致时, 基线按照如下方式确定:
根据上述规则计算基线时, 如果贡献基线的盒子的overflow值允许滚动, 在确定基线时必须把盒子视为处于初始滚动位置。
当确定表格单元格的基线时, 弹性容器会像行盒或 table-row 一样提供基线。[CSS2]
更多关于基线的信息请参见 CSS Writing Modes 3 § 4.1 基线介绍 和 CSS Box Alignment 3 § 9 基线对齐细节。
测试
- flex-align-baseline-001.html (在线测试) (源码)
- flex-align-baseline-002.html (在线测试) (源码)
- flex-align-baseline-003.html (在线测试) (源码)
- flex-align-baseline-004.html (在线测试) (源码)
- flex-align-baseline-005.html (在线测试) (源码)
- flex-align-baseline-006.html (在线测试) (源码)
- flex-align-baseline-007.html (在线测试) (源码)
- flex-align-baseline-column-rtl-direction.html (在线测试) (源码)
- flex-align-baseline-column-vert-lr-rtl-wrap-reverse.html (在线测试) (源码)
- flex-align-baseline-column-vert-rl-rtl-wrap-reverse.html (在线测试) (源码)
- flex-align-baseline-fieldset-001.html (在线测试) (源码)
- flex-align-baseline-fieldset-002.html (在线测试) (源码)
- flex-align-baseline-fieldset-003.html (在线测试) (源码)
- flex-align-baseline-flex-001.html (在线测试) (源码)
- flex-align-baseline-flex-002.html (在线测试) (源码)
- flex-align-baseline-flex-003.html (在线测试) (源码)
- flex-align-baseline-flex-004.html (在线测试) (源码)
- flex-align-baseline-grid-001.html (在线测试) (源码)
- flex-align-baseline-grid-002.html (在线测试) (源码)
- flex-align-baseline-grid-003.html (在线测试) (源码)
- flex-align-baseline-multicol-001.html (在线测试) (源码)
- flex-align-baseline-multicol-002.html (在线测试) (源码)
- flex-align-baseline-multicol-003.html (在线测试) (源码)
- flex-align-baseline-overflow-001.html (在线测试) (源码)
- flex-align-baseline-overflow-002.html (在线测试) (源码)
- flex-align-baseline-overflow-003.html (在线测试) (源码)
- flex-align-baseline-table-001.html (在线测试) (源码)
- flex-align-baseline-table-002.html (在线测试) (源码)
- 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 (在线测试) (源码)
9. 弹性布局算法
本节包含规范性算法, 详细说明弹性容器及其内容的具体布局行为。 这里的算法以优化可读性和理论简洁性为目标, 实际实现不一定采用这些最优算法, 但必须保证实际效果与本节描述一致。
注意: 本节主要面向实现者。 编写网页的作者通常只需参考各属性的描述, 除非你非常渴望深入理解 CSS 布局的细节,否则无需阅读本节。
下列各节定义了弹性容器及其内容的布局算法。
注意: 弹性布局根据弹性项目的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 (在线测试) (源码)
9.1. 初始设置
- 生成匿名弹性项目,详见 § 4 弹性项目。
9.2. 行长度确定
- 确定弹性项目的主轴和交叉轴可用空间。 对每个维度, 如果该维度的 弹性容器内容框是确定尺寸,则直接使用该尺寸; 如果该维度的 弹性容器正受最小内容约束或最大内容约束,则该维度的可用空间就是对应约束; 否则,从弹性容器所在维度的可用空间中减去 弹性容器的外边距、边框和内边距, 使用得到的值。 这可能导致值为无穷大。
-
确定每个项目的弹性基础尺寸和假定主尺寸:
测试
- image-as-flexitem-size-001.html (在线测试) (源码)
- image-as-flexitem-size-001v.html (在线测试) (源码)
- image-as-flexitem-size-002.html (在线测试) (源码)
- image-as-flexitem-size-002v.html (在线测试) (源码)
- image-as-flexitem-size-003.html (在线测试) (源码)
- image-as-flexitem-size-003v.html (在线测试) (源码)
- image-as-flexitem-size-004.html (在线测试) (源码)
- image-as-flexitem-size-004v.html (在线测试) (源码)
- image-as-flexitem-size-005.html (在线测试) (源码)
- image-as-flexitem-size-005v.html (在线测试) (源码)
- image-as-flexitem-size-006.html (在线测试) (源码)
- image-as-flexitem-size-006v.html (在线测试) (源码)
- image-as-flexitem-size-007.html (在线测试) (源码)
- image-as-flexitem-size-007v.html (在线测试) (源码)
- item-with-table-with-infinite-max-intrinsic-width.html (在线测试) (源码)
- multiline-min-max.html (在线测试) (源码)
- orthogonal-writing-modes-and-intrinsic-sizing.html (在线测试) (源码)
- svg-root-as-flex-item-001.html (在线测试) (源码)
- svg-root-as-flex-item-002.html (在线测试) (源码)
- svg-root-as-flex-item-003.html (在线测试) (源码)
- svg-root-as-flex-item-004.html (在线测试) (源码)
- svg-root-as-flex-item-005.html (在线测试) (源码)
- svg-root-as-flex-item-006.html (在线测试) (源码)
- table-as-item-min-height-1.html (在线测试) (源码)
- table-as-item-wide-content.html (在线测试) (源码)
- table-with-infinite-max-intrinsic-width.html (在线测试) (源码)
- 如果该项目有一个确定的已用flex basis, 那么这个弹性基础尺寸就是该值。
-
如果弹性项目有……
- 一个首选宽高比,
- 一个已用flex basis为content,并且
- 一个确定的交叉尺寸,
- 如果已用flex basis为content或依赖于其可用空间, 且弹性容器正在最小内容或最大内容约束下进行尺寸计算 (例如进行自动表格布局 [CSS2]), 则按该约束对项目进行尺寸计算。 弹性基础尺寸即为该项目结果的主尺寸。
-
否则,
如果已用flex
basis为content或依赖于其可用空间,
主尺寸可用空间为无穷大,
并且弹性项目的内联轴与主轴平行,
使用正交流盒子的规则
[CSS3-WRITING-MODES]进行布局。
弹性基础尺寸即为该项目的
max-content 主尺寸。
注意: 例如,在一个英文文档(水平书写模式)中, 包含一个列式弹性容器, 容器中有一个日文竖排(竖直书写模式)弹性项目时会出现该情况。
-
否则,
使用已用flex
basis代替主尺寸,在可用空间内对项目进行尺寸计算,
并将content视为max-content。
如果确定主尺寸需要交叉尺寸
(例如弹性项目的主尺寸在其块轴上,
或有首选宽高比时),
且弹性项目的交叉尺寸为auto且不是确定值,
在此计算中用fit-content作为弹性项目的交叉尺寸。
弹性基础尺寸为项目最终的主尺寸。
测试
- 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 (在线测试) (源码)
在确定弹性基础尺寸时, 会忽略项目的最小和最大主尺寸 (不会进行约束)。 此外,应用box-sizing时将内容盒尺寸下限为零的计算也会被忽略。 (例如,一个指定尺寸为零、正内边距,并设置为box-sizing: border-box的项目, 其外部弹性基础尺寸为零——因此其内部弹性基础尺寸为负值。)
- 确定弹性容器的 主尺寸,使用其所处格式化上下文的规则。
9.3. 主尺寸确定
-
将弹性项目收集到弹性行中:
- 如果弹性容器是单行, 则把所有弹性项目收集到一个弹性行中。
-
否则,
从第一个未收集的项目开始,
依次收集连续的项目,
直到第一次下一个要收集的项目
无法放入弹性容器的内部主尺寸
(或遇到强制换行,参见§ 10 弹性布局分页)。
如果第一个未收集的项目就放不下,
则只将它收集到该行。
在此步骤中, 弹性项目的尺寸为其外部 假定主尺寸。(注意:该值可能为负。)
重复此过程,直到所有弹性项目都被收集到弹性行中。
注意,“尽量收集”这一行会把零尺寸弹性项目收集到上一行的末尾, 即使最后一个非零项目刚好“填满”了该行。
- 解析所有弹性项目的弹性长度,以确定其已用主尺寸。参见§ 9.7 解析弹性长度。
测试
- flexbox_quirks_body.html (在线测试) (源码)
- ortho-table-item-001.html (在线测试) (源码)
- percentage-heights-000.html (在线测试) (源码)
- percentage-heights-001.html (在线测试) (源码)
- percentage-heights-002.html (在线测试) (源码)
- percentage-heights-003.html (在线测试) (源码)
- percentage-heights-004.html (在线测试) (源码)
- percentage-heights-005.html (在线测试) (源码)
- percentage-heights-006.html (在线测试) (源码)
- percentage-heights-007.html (在线测试) (源码)
- percentage-heights-008.html (在线测试) (源码)
- percentage-heights-009.html (在线测试) (源码)
- percentage-heights-010.html (在线测试) (源码)
- percentage-heights-011.html (在线测试) (源码)
- percentage-heights-012.html (在线测试) (源码)
- percentage-heights-013.html (在线测试) (源码)
- percentage-heights-014.html (在线测试) (源码)
- percentage-heights-015.html (在线测试) (源码)
- percentage-heights-016.html (在线测试) (源码)
- percentage-heights-017.html (在线测试) (源码)
- percentage-heights-018.html (在线测试) (源码)
- percentage-heights-019.html (在线测试) (源码)
9.4. 交叉尺寸确定
- 为每个项目确定假定交叉尺寸,方法是按照其为一个流内 块级盒,使用已用主尺寸和给定的可用空间进行布局, 将auto视为fit-content。
-
计算每个弹性行的交叉尺寸。
如果弹性容器是单行且有确定的交叉尺寸, 那么交叉尺寸就是弹性行的弹性容器内部交叉尺寸。
否则, 对每个弹性行:
- 收集所有内联轴与主轴平行的弹性项目, 其 align-self 为 baseline, 且交叉轴外边距均非 auto。 找出每个项目基线与其假定外部交叉起点边之间的最大距离, 以及基线与假定外部交叉终点边之间的最大距离, 将这两个值相加。
- 在所有未被上一步收集的项目中, 找出最大的外部 假定交叉尺寸。
-
弹性行
的已用交叉尺寸为前两步所得数值与零中的最大值。
如果弹性容器为 单行, 则将该行的交叉尺寸限制在容器计算得到的最小和最大 交叉尺寸范围内。 注意:如果 CSS 2.1 对 min/max-width/height 的定义更广泛适用, 该行为即可自动得出。
测试
- flexbox-single-line-clamp-1.html (在线测试) (源码)
- flexbox-single-line-clamp-2.html (在线测试) (源码)
- flexbox-single-line-clamp-3.html (在线测试) (源码)
- flex-item-contains-size-layout-001.html (在线测试) (源码)
- flex-item-contains-strict.html (在线测试) (源码)
- layout-algorithm_algo-cross-line-001.html (在线测试) (源码)
- layout-algorithm_algo-cross-line-002.html (在线测试) (源码)
- 处理 'align-content: stretch'。 如果弹性容器有确定的交叉尺寸,align-content为stretch, 并且所有弹性行的交叉尺寸之和小于弹性容器的内部交叉尺寸, 就将每个弹性行的交叉尺寸按相同的量增加, 使它们的总和正好等于弹性容器的内部交叉尺寸。
-
折叠 visibility:collapse 项目。 如果有弹性项目设置了visibility: collapse,
记住它所在行的交叉尺寸作为该项目的 strut size,
然后从头重新布局。
在第二轮布局时, 收集项目到行时, 把折叠的项目视为主尺寸为零。 在后续算法中, 完全忽略这些折叠项目 (就像它们 display:none 一样), 但在计算行交叉尺寸之后, 如果某行的交叉尺寸小于该行所有折叠项目的最大 strut size, 就将该行交叉尺寸设置为这个 strut size。
第二轮布局时跳过此步骤。
-
确定每个弹性项目的已用交叉尺寸。 如果某个弹性项目的 align-self: stretch,
其计算的交叉尺寸属性为 auto,
且其交叉轴外边距都不是 auto,
则已用外部交叉尺寸为其弹性行的已用交叉尺寸,
并根据该项目的已用最小和最大 交叉尺寸进行限制。
否则,
已用交叉尺寸为该项目的 假定交叉尺寸。
如果弹性项目设置了align-self: stretch, 则要重新为其内容布局, 并把此已用尺寸视为确定的交叉尺寸, 以便能解析百分比尺寸的子元素。
9.5. 主轴对齐
-
分配任何剩余的自由空间。
对每个弹性行:
- 如果剩余自由空间为正, 且该行至少有一个主轴外边距为auto, 则将自由空间在这些外边距之间平均分配。 否则,将所有auto外边距设为零。
- 按justify-content沿主轴对齐项目。
9.6. 交叉轴对齐
-
解析交叉轴auto外边距。 如果弹性项目有auto交叉轴外边距:
- 如果其外部交叉尺寸(将这些auto外边距视为零)小于其弹性行的交叉尺寸, 将尺寸差在这些auto外边距间平均分配。
- 否则, 如果block-start或inline-start外边距(以交叉轴为准)为auto,则设为零。 设置相对的外边距,使项目外部交叉尺寸等于弹性行的交叉尺寸。
- 按align-self沿交叉轴对齐所有弹性项目, 前提是项目的交叉轴外边距都不是auto。
- 按其参与的格式化上下文规则,确定弹性容器的已用交叉尺寸。 如果需要基于内容的交叉尺寸, 则用所有弹性行的交叉尺寸之和。
- 按align-content对齐所有弹性行。
9.7. 弹性长度的解析
要解析弹性行中项目的弹性长度:
- 确定已用弹性因子。 求该行所有项目的外部假定主尺寸之和。 如果该值小于弹性容器的内部主尺寸, 则后续算法用弹性增长因子; 否则用弹性收缩因子。
-
每个弹性行中的项目有一个目标主尺寸,初始设为其弹性基础尺寸。
每个项目最初都是未冻结状态,之后可能变成冻结状态。
注意: 项目的目标主尺寸冻结后不再变化。
- 处理不可伸缩项目。 冻结, 并将其目标主尺寸设为其假定主尺寸……
- 计算初始自由空间。 求该行所有项目的外部尺寸之和, 并用弹性容器的内部主尺寸减去它。 对于冻结项目,用其外部目标主尺寸; 对于其他项目,用其外部弹性基础尺寸。
-
循环:
- 检查是否有弹性项目。 如果该行所有弹性项目都已冻结,退出该循环。
- 计算剩余自由空间,方法同上面的初始自由空间。 如果未冻结弹性项目的弹性因子之和小于 1, 就用初始自由空间乘以这个和。 如果这个值的绝对值小于剩余自由空间的绝对值, 则用此值作为剩余自由空间。
- 如果剩余自由空间非零,按弹性因子比例分配:
- 修正最小/最大约束。 用项目的已用最小和最大主尺寸约束每个未冻结项目的目标主尺寸,并将内容盒尺寸下限为零。 如果项目的目标主尺寸因此变小, 则为最大约束违规; 如果变大,则为最小约束违规。
-
冻结超出约束的项目。 总违规量为上一步所有调整的总和
∑(约束后尺寸 - 约束前尺寸)。 如果总违规量:- 为零
- 冻结所有项目。
- 为正
- 冻结所有最小约束违规的项目。
- 为负
- 冻结所有最大约束违规的项目。
注意: 此步骤至少冻结一个项目,保证循环能继续并最终终止。
- 返回到该循环的开头。
- 将每个项目的已用主尺寸设为其目标主尺寸。
测试
- item-with-max-height-and-scrollbar.html (在线测试) (源码)
- item-with-max-height-and-scrollbar.html (在线测试) (源码)
- max-width-violation.html (在线测试) (源码)
- relayout-image-load.html (在线测试) (源码)
- table-as-item-inflexible-in-column-1.html (在线测试) (源码)
- table-as-item-inflexible-in-column-2.html (在线测试) (源码)
- table-as-item-inflexible-in-row-1.html (在线测试) (源码)
- table-as-item-inflexible-in-row-2.html (在线测试) (源码)
9.8. 明确尺寸与不明确尺寸
尽管 CSS Sizing [CSS-SIZING-3] 定义了 明确 和 不明确 的长度, Flexbox 还包含若干额外的情况下,长度也可视为明确:
-
如果某个 弹性项目 的 flex basis 是 明确的, 那么它弹性伸缩后的 主尺寸 也视为 明确。
-
如果 单行 弹性容器具有明确的 交叉尺寸, 那么任何被拉伸的 弹性项目 的 自动 首选 外部交叉尺寸等于弹性容器的内部交叉尺寸(限制在该 弹性项目 的最小和最大 交叉尺寸 范围内), 并且视为 明确 尺寸。
-
一旦弹性行的交叉尺寸已确定, 自动尺寸弹性容器中的项目的交叉尺寸在布局时也视为明确尺寸; 参见 步骤 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 (在线测试) (源码)
注意: 这意味着在弹性布局中, “明确”尺寸有时需要先进行布局计算。 这样设计是为了让弹性项目内部的百分比能够按作者预期被正确解析。
9.9. 内在尺寸
内在尺寸用于为弹性容器生成多种基于内容的自动尺寸, 如自适应逻辑宽度(使用 fit-content 公式) 和基于内容的逻辑高度(使用 max-content size)。 在这些计算中,弹性项目上的 auto 外边距会被视为 0。
相关术语定义参见 [CSS-SIZING-3]。
测试
- 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 (在线测试) (源码)
- auto-min-size-001.html (在线测试) (源码)
- col-wrap-001.html (在线测试) (源码)
- col-wrap-002.html (在线测试) (源码)
- col-wrap-003.html (在线测试) (源码)
- col-wrap-004.html (在线测试) (源码)
- col-wrap-005.html (在线测试) (源码)
- col-wrap-006.html (在线测试) (源码)
- col-wrap-007.html (在线测试) (源码)
- col-wrap-008.html (在线测试) (源码)
- col-wrap-009.html (在线测试) (源码)
- col-wrap-010.html (在线测试) (源码)
- col-wrap-011.html (在线测试) (源码)
- col-wrap-012.html (在线测试) (源码)
- col-wrap-013.html (在线测试) (源码)
- col-wrap-014.html (在线测试) (源码)
- col-wrap-015.html (在线测试) (源码)
- col-wrap-016.html (在线测试) (源码)
- col-wrap-017.html (在线测试) (源码)
- col-wrap-018.html (在线测试) (源码)
- col-wrap-019.html (在线测试) (源码)
- col-wrap-020.html (在线测试) (源码)
- col-wrap-crash.html (在线测试) (源码)
- row-001.html (在线测试) (源码)
- row-002.html (在线测试) (源码)
- row-003.html (在线测试) (源码)
- row-004.html (在线测试) (源码)
- row-005.html (在线测试) (源码)
- row-006.html (在线测试) (源码)
- row-007.html (在线测试) (源码)
- row-008.html (在线测试) (源码)
- row-compat-001.html (在线测试) (源码)
- row-use-cases-001.html (在线测试) (源码)
- row-wrap-001.html (在线测试) (源码)
- multiline-shrink-to-fit.html (在线测试) (源码)
- svg-no-natural-size-grandchild.html (在线测试) (源码)
9.9.1. 弹性容器的内在主尺寸
max-content 主尺寸的弹性容器,理论上是指弹性容器能取的最小尺寸, 当用该容器尺寸进行弹性布局时, 每个弹性项目最终至少达到其 max-content 贡献尺寸, 在项目弹性允许的范围内。
min-content 主尺寸的弹性容器,理论上是指弹性容器能取的最小尺寸, 使得没有项目溢出容器, 且没有项目内容溢出项目本身——不考虑那些布局本身定义为溢出的情况 (如负外边距或百分比尺寸总和超过 100%)。
9.9.1.1. 理想算法
注意: 下述算法用于计算弹性容器的理想内在主尺寸。 然而,由于最初实现不正确, 且已有内容依赖于(不幸地一致的)错误实现行为,该算法并不兼容 Web。 实现者和 CSS 工作组正在研究浏览器实现是否可以安全地趋近于该行为, 并欢迎进一步实验。
- 对每个 弹性项目, 用其 外部 flex base size 去减其 max-content 贡献尺寸。 如果结果为正, 若 flex grow factor ≥ 1,则除以该项目的 flex grow factor; 若 flex grow factor < 1,则乘以 flex grow factor; 如果结果为负, 则除以该项目的 scaled flex shrink factor(若除以零,结果视为负无穷)。 这就是该项目的 期望 flex 分数。
- 将所有 弹性项目 放入无限长度的行中。 在每一行内, 找出所有 弹性项目中最大的(最正的)期望 flex 分数。 这就是该行的 选定 flex 分数。
-
如果 选定 flex 分数 为正,
且该行的 flex grow
factor 之和小于 1,
则用该和去除 选定 flex 分数。
如果 选定 flex 分数 为负, 且该行的 flex shrink factor 之和小于 1, 则用该和去乘 选定 flex 分数。
- 将每个项目的 flex base size 与其 flex grow factor(若收缩则为 scaled flex shrink factor)乘以 选定 flex 分数 的积相加, 然后用 最大主尺寸(下限为 最小主尺寸)进行夹取。
- 弹性容器的 max-content 尺寸 为所有行中, 某一行内所有项目按上述计算所得尺寸的最大总和。
min-content 主尺寸对于单行 弹性容器, 计算方式与max-content 主尺寸相同, 只是使用min-content 贡献而不是max-content 贡献。
当 flex 之和小于 1 时该算法的影响
上述算法特别为两种情况设计,以保证 弹性容器的尺寸在这两种情况之间连续变化:
-
如果所有项目都不可伸缩, 弹性容器的尺寸就是所有 弹性基础尺寸之和。 (不可伸缩的弹性基础尺寸实际上可替代width/height, 而在块布局中指定时,max-content 贡献也是基于此。)
-
如果所有项目的弹性因子≥1, 那么弹性容器的尺寸是其项目的 max-content 贡献之和 (或稍大一些, 使每个弹性项目至少等于其 max-content 贡献, 但同时仍能按弹性分配比例保持各项目尺寸间的正确比例)。
例如,如果一个 弹性容器 只有一个 弹性项目,其 flex-basis: 100px;,但 max-content 尺寸为 200px, 那么当该项目设为 flex-grow: 0 时,弹性容器(以及 弹性项目)宽度为 100px, 但如果该项目设为 flex-grow: 1 或更高, 弹性容器(和弹性项目)宽度为 200px。
有几种可能的方法可以让这两种情况之间的整体行为连续, 但它们都有缺陷。 我们选择了一种认为副作用最小的方式; 不幸的是,在 flex factor 小于 1 的情况下,会出现“灵活性被双重应用”。 就上例而言,如果项目设为 flex-grow: .5, 那么 弹性容器最终宽度为 150px, 但项目在该可用空间下正常排布,最终宽度为 125px。
关于所选特定行为的更深入说明
原则:
-
无论增长还是收缩,输入趋近于零时都不能让尺寸爆炸。
-
当所有 flex factor >=1 时,返回每个项目大于等于 max-content 尺寸所需的最小尺寸。
-
flex 为零的项目不应影响整体尺寸。
-
保持对 flex factor 和项目尺寸变化的连续性。
-
对任意输入变量(尺寸、flex factor)线性变化时,尽量保持尺寸变化的线性。
-
当 flex factor 之和 >=1 时,返回让每个项目大于等于 max-content 尺寸所需的最小总尺寸。
为了让这些原则都能成立, 当单个 flex factor 或一行上的 flex factor 总和小于 1 时, 就需要做修正。
收缩时行为更简单些; 因为 shrink=0 时爆炸成负无穷, 但我们最终总是选取最大值,所以不会选到负无穷, 只需要在行级做修正即可, 只有当总和小于 1 时才会出现双重修正。
增长时更复杂。 grow=0 会爆炸成正无穷, 而我们会选中正无穷, 所以需要对每个项目单独修正:当 factor 小于 1 时用 factor 乘空间。 但这样处理会导致 factor 小于 1 且总和 ≥ 1 时双重修正, 而总和小于 1 时会三重修正。 为避免这种极端情况, 总和为 1 时要反向修正,即再除以总和。 这样一来,factor 小于 1 的项目在所有情况下都会有双重修正。
我们无法完全消除双重修正, 除非放弃其它更重要的原则 (尤其是原则 3——比如让两个 flex-grow: .5 的项目不双重应用, 但又不能让 flex-grow: 0 的项目 干扰到 flex-grow: 1 的兄弟项目; 据我们所知,这是无法做到的。)
9.9.1.2. Web 兼容的内在尺寸算法
注意: 下述算法已被证明兼容 Web。 未来可能会调整,使其更接近理想算法。
Web 兼容算法将在此补充,一旦有成果。[Issue #8884]
9.9.1.3. 多行 min-content 算法
对于多行容器, min-content 主尺寸就是该弹性容器中所有未折叠的弹性项目的最大min-content 贡献。 对于此目的, 每个项目的贡献 若项目不可增长则不超过其弹性基础尺寸, 若不可收缩则不小于其弹性基础尺寸, 然后再按项目的最小和最大主尺寸约束。
9.9.2. 弹性容器的内在交叉尺寸
min-content/max-content 交叉尺寸对于 单行 弹性容器, 就是其弹性项目的最大min-content 贡献/max-content 贡献(分别对应)。
- row 多行 弹性容器 交叉尺寸
-
min-content/max-content 交叉尺寸是各弹性行交叉尺寸之和, 即弹性容器在交叉轴上受min-content 约束或max-content 约束(分别对应)时计算得到的各弹性行交叉尺寸之和。
- column 多行 弹性容器 交叉尺寸
-
min-content 交叉尺寸为所有弹性项目的最大min-content 贡献。
注意: 这种启发式做法实际上假定只有一条弹性行, 以保证 min-content size 小于 max-content size。 如果弹性容器有高度约束, 则可能会导致溢出, 但如果弹性容器也是滚动容器, 那么至少保证任何一列都能完整显示在其滚动端口内。
max-content 交叉尺寸为各弹性行交叉尺寸之和, 这些弹性行是在弹性容器交叉轴上受交叉轴 max-content 约束下, 以所有max-content 交叉尺寸贡献的最大值作为每个弹性项目的交叉轴可用空间进行布局得到的。
注意: 这种启发式能合理近似弹性容器应有的尺寸, 即每个弹性项目以其max-content 贡献或更大尺寸布局, 每个弹性行不会超过其最大项目尺寸。 某些情况下不算完美, 但完全正确的做法成本极高, 这种方案已经很实用。
测试
9.9.3. 弹性项目的内在尺寸贡献
min-content 贡献的主尺寸对于弹性项目而言,是其 外部min-content 尺寸与外部首选尺寸(如果不是 auto)中的较大值, 并按其最小/最大主尺寸进行约束。
max-content 贡献的主尺寸对于弹性项目而言,是其 外部max-content 尺寸与外部首选尺寸(如果不是 auto)中的较大值, 并按其最小/最大主尺寸进行约束。
10. 弹性布局的分页处理
弹性容器可以在项目之间、 项目所在的行之间(在多行模式下), 以及项目内部进行分页断开。 break-* 属性对于弹性容器的应用方式与块级或内联盒一样。 本节定义这些属性如何应用于弹性项目 以及弹性项目的内容。 更多内容请参见 CSS 分页模块[CSS3-BREAK]。
下述分页规则中,将 分页容器称为“页面”。 同样的规则适用于任何其他分页上下文。 (在需要时将“页面”替换为合适的 分页容器类型。) 为便于理解,本节中的“行”和“列”术语是指弹性容器相对于 分页上下文块流方向的排列, 而不是指 弹性容器自身的方向。
分页的弹性容器的具体布局 在本级别的弹性盒布局规范中未定义。 但弹性容器内部的断开需遵循如下规则 (以 order-修改后的文档顺序为准):
-
在行式弹性容器中,
弹性项目上的break-before与break-after的值
会传播到弹性行。
第一行上的 break-before 与最后一行上的 break-after
会传播到弹性容器。
注意: 断开传播 (如 text-decoration 的传播) 不影响 计算值。
- 在列式弹性容器中, 第一个项目上的break-before与最后一个项目上的break-after值 会传播到弹性容器。 其他项目上的强制分页断开作用于项目本身。
- 弹性项目内的强制断开会导致其内容尺寸增加; 不会导致兄弟项目内产生强制断开。
- 行式弹性容器中,A 类断开机会出现在兄弟弹性行之间, C 类断开机会出现在第一/最后弹性行与弹性容器内容边缘之间。 列式弹性容器中,A 类断开机会出现在兄弟弹性项目之间, C 类断开机会出现在一行的第一个/最后一个弹性项目与弹性容器内容边缘之间。[CSS3-BREAK]
- 当弹性容器在分页后继续时, 在分页上下文的块流方向上, 弹性项目的可用空间会被之前页面弹性容器片段所占空间减少。 弹性容器片段所占空间即为其在该页上的内容框尺寸。 如果因此调整后可用空间变为负数, 则设为零。
- 如果弹性容器的第一个片段不在页面顶部, 且无弹性项目能适应页面剩余空间, 整个片段会移到下一页。
- 多行列式弹性容器分页时, UA 可将每个片段组织为自己的弹性行“堆栈”——就像多列容器的每个片段有自己的列盒一样——以确保较早页面上的内容对应于盒顺序中较前内容。
- 除了前述重排项目的情况外, UA 应尽量减少弹性容器与未分页流的变形。
测试
- flexbox_interactive_break-after-column-item.html (manual test) (源码)
- flexbox_interactive_break-after-column-lastitem.html (manual test) (源码)
- flexbox_interactive_break-after-container.html (manual test) (源码)
- flexbox_interactive_break-after-item.html (manual test) (源码)
- flexbox_interactive_break-after-line.html (manual test) (源码)
- flexbox_interactive_break-after-line-order.html (manual test) (源码)
- flexbox_interactive_break-after-multiline.html (manual test) (源码)
- flexbox_interactive_break-before-column-firstitem.html (manual test) (源码)
- flexbox_interactive_break-before-column-item.html (manual test) (源码)
- flexbox_interactive_break-before-container.html (manual test) (源码)
- flexbox_interactive_break-before-item.html (manual test) (源码)
- flexbox_interactive_break-before-multiline.html (manual test) (源码)
- flexbox_interactive_break-natural.html (manual test) (源码)
10.1. 弹性布局分页算法示例
本说明性章节展示了弹性容器的一种可能的分页算法。 鼓励实现者在此算法基础上改进并向 CSS 工作组反馈意见。
此算法假定分页总是仅向前进行; 因此,下面的算法在分页前基本忽略了对齐。 高级布局引擎可能能够在各分页片段间保持对齐。
- 单行列式弹性容器
-
- 运行弹性布局算法(不考虑分页),直至交叉尺寸确定。
- 从第一个项目开始,尽量多地连续布局弹性项目或其片段(但至少要布局一个或其片段),直到页面没有剩余空间或遇到强制分页断开。
- 如果上一步空间不足且剩余空间为正, UA 可以减少本页分配的自由空间(最多减到零),以便为下一个不可断开的弹性项目或片段腾出空间。 否则,不适合的项目或片段会被推到下一页。 UA 应在超过 50% 片段能放入剩余空间时拉上,否则推下。
- 若还有未布局的弹性项目或片段,重新运行弹性布局算法,从行长度确定到交叉尺寸确定,用下页的尺寸,且包含所有内容(包括已布局的),然后返回上一步,从第一个未布局的项目或片段开始。
- 对弹性容器的每个片段,从主轴对齐继续执行弹性布局算法直到结束。
此算法意在让列方向的单行弹性容器的分页行为与块流非常类似。 测试时,设弹性容器为 justify-content:start 且无弹性项目时, 其分页效果应与内容、尺寸、外边距均相同的块级盒一致。
- 多行列式弹性容器
-
- 运行弹性布局算法(考虑分页,将弹性容器最大行长度限制为页面剩余空间),直至交叉尺寸确定。
- 尽量多地布局弹性行(但至少一行),直到弹性容器交叉轴没有空间或遇到强制断开:
- 若有未布局的弹性项目,重新运行弹性布局算法,从行尺寸确定到交叉尺寸确定,用下页尺寸,仅包含未布局的项目,并返回上一步,从第一个未布局的项目开始。
- 对弹性容器的每个片段,从主轴对齐继续执行弹性布局算法直到结束。
此示例算法的不足之处在于, 若弹性项目无法完整放入单页,则不会在多行列式弹性容器中进行分页。
- 单行行式弹性容器
-
- 运行完整弹性布局算法(不考虑分页),但将任何align-self 非 flex-start 或 baseline 视为 flex-start。
- 若不可断开的项目无法放入页面剩余空间,且弹性容器未在页面顶部,则将弹性容器移至下一页并重新布局。
-
对每个项目,尽量布局其内容至页面剩余空间,剩余内容在下一页分页,重新运行弹性布局算法,从行长度确定到主轴对齐,用新页面尺寸和所有内容(含前页已完成项目)。
完全放入前片段的弹性项目在后续片段主轴上依然占据空间。
- 对弹性容器的每个片段,重新运行弹性布局算法,从交叉轴对齐到结束。 除第一个片段外,所有项目片段和行的align-self和align-content都视为flex-start。
- 若有项目按原align-self值对齐后能完整放入某个弹性容器片段,则可移入该片段并适当对齐。
- 多行行式弹性容器
-
- 运行弹性布局算法(不考虑分页),直到交叉尺寸确定。
-
从第一个行开始,尽量多地布局弹性行(但至少一行),直到页面没有空间或遇到强制断开。
如果某行无法放入页面,且该行未在页面顶部,则将该行移至下一页并重新运行弹性布局算法,只用该行及后续项目。
如果弹性项目本身导致强制断开,则重新运行弹性布局算法,从主尺寸确定到主轴对齐,只用该行及后续行的项目,并让导致断开的项目在行分步时自动开启新行,然后继续本步骤。 弹性项目内的强制断开忽略。
- 若有未布局的弹性项目,重新运行弹性布局算法,从行长度确定到主轴对齐,用下页尺寸和未布局项目。返回上一步,从第一个未布局的行开始。
- 对弹性容器的每个片段,从交叉轴对齐继续执行弹性布局算法直到结束。
附录 A:轴映射
本附录为非规范性内容。
| flex-flow | 主轴 | 起点 | 终点 | 交叉轴 | 起点 | 终点 |
|---|---|---|---|---|---|---|
| row + nowrap/wrap | 水平 | 左 | 右 | 垂直 | 上 | 下 |
| row-reverse + nowrap/wrap | 右 | 左 | ||||
| row + wrap-reverse | 左 | 右 | 下 | 上 | ||
| row-reverse + wrap-reverse | 右 | 左 | ||||
| column + nowrap/wrap | 垂直 | 上 | 下 | 水平 | 左 | 右 |
| column-reverse + nowrap/wrap | 下 | 上 | ||||
| column + wrap-reverse | 上 | 下 | 右 | 左 | ||
| column-reverse + wrap-reverse | 下 | 上 |
| flex-flow | 主轴 | 主轴起点 | 主轴终点 | 交叉轴 | 交叉轴起点 | 交叉轴终点 |
|---|---|---|---|---|---|---|
| row + nowrap/wrap | 水平 | 右 | 左 | 垂直 | 上 | 下 |
| row-reverse + nowrap/wrap | 左 | 右 | ||||
| row + wrap-reverse | 右 | 左 | 下 | 上 | ||
| row-reverse + wrap-reverse | 左 | 右 | ||||
| column + nowrap/wrap | 垂直 | 上 | 下 | 水平 | 右 | 左 |
| column-reverse + nowrap/wrap | 下 | 上 | ||||
| column + wrap-reverse | 上 | 下 | 左 | 右 | ||
| column-reverse + wrap-reverse | 下 | 上 |
| flex-flow | 主轴 | 起点 | 终点 | 交叉轴 | 起点 | 终点 |
|---|---|---|---|---|---|---|
| row + nowrap/wrap | 垂直 | 上 | 下 | 水平 | 右 | 左 |
| row-reverse + nowrap/wrap | 下 | 上 | ||||
| row + wrap-reverse | 上 | 下 | 左 | 右 | ||
| row-reverse + wrap-reverse | 下 | 上 | ||||
| column + nowrap/wrap | 垂直 | 右 | 左 | 水平 | 上 | 下 |
| column-reverse + nowrap/wrap | 左 | 右 | ||||
| column + wrap-reverse | 右 | 左 | 下 | 上 | ||
| column-reverse + wrap-reverse | 左 | 右 |
附录 B:-webkit-
旧版属性
本附录为规范性内容。
这些别名已废弃,作者不应使用,除非内容需兼容仍在使用的旧版 UA。
为兼容主流 Web 内容, 必须(Web 浏览器)或可以(其他 UA) 实现如下 旧名别名:
| 别名 | 标准 |
|---|---|
| -webkit-align-content | align-content |
| -webkit-align-items | align-items |
| -webkit-align-self | align-self |
| -webkit-flex | flex |
| -webkit-flex-basis | flex-basis |
| -webkit-flex-direction | flex-direction |
| -webkit-flex-flow | flex-flow |
| -webkit-flex-grow | flex-grow |
| -webkit-flex-shrink | flex-shrink |
| -webkit-flex-wrap | flex-wrap |
| -webkit-justify-content | justify-content |
| -webkit-order | order |
测试
致谢
感谢以下人员的反馈和贡献:
Erik Anderson, Christian Biesinger, Tony Chang, Phil Cupp, Arron Eicholz, James Elmore, Andrew Fedoniouk, Brian Heuston, Shinichiro Hamaji, Daniel Holbert, Ben Horst, John Jansen, Brad Kemper, Kang-hao Lu, Markus Mielke, Peter Moulder, Robert O’Callahan, Christoph Päper, Ning Rogers, Peter Salas, Elliott Sprehn, Morten Stenshorne, Christian Stockwell, Ojan Vafai, Eugene Veselov, Greg Whitworth, Boris Zbarsky。
变更记录
本节记录了自之前版本发布以来的变更内容。
自 2018年11月19日 CR 以来的变更
可查看 评论处理情况。重要变更包括:
- 指明 § 9.9.1 弹性容器内在主尺寸部分为理想算法但不兼容 Web, 并将 Web 兼容算法标记为正在研究中。 (Issue 8884)
- 修正 § 9.9.1 弹性容器内在主尺寸中的弹性规则错误,使其更接近实际布局算法, 并避免输入趋于零时出现除零或尺寸爆炸。 (Issue 7189)
- 改进列式 wrap 弹性容器的交叉轴内在尺寸规则,以获得更好效果。 (Issue 6777)
- 用 内容边缘 计算 弹性容器子元素的 静态位置矩形,而不做额外布局。 这将导致忽略弹性容器上的 align-content, 但允许盒本身上的 align-self 仍然生效。 (Issue 5843, 7596)
- 正确忽略 auto 首选尺寸,无论是 min 还是 max 尺寸贡献计算。 (之前 max 计算中遗漏了, 虽然在 changelog 中是对的...) (Issue 6455)
- 将 order 属性定义移至 [CSS-DISPLAY-3]。 详情见 § 5.4 重排与无障碍:order 属性。 (Issue 5865)
-
规定对于 明确 flex basis 的 弹性项目,其 主尺寸始终为 明确,以符合实现。
(Issue 4311)
注意:对于 完全不可伸缩项目, 其 明确的 flex basis,其主尺寸本质上是 明确的。注意:这意味着在 弹性布局中, “明确”尺寸有时需要进行布局计算。 这样做是为了让 弹性项目内的百分比能按作者预期正确解析。
- 使每页上的弹性项目可独立组成弹性行堆栈成为可选,并指出示例算法的不足。 (6855)
- 属性定义表中的值语法更新为最新的CSS 括号范围记法,反映对负值的限制说明。(编辑性修订)
- 将宽高比术语更新为 preferred aspect ratio, 并澄清与替换元素相关的使用, 以适应即将发布的 aspect-ratio 属性。
- 通过将其效果应用于 transferred size suggestion 并将其从 specified size suggestion 的明确性中排除, 定义 aspect-ratio 与 自动最小尺寸的交互。 (Issues 6069、6794、changeset A、changeset B)
- 将 自动最小尺寸的条件限定为 计算值为 overflow, 而不是必须为 滚动容器, 以避免如替换元素等情况,其 可滚动 overflow 值 解析为 不可滚动 已用值。 (7714)
- 明确规定豁免 基于内容的最小尺寸不会导致项目尺寸变为不明确, 仅限于 auto,不影响其他内在尺寸关键字。 (Issue 6457)
-
明确将 折叠弹性项目 排除在 内在主尺寸计算之外。
(Issue 5985)
max-content 主尺寸的弹性容器是 弹性容器可以取的最小尺寸, 同时保证其 max-content 贡献, 仅考虑项目自身的弹性。 仅考虑未折叠的 弹性项目:
对于 多行 容器, 就是所有 未折叠 弹性项目的最大 min-content 贡献。
-
明确规定 弹性基础尺寸的计算依赖于 已用 交叉尺寸。
(Issue 3736)
… 然后弹性基础尺寸由 已用 内部交叉尺寸 以及弹性项目的内在宽高比计算得出。
- 略微重组了 § 9.7 解析弹性长度中的说明性文字以修正错误。 (Issue 5179)
-
明确“进行布局”即使用块级布局规则。
(Issue 5188)
-
重写弹性容器交叉尺寸步骤,使其依赖于所处格式化上下文的规则,
而不是假定块级布局规则。
(Issue 5190)
确定弹性容器的已用交叉尺寸 用其参与的 格式化上下文规则。 如果需要基于内容的 交叉尺寸, 用所有 弹性行的 交叉尺寸之和。
-
移除关于用于宽高比计算的盒类型的明确说明,
以兼容 aspect-ratio 属性在 [css-sizing-4]中的新行为。
(Issue 5246)
然后弹性基础尺寸由 已用
内部交叉尺寸 以及弹性项目的内在宽高比计算得出。 -
明确规定弹性项目的 基于内容的最小尺寸
属于 内在尺寸贡献,
因此受 [CSS-SIZING-3]中相关规则影响。
(Issue 5665)
注意:基于内容的最小尺寸属于 内在尺寸贡献, 因此 CSS Sizing 3 § 5.2 内在贡献中的相关规定适用。
- 使 space-* 关键字的回退对齐(在剩余空间为负时)应用 safe。 (Issue 10154)
- 重写 基于内容的最小尺寸定义,使其更易读。(编辑性修订)
- 增加 附录 B:-webkit- 旧版属性,记录兼容 Web 所需的
-webkit-弹性布局属性别名。 (Issue 5634) - 按 计算值描述 blockification 规则。 (Issue 4065)
- 若干细微编辑性修正和澄清,
自 2017 年 10 月 16 日 CR 以来的变更
也可查看 评论处理情况。
- 移除了弹性项目块轴外边距和内边距可按块轴尺寸解析的选项; 它们必须按内联轴尺寸解析,和块级盒一样。 (Issue 2085)
-
将 弹性项目 的 min-content 贡献下限设为其 首选尺寸 (Issue 2353)
并精确了相关描述。
主尺寸 min-content 贡献是 弹性项目 的 外部 min-content 尺寸 以及外部 首选尺寸(其 width/height,视情况而定) 如果不是 auto 中较大值, 最大值按 flex base size 作为最大值(若不可增长) 或最小值(若不可收缩)约束, 然后再按 min/max 主尺寸属性约束。
主尺寸 max-content 贡献是 弹性项目 的 外部 max-content 尺寸与 外部
指定首选 尺寸 (其 width/height,视情况而定,) 如果不是确定不是 auto 中较大值, 最大值按 flex base size 作为最大值(若不可增长) 或最小值(若不可收缩)约束, 然后再按 min/max 主尺寸属性约束。 -
增加了部分(实际上是说明性)描述和交叉引用,
更清楚地定义了 flex-basis: content。
表示
自动尺寸基于 自动尺寸 ,取决于 弹性项目 的内容。 (通常等价于 max-content 尺寸, 但会调整以处理宽高比、内在尺寸约束和正交流; 见 细节,详见 § 9 弹性布局算法。) - 将 auto 关键字的 min-width 和 min-height 定义移至 [CSS-SIZING-3]。 弹性项目 自动最小尺寸定义仍在此处。 (Issue 1920, Issue 2103)
- 修改了 auto 在 min-width 和 min-height 的计算方式,使其始终计算为自身,尽管在 CSS2 显示类型下其 最终值仍为零。 (Issue 2230, Issue 2248)
- 明确规定 min/max 尺寸约束按 已用值进行——表格 auto 布局时,下限为表格的 min-content 尺寸。 (Issue 2442)
-
明确断开传播不影响计算值,且采用 order-修改后的文档顺序。
(Issue 2614)
分页弹性容器的具体布局在本级别规范中未定义。 但弹性容器内部的断开需遵循如下规则 (以 order-修改后的文档顺序为准) :
-
行式弹性容器中,
弹性项目上的 break-before 和 break-after 的值会传播到弹性行。
第一行的 break-before 和最后一行的
break-after 会传播到弹性容器。
注意: 断开传播 (如 text-decoration 的传播) 不影响 计算值。
-
行式弹性容器中,
弹性项目上的 break-before 和 break-after 的值会传播到弹性行。
第一行的 break-before 和最后一行的
break-after 会传播到弹性容器。
-
明确如果 自动最小尺寸直接解析为零而不是 基于内容的最小尺寸,则不会导致尺寸不明确。
计算元素内在尺寸(如元素的 min-content size)时,
该值基于内容的最小尺寸 会导致元素在该轴上的尺寸变为不明确 (即使其 width 属性指定了 明确尺寸)。 - 编辑性改进 自动最小尺寸相关内容。 (Issue 2385)
- 若干细微编辑性修正和澄清,包括词汇更新以与其他 CSS 模块保持一致。
自 2016 年 5 月 26 日 CR 以来的变更
也可查看 评论处理情况。
重大变更和缺陷修复
-
为了让弹性因子实际代表弹性项目尺寸的绝对比例(如原始设计),
移除了内容盒尺寸在为项目计算 flex base
size 时下限为零的规则,
因为这种比例需要 flex base size 为零,否则只有外边距、边框和内边距全为零时才可能。
(该下限规则仍适用于计算项目假定和最终尺寸时,与 min/max 尺寸约束一起生效。)
(Issue 316)
确定 flex base size 时, 项目的 min/max 主尺寸属性会被忽略(不进行约束)。 此外,应用 box-sizing 时将内容盒尺寸下限为零的计算也会被忽略。 (例如,一个指定尺寸为零、正内边距,且 box-sizing: border-box 的项目,外部 flex base size 为零,因此内部 flex base size 为负。)
假定主尺寸是项目的 flex base size 按其 min/max 主尺寸属性约束 (并将内容盒尺寸下限为零) 。
修正 min/max 违规。 用项目的 min/max 主尺寸属性约束每个未冻结项目的 target main size 并将内容盒尺寸下限为零 。 如果项目的 target main size因此变小, 则为最大约束违规。 如果因约束变大,则为最小约束违规。
-
为了防止 shrink-to-fit 容器中的空弹性项目即使有指定尺寸也收缩为零,
现在在计算其 max-content 贡献时会计入指定尺寸,
详见 § 9.9.3 弹性项目内在尺寸贡献。
(Issue 1435)
max-content 贡献的主尺寸对于 弹性项目 是 其外部 max-content 尺寸和指定尺寸(其 width/height,如适用,若为 明确) 中较大值, 最大值按 flex base size 作为最大值(若不可增长) 或最小值(若不可收缩)约束, 然后再按 min/max 主尺寸属性约束。
-
由于至少有两个实现允许弹性项目在 flex basis 不明确时百分比仍可解析,
移除了要求 flex basis 必须明确的条件。
(Issue 1679)
如果
弹性项目有 明确 flex basis 且弹性容器有 明确 主尺寸,其弹性项目的 弹性伸缩后主尺寸视为 明确(尽管技术上可能依赖于同一行其他弹性项目的明确尺寸兄弟来解析其弹性主尺寸不明确尺寸)。 -
为实现方便,auto 的 align-self 值现在始终计算为自身。
详见相关变更,要求绝对定位元素也如此计算。
(Issue 440, Issue 644)
…计算值: auto 计算为父元素的 align-items 值;否则按指定值绝对定位元素上, auto 计算为自身。 其他元素上,auto 的 align-self 计算为父元素的 align-items 值, 无父元素时为 stretch。 - 对正交流弹性项目及无基线弹性项目均用其边框盒合成对齐基线。 (Issue 373)
-
修正 交叉轴基线集定义的主/交叉轴错误。
(Issue 792)
否则,弹性容器没有第一/最后
主交叉 轴基线集… -
恢复关于表格作为弹性项目的误删描述。
详见 匿名盒变更。
(Issue 547)
对于 display: table 的弹性项目, 表格包装盒成为 弹性项目, order 和 align-self 属性应用于它。 所有 caption 盒内容都参与表格包装盒 min-content 和 max-content 尺寸计算。 但类似 width 和 height,flex 长属性应用于表格盒如下: 弹性项目最终尺寸通过布局确定, 就像表格包装盒边缘到表格盒内容边缘的距离都视为表格盒的 border+padding 区域, 且表格盒即为 弹性项目。
-
明确绝对定位弹性容器子元素静态位置计算时 auto 外边距视为零。
(Issue 665)
对于此目的, align-self: auto 视同 start ,auto 外边距视为零 。
-
计算弹性容器内在尺寸时,按 max 主尺寸属性约束时,要用 min
主尺寸属性取下限。
(Issue 361)
每行内,找出所有 弹性项目的最大 max-content flex fraction。 将每个项目的 flex base size 加上其 flex grow factor(或 scaled flex shrink factor,若选择的分数为负) 乘以选定 max-content flex fraction,然后按 项目尺寸约束
bymax 和 min 主尺寸属性yies 约束。 -
补充了 change 相关的遗漏编辑,使 order 不再应用于弹性容器的绝对定位子元素。
(Issue 1439)
适用于: flex items 及弹性容器的绝对定位子元素order 属性控制
弹性容器的子元素弹性项目 在弹性容器内的显示顺序, 通过分配序号分组。 …弹性容器的绝对定位子元素在确定其与 flex items 的绘制顺序时,视为 order: 0。
除非后续规范另有规定, 此属性对非
弹性容器的子元素flex items 无效。 -
在确定弹性容器第一/最后基线时要考虑 flex-direction。
(Issue 995)
因此,弹性容器的基线如下确定 (用 order 重排 ,并考虑 flex-direction ):
…
-
如果弹性容器的
flex items
在
第一/最后最起始/最末尾 flex line上 参与基线对齐, 则弹性容器的第一/最后 主轴基线集 … -
否则,如果弹性容器至少有一个 flex
item,
弹性容器的第一/最后 主轴基线集由
生成
第一/最后最起始/最末尾 flex item 的 alignment baseline。 … - 否则,弹性容器没有第一/最后主轴 基线集, …
…
-
如果弹性容器至少有一个 flex
item,
弹性容器的第一/最后 交叉轴基线集由
生成
alignment baseline
第一/最后最起始/最末尾 flex item。 …
-
如果弹性容器的
flex items
在
-
定义 align-content: space-between 处理单个 flex line 等同于 start。
(Issue 718)
弹性行在弹性容器内均匀分布。 如果剩余空间为负 或弹性容器仅有一个 flex line, 此值等同于 flex-start。
- 修正了 轴映射表中的错误。 (Issue 205)
- 恢复了对既无 指定尺寸也无宽高比的盒子的 自动最小尺寸定义,之前在 重写中遗失。 (Issue 671)
澄清
- 确保为 主尺寸 和 交叉尺寸 做出定义,既适用于 弹性容器,也适用于 弹性项目。 (Issue 981)
-
调整了关于空间导航说明中的最后一句澄清性文字。
(Issue 1677)
用户代理(包括浏览器、可访问性技术和扩展)可以提供空间导航功能。 本节并不排除在此类空间导航模式下确定元素顺序时尊重 order 属性;事实上,为使该功能正常工作,需要将其纳入考虑。
但是,一个 UA 如果在确定顺序导航时使用 order,却不考虑元素之间的空间关系(这些关系由包括但不限于弹性布局在内的各种 CSS 布局特性表达),则不符合规范。但 order 不是(甚至不是主要的)在此类空间导航功能中需要考虑的唯一 CSS 属性。 一个实现良好的空间导航功能需要考虑所有会改变空间关系的 CSS 布局特性。 - 若干无关紧要的编辑性改进。
自 2016 年 3 月 1 日 CR 以来的变更
也可查看 评论处理情况。
重大变更和缺陷修复
-
定义在计算内在的 自动最小尺寸 时如何处理百分比。
(Issue 3)
为了计算元素的内在尺寸(例如元素的 min-content size), 此值会使元素在该轴上的尺寸变为不明确 (即便例如其 width 属性指定了一个 明确尺寸)。 注意,这意味着针对该尺寸计算的百分比将被视为 auto。
尽管如此, 虽然在某些情况下这可能需要额外一次布局过程以重新解析百分比, 该值(就像 min-content、max-content 和 fit-content 这些在 [CSS-SIZING-3] 中定义的值) 并不会阻止在项目内部解析百分比尺寸。
- 将 明确 和 不明确 改为引用 [CSS-SIZING-3] 中更准确的定义,而不再在本模块内联定义。 (Issue 10)
- 弹性盒的绝对定位子元素不再响应 order 属性。 (Issue 12)
- 更新了 § 8.5 弹性容器基线,以涵盖 基线集 和 最后基线对齐。 (Issue 13))
澄清
-
在 § 9.8
明确尺寸与不明确尺寸 中交叉引用了一个额外的明确性情形(Issue 2)
一旦弹性行的交叉尺寸确定, 自动尺寸弹性容器中的项目在布局时也视为明确;见 步骤 11。
-
改进了关于无法解析的百分比 flex basis
值如何转化为 content 的表述。
(Issue 6)
除了 auto 和 content (见上)之外的所有取值,flex-basis 的解析方式与横排书写模式中的 width 相同 [CSS2], 但如果某个值对于 width 会解析为 auto, 则对于 flex-basis 应解析为 content 。 例如,flex-basis 的百分比值是相对于 弹性项目的包含块(即其 弹性容器)解析的; 如果该包含块的尺寸是 不明确,
其结果等同于 主尺寸为 auto(在此情况下视为 content)则 flex-basis 的已用值为 content 。 -
澄清具有 明确 flex basis 的不可伸缩项目具有 明确尺寸。
(Issue 8, Issue 11)
当一个 弹性项目 的 flex-grow 和 flex-shrink 值都为 0 时,其为 完全不可伸缩;否则为 可伸缩。
具有 明确 flex basis 的 完全不可伸缩项目,其主尺寸按定义为 明确。
-
重新表述 auto 值的定义,使之更易理解。
(Issue 9)
对于 弹性项目,当其在 overflow 在 主轴上为 visible 时, 如果在 该弹性项目的主轴最小尺寸属性上指定,
下表给出了最小尺寸 …则指定一个 自动最小尺寸。一般而言,自动最小尺寸 … 的定义如下:
- 略微重写了关于确定绝对定位子元素静态位置的章节,使其更清晰。
- 调整了“可动画”行的格式,以更清晰地说明关键字的动画行为。
- 若干无关紧要的编辑性改进。
自 2015 年 5 月 14 日 LCWD 以来的变更
也可查看 评论处理情况。
重大变更和缺陷修复
-
还原 flex 速记属性在 变更 中对省略的 flex-basis 的处理,改回 0,
因为那是用来解决内在尺寸问题的权宜之计;在正确实现 § 9.9 内在尺寸 的前提下不仅不需要,而且会产生不良结果。
(Issue 13)
当从 flex 速记属性中省略时,其指定值为 0
%。 -
将 弹性项目的判定 改为直接作用于每个元素,而不是其可能存在的匿名包装盒。
(Issue 6)
某些 display 的取值会在原盒周围触发匿名盒的创建。 变成 弹性项目 的是最外层的盒——即 弹性容器 的直接子元素盒。 例如,给定两个相邻的子元素都为 display: table-cell, 那么围绕它们生成的 匿名表格包装盒 [CSS2] 将成为 弹性项目。
对于 display: table 的弹性项目, 表格包装盒成为 弹性项目, 且 order 和 align-self 属性应用于它。 任何 caption 盒的内容都参与表格包装盒的 min-content 和 max-content 尺寸计算。 但是,类似 width 和 height,flex 各长属性对表格盒的应用如下: 弹性项目 的最终尺寸通过如下布局计算: 假设表格包装盒的边缘与表格盒内容边缘之间的距离都属于表格盒的 border+padding 区域, 且表格盒就是 弹性项目。
注意:某些 display 的取值通常会在原盒周围触发匿名盒的创建。 若这样的盒是 弹性项目, 则会先被块化(blockify),因此不会发生匿名盒创建。 例如,两个相邻的 弹性项目 若为 display: table-cell, 将变成两个独立的 display: block 弹性项目, 而不是被包裹在一个匿名表格中。
-
规定在对其内容进行百分比尺寸计算时,必须参考盒子的
min-width: auto 所施加的任何尺寸调整。
(Issue 3)
为防止尺寸循环,auto 的 min-height 和 max-height 不会参与该盒子内容的百分比解析。 例如,一个百分比高度的块,其弹性项目父级有 height: 120em; min-height: auto 时, 它将始终基于 height: 120em 来确定自身尺寸,而不考虑 min-height 对弹性项目已用尺寸的影响。虽然在某些情况下这可能需要额外一次布局过程以重新解析百分比, 但 auto 的 min-width 和 min-height(就像 min-content、max-content 和 fit-content 这些在 [CSS-SIZING-3] 中定义的值) 并不会阻止在项目内部解析百分比尺寸。
-
修正内在尺寸规则以处理不可伸缩项目。
(Issue 1)
min-content/max-content 贡献的主尺寸对于 弹性项目,其外部
假定主尺寸(分别在 min-content/max-content 约束下计算)min-content/max-content 贡献的主尺寸对于 弹性项目 是其 外部 min-content/max-content 尺寸, 并按其 flex base size 作为最大值(若不可增长)和/或最小值(若不可收缩)进行约束, 然后再按其 min/max 主尺寸属性 进一步约束 。 -
修正 弹性容器 主轴内在尺寸中的错误。
(Issue 1)
max-content 主尺寸对于 弹性容器 是指 弹性容器 能够取得的最小尺寸,同时保持其 max-content 贡献(由其 弹性项目 提供):
-
对每个 弹性项目,
用其
外部
flex base
size 去减其 max-content 贡献 尺寸
, 然后除以其 flex grow factor(下限为 1), 或(若结果为负)除以其 scaled flex shrink factor(如有必要,将 flex shrink factor 下限设为 1)。 如果结果不为 0:若结果为正,则除以其 flex grow factor(下限为 1);若结果为负,则除以其 scaled flex shrink factor,并将 flex shrink factor 的下限设为 1。 这就是该项目的 max-content flex fraction。
-
对每个 弹性项目,
用其
外部
flex base
size 去减其 max-content 贡献 尺寸
-
修正 弹性容器 交叉轴内在尺寸中的错误,并为多行列式弹性容器规定了常见实现的
min-content 尺寸启发式。
(Issue 12)
min-content 交叉尺寸 和 max-content 交叉尺寸 对于一个弹性容器, 是指在给定主轴可用空间、交叉轴无限可用空间的条件下完成布局后的弹性容器的 交叉尺寸。
单行 弹性容器 的 min-content/max-content 交叉尺寸为其 弹性项目 的最大 min-content 贡献/max-content 贡献(分别对应)。
对于 多行 弹性容器, 其 min-content/max-content 交叉尺寸为在 交叉轴 min-content 约束/max-content 约束(分别对应)下对弹性容器进行尺寸计算所得的各弹性行交叉尺寸之和。 但是,如果 弹性容器 是 flex-flow: column wrap;, 则先在 弹性项目 中找出最大的 min-content/max-content 交叉尺寸 贡献(分别对应), 然后在布局时将该尺寸作为每个 弹性项目 的交叉轴 可用空间。
对于 column wrap 的 弹性容器,该启发式给出了一个合理的尺寸近似: 每个弹性项目最终为 min(项目自身的 max-content, 所有项目中的最大 min-content), 且每个 弹性行 不会大于其最大的 弹性项目。 在某些情况下它并非完美,但完全精确的做法代价极高,而该方案效果已相当可观。
-
为创作工具增加明确的符合性要求:除非作者明确表示希望不同步,否则必须保持呈现顺序与 DOM
顺序同步。
(Issue 8)
为在所有呈现模式中保持作者期望的顺序, 创作工具——包括所见即所得编辑器以及基于 Web 的创作辅助工具——必须通过重排底层文档源来实现重排, 而不是使用 order, 除非作者已明确表示希望底层文档顺序(决定语音与导航顺序)与视觉顺序 不同步。
-
规定在绝对定位元素上,align-self 或 justify-self 的 auto 值计算为其自身,
以便与 [CSS-ALIGN-3] 中这些属性的未来扩展保持一致。
(Issue 5)
在绝对定位元素上, auto 的取值计算为其自身。 在其他所有元素上,
当auto 作为 align-self 的取值时,计算为父元素上的 align-items 的值, 若无父元素则为 stretch。 -
撤销将百分比外边距和内边距相对于其自身轴解析的变更;改为允许两种行为。
(Issue 11, Issue 16)
弹性项目 上的百分比外边距与内边距始终相对于各自的维度解析; 不同于块级盒,它们并不总是相对于其包含块的内联维度解析。
弹性项目 上的百分比外边距与内边距可以按以下任一方式解析:
- 相对于其自身轴(左/右百分比相对于宽度解析,上/下相对于高度解析),或,
- 相对于内联轴(左/右/上/下的百分比均相对于宽度解析)
用户代理必须在这两种行为中选择一种。
注意:这种差异很糟,但它准确反映了当前的现实(实现之间无共识,CSSWG 内部也无共识)。 CSSWG 的意图是浏览器最终会在某一种行为上达成一致,届时规范将据此进行要求。
作者应完全避免在 弹性项目 上使用百分比的内边距或外边距, 否则不同浏览器会产生不同的行为。
-
在尺寸计算中处理弹性项目的最小/最大约束。
- 确定弹性项目的主轴与交叉轴可用空间。 对于每个维度, 如果 弹性容器 内容框在该维度是一个 明确尺寸,则使用该值; 如果该维度上的 弹性容器 正在 min 或 max-content 约束 下进行尺寸计算, 则该维度的可用空间为该约束值; 否则,从该维度上可用于弹性容器的空间中减去 弹性容器 的外边距、边框和内边距, 并使用所得的值。
-
修正弹性容器分页规则中的否定表达:之前的定义在所有情况下都隐含了 break-inside: avoid 行为。
(Issue 5)
-
如果弹性容器的第一个片段不在页面顶部,且
某些没有任何 弹性项目不能适应页面剩余空间, 则整个片段被移到下一页。
-
如果弹性容器的第一个片段不在页面顶部,且
澄清
- 若干轻微的编辑性改进与示例错误修复。
自 2014 年 9 月 25 日 LCWD 以来的变更
也可查看 评论处理情况。
重大变更和缺陷修复
- 将 flex-basis: auto 还原为其最初含义。 增加 flex-basis: content 关键字,以明确指定基于内容的自动尺寸计算。 (Issue 10)
-
使 align-content 的适用性取决于可换行性,而不是结果中的弹性行数量。
(Issue 4)
当弹性容器具有多行时,在 多行 的 弹性容器 中(即便只有一行), 每一行的 交叉尺寸 是所需的最小尺寸 […]当一个弹性容器(即使是 多行 容器)只有一行时,在 单行 弹性容器 中, 该行的 交叉尺寸 等于弹性容器的 交叉尺寸, 且 align-content 无效。只有
具有多行的弹性容器多行 弹性容器 在 交叉轴 上存在可对齐的空余空间, 因为在只有一行的弹性容器中单行 弹性容器中 唯一的一行会自动拉伸以填满空间。如果弹性容器
只有一条 弹性行(即便它是一个 多行 的 弹性容器)是 单行 且具有 明确的 交叉尺寸, 则该 弹性行 的 交叉尺寸 等于 弹性容器 的内部 交叉尺寸。如果弹性容器
只有一条弹性行(即便它是一个多行弹性容器),是 单行, 则将该行的交叉尺寸限制在容器计算的最小和最大交叉尺寸属性范围内。 -
移除了宣称强制断开行为的文字,改为引用分页章节,从而解决规范中的冲突。
(Issue 18)
逐个收集连续的项目, 直到第一次下一个将要收集的项目无法放入弹性容器的内部主尺寸为止 ( 或直到遇到强制断开 ,参见 § 10 弹性布局的分页处理) 。 […]
当 CSS2.1 的 page-break-before/page-break-after [CSS2] 或 CSS3 的 break-before/break-after [CSS3-BREAK] 属性指定了分页断开时,就会发生强制断开。 -
修改 flex 收缩因子 的计算,使其与
内部(而非外部)flex base
size 相乘。
(Issue 9)
对该行的每个未冻结项目, 用其 flex 收缩因子乘以其
外部内部 flex base size, 并将其记为 scaled flex shrink factor。 -
加回了 “neither” 中缺失的字母 “n”……
(Issue 6)
如果 弹性项目 的 交叉尺寸属性 计算为 auto, 且 n either 一个 交叉轴 外边距为 auto, 则该 弹性项目 会被 拉伸。
-
指定为了使弹性项目的弹性主尺寸为 明确,弹性容器 的 主尺寸 也必须是 明确 的。
(Issue 20)
【若】… 弹性项目 具有 明确 的 flex basis, 且 弹性容器 的 明确 主尺寸 已确定, 则该 弹性项目 的 主尺寸必须被视为 明确 …
-
移除了要求 flex basis 必须为 content 才能定义 指定尺寸 的限制。
若指定尺寸小于内在尺寸,始终应以指定尺寸为准。
这对于维护作者预期尤其重要,例如
<img src="…" width=40 height=40 title="100x100 image">。 (Issue 25)如果项目的
计算的 flex-basis 为 content 且其计算的 主尺寸属性为 明确, 则其 指定尺寸 就是该尺寸 - 移除了匿名块创建(如 display: table-cell)必须发生在 弹性项目 块化 之前 的要求。 (改为所有子元素立即块化,与绝对定位/浮动行为一致。)
澄清
-
澄清 flex base size 不被夹取(不受最小/最大主尺寸约束)。
(Issue 21)
在确定 flex base size 时, 忽略项目的最小和最大主尺寸属性 (不进行夹取)。
假定主尺寸是项目的 flex base size 按其最小与最大主尺寸属性夹取后的结果。
- 恢复关于表格包装盒注记的规范性状态; 它在上一版草案中被误改。 (Issue 2)
- 移除了对 display 属性长属性的引用, 因为它们将在 CSS Display Level 3 中被移除。
-
更改措辞以避免暗示一次不必要的布局过程。
(Issue 22)
否则,
布局按尺寸放入 该项目到 可用空间 中,使用其已用的 flex basis 替代其 主尺寸, 将 content 值视为 max-content。 - 在 height: auto 的定义中,将“clamped size”重命名为“specified size”。
- 若干琐碎修复。
自 2014 年 3 月 25 日 LCWD 以来的变更
也可查看 评论处理情况。
重大变更和缺陷修复
自 2014 年 3 月 25 日最后征求意见工作草案 以来进行了如下重要变更
-
修正了 min-width:
auto 定义中的错误(缺少否定、未指明轴)。
(Issues 11, 18, 30)
-
扩展并重写了 min-width:
auto 的定义,对具有内在宽高比的项目增加特殊处理。
(Issues 16 和 28)
对于其 弹性项目 的 overflow 非 visible 的情况, 下表给出了最小尺寸:[见表]
此关键字将最小尺寸指定为以下二者中较小者:- min-content 尺寸,或
- 若该值为 明确,则为计算得到的 width/height。
-
调整 min-width:
auto,仅在 flex basis 来自主尺寸属性时,
才将计算的主尺寸作为最小值应用。
(Issue 19)
… 定义为当 项目的计算 flex-basis 为 auto 且 其计算的主尺寸属性为明确时 …
-
规定在对其内容进行百分比尺寸计算时,
不参考盒子的 min-width: auto 所施加的任何尺寸调整。
(Issue 27)
之后该变更被带有相反定义的修订回退。
为防止尺寸循环, auto 的 min-height 和 max-height 不参与该盒子内容的百分比解析。 例如,一个百分比高度的块,其弹性项目父级有 height: 120em; min-height: auto 时, 它将始终基于 height: 120em 确定自身尺寸, 而不考虑 min-height 对弹性项目已用尺寸的影响。
- 为 flex-basis 引入额外的 main-size 关键字, 以便可以分别显式指定“从主尺寸属性查值”和“自动尺寸”的行为。 (Issue 20) 随后该变更被回退,改为通过引入 content 关键字来解决同一问题的替代方案。
-
规定具有 明确 flex basis 的 弹性项目 在 主轴上也视为 明确,
从而允许在项目自身可伸缩的情况下解析其百分比尺寸的子元素。
(Issue 26)
如果一个百分比将相对于弹性项目的主尺寸进行解析, 且该弹性项目具有明确的 flex basis, 则为了解析该百分比,主尺寸必须被视为明确, 且该百分比必须相对于弹性项目的弹性后的主尺寸进行解析 (即在下面的弹性布局算法对该弹性项目的弹性容器完成后, 并且该弹性项目得到其最终尺寸之后)。
-
即使容器尺寸不明确,
也将单行弹性盒的行 交叉尺寸
夹取到容器自身的最小/最大范围内。
(Issue 9)
-
该 弹性行 的已用交叉尺寸为
前两步所得数值与零中的最大值。
如果弹性容器只有一条弹性行 (即使它是一个多行弹性容器), 则将该行的交叉尺寸夹取在容器计算的最小与最大交叉尺寸属性之间。 注意:如果 CSS 2.1 对 min/max-width/height 的定义更广泛地适用, 该行为将自动得出。
-
该 弹性行 的已用交叉尺寸为
前两步所得数值与零中的最大值。
- 修复了新章节 解析弹性长度 中的各种错误 (参见 2014 年 3 月对 flex: 0 与 flex: 1 连续性的重写), 并将编辑结构回退以匹配旧的候选推荐版本。 (Issues 3, 4, 8, 10, 15)
- 修正了 弹性容器的 max-content 尺寸,通过按弹性分数归一化而非仅求和项目的 max-content 尺寸, 以考虑弹性行为。 (Issue 39)
- 更新 flex 属性以始终可动画, 因为 0 与非 0 值之间的不连续性已被修复。 (Issue 5)
澄清
自 2014 年 3 月 25 日最后征求意见工作草案 以来还进行了如下重要澄清:
-
通过引入更贴近 CSS2.1 概念与术语的说明,
澄清了如何计算弹性容器的绝对定位子元素的静态位置。
(Issue 12)
其弹性容器的绝对定位子元素的 静态位置 是先在不包含绝对定位子元素的情况下完成完整的弹性布局,再定位每个绝对定位子元素被确定为使该子元素的位置 仿佛它是弹性容器中唯一的弹性项目, 且假设子元素与弹性容器均为其已用尺寸的固定尺寸盒。换言之,弹性容器的绝对定位子元素的静态位置在 弹性布局之后 确定, 方法是将该子元素的 静态位置矩形 设为弹性容器的内容框, 然后根据弹性容器的 justify-content 的取值 和子元素自身的 align-self 的取值, 将绝对定位子元素在该矩形内进行对齐。
-
澄清 order 对
弹性容器的绝对定位子元素的适用。
(注意,该行为随后被撤销。)
弹性容器的绝对定位子元素不参与弹性布局
除重排步骤之外。 然而,它确实参与重排步骤(参见 order), 这会影响它们的绘制顺序。order 属性控制
弹性项目弹性容器的子元素 在其弹性容器中的出现顺序…除非后续规范另有规定, 此属性对非
弹性项目弹性容器的子元素 的盒无效。注意:弹性容器的绝对定位子元素不参与弹性布局,但会与任何弹性项目子元素一起被重排。
-
为(例如明确性等)特殊行为之目的,
澄清什么是 stretched 的弹性项目。
(Issue 25)
如果弹性项目的 交叉尺寸 属性计算为 auto, 且任一交叉轴外边距为 auto,则该弹性项目为拉伸(stretched)。其
其已用值 …
自 2012 年 9 月 18 日候选推荐以来的变更
也可查看 评论处理情况。
重大变更和缺陷修复
自 2012 年 9 月 18 日候选推荐 以来进行了如下重要变更:
-
更改了 auto 作为 min-width/min-height 的新初始值时的行为,以:
- 考虑 overflow 是否为 visible, 因为当 overflow 被显式处理时, 强行使尺寸足以展示全部内容既困惑又不必要。
- 考虑指定的 width/height, 从而隐含的最小值永不会大于指定尺寸。
- 在弹性项目上计算为其自身(而非 min-content), 因为二者已不再等价(由于上述更改)。
- auto
-
当用作弹性项目的主轴最小尺寸属性的取值时, 该关键字表示一个等于 min-content 尺寸的最小值, 以帮助确保项目足够大以容纳其内容。
预期当定义它的规范([CSS-SIZING-3])成熟时, 它将计算为 min-content 关键字。
对于 弹性项目, 且其 overflow 非 visible 的情况, 该关键字将最小尺寸指定为以下两者中较小者:
- min-content 尺寸,或
- 若该值为 明确, 则为计算得到的 width/height。
-
规定弹性项目上的百分比外边距/内边距
相对于其各自的维度解析,
而不像块级盒那样相对于包含块的内联维度。
(Issue 16)
弹性项目 上的百分比外边距与内边距始终相对于各自的维度解析; 不同于块级盒,它们并不总是相对于其包含块的内联维度解析。
-
将单行弹性容器尺寸的明确性传递给任何被拉伸的项目。
(Issue 3)
作为处理被拉伸的 弹性项目 的特殊情况, 如果一个 单行 弹性容器 具有明确的 交叉尺寸, 则任何 弹性项目(align-self: stretch)的外部 交叉尺寸 为弹性容器的内部 交叉尺寸(再按该 弹性项目 的最小/最大 交叉尺寸 进行夹取),并被视为 明确。
-
允许在拉伸的自动高度弹性项目内解析百分比,
方法是要求一次重新布局。
(Issue 3)
如果该弹性项目具有 align-self: stretch,则为其内容重新进行布局, 将此已用尺寸视为明确的 交叉尺寸,以便解析百分比尺寸的子元素。
注意:此步骤不影响弹性项目的主尺寸,即使它具有内在宽高比。
-
允许内在宽高比影响
主尺寸计算。 (Issue 8)
如果该弹性项目具有 …
- 内在宽高比,
- flex basis 为 auto,以及
- 明确的 交叉尺寸
则其 flex base size 由其内部 交叉尺寸 和该 弹性项目 的内在宽高比计算得到。
-
当 主尺寸依赖于 交叉尺寸 时,定义 假定主尺寸。
(Issue 23)
如果需要一个 交叉尺寸 来确定 主尺寸(例如当 弹性项目的 主尺寸位于其块轴上), 且该 弹性项目的 交叉尺寸为 auto 且非 明确, 则在此计算中使用 fit-content 作为该 弹性项目的 交叉尺寸。
-
定义了 弹性容器的内在尺寸。
使用其主尺寸属性确定弹性容器的主尺寸。
在此计算中,弹性容器的最小内容主尺寸为其项目的最小内容尺寸贡献中的最大值, 弹性容器的最大内容主尺寸为其项目的最大内容尺寸贡献之和。 项目的最小内容/最大内容主尺寸贡献分别为 其在最小内容/最大内容约束下尺寸计算得到的外部假定主尺寸。在该计算中,弹性项目上的 ‘auto’ 外边距视为 ‘0’。max-content 主尺寸 对于 弹性容器 是其项目在 主轴上的 max-content 贡献之和。 min-content 主尺寸 对于 单行 弹性容器 为其项目在 主轴上的 min-content 贡献之和; 对于 多行 容器, 为这些贡献中的最大值。
min-content 交叉尺寸 与 max-content 交叉尺寸 对于弹性容器,为在给定主轴可用 空间 以及无限可用 交叉轴 空间下完成布局后的弹性容器的 交叉尺寸。
min-content/max-content 贡献的主尺寸,对于 弹性项目, 为其在 假定主尺寸 下,处于 min-content/max-content 约束时(分别对应)的外部尺寸。
本节术语的定义参见 [CSS-SIZING-3]。
-
修正了弹性行尺寸确定中的遗漏,
使 单行 弹性盒在没有明确尺寸时,会根据其内容确定尺寸。
如果弹性容器只有一条 弹性行(即使它是一个 多行 弹性容器) 且具有 明确 的 交叉尺寸 , 则该 交叉尺寸 为 弹性行 的 弹性容器 的内部 交叉尺寸。
-
弹性行的尺寸下限为 0。
(Issue 2)
弹性行的已用交叉尺寸为
更大最大 的前两步所得数值 与 0 。 -
弹性项目的绘制行为类似于内联块,而非块级元素。
(Issue 18)
-
现在,当在 flex-basis 速记属性中被省略时,
flex 的该分量解析为
0% 而非 0px。
因为相对于不明确尺寸解析的百分比表现为 auto,
这在收缩包裹的弹性容器中会有更好的表现。
(Issue 20)
当从 flex 速记属性中被省略时,其指定值为 0%
长度 0。
注意:该变更已被回退。 -
规定不可解析的百分比 flex base size
按 auto 处理。
flex-basis 的百分比值 相对于弹性项目的包含块(即其弹性容器)解析, 若该包含块的尺寸为 不明确, 则结果
未定义等同于 主尺寸为 auto 。 -
简化了 弹性容器 的绝对定位子元素的静态位置,
以与网格布局保持一致。
(Issue 6)
弹性容器的 绝对定位子元素 不参与弹性布局 的重排步骤之外的其他步骤。
然而,如果 left 与 right 或 top 与 bottom 同时为 auto, 则这些属性的已用值 按如下方式从其静态位置计算:
若 left 与 right 均为 auto, 则该 弹性项目 必须被定位,使 其 main-start 或 cross-start 边(取决于哪个位于水平方向) 与 静态位置 对齐。 若 top 与 bottom 均为 auto, 则该 弹性项目 必须被定位,使 其 main-start 或 cross-start 边(取决于哪个位于垂直方向) 与 静态位置 对齐。
在 主轴 上,
- 若同一 弹性行 上存在后续流内 弹性项目, 则 静态位置为该 弹性项目 的外部 main-start 边。
- 否则,若同一 弹性行 上存在先前的流内 弹性项目, 则 静态位置为该 弹性项目 的外部 main-end 边。
- 否则,静态位置通过弹性容器上的 justify-content 的取值确定, 假定 静态位置 由一个尺寸为 0 的弹性项目表示。
在 交叉轴 上,
- 若存在先前的流内 弹性项目, 则 静态位置为该项目所在 弹性行 的 cross-start 边。
- 否则,静态位置为第一条 弹性行 的 cross-start 边。
静态位置旨在大致匹配一个匿名 0×0 且按 flex-start 对齐的 参与弹性布局的弹性项目的位置; 主要差异在于由 justify-content: space-around 或 justify-content: space-between 导致的任何填充空间在假想项目周围被抑制: 若其后存在真实项目,则抑制它与后一个项目之间的空间; 否则若不存在,则抑制它与前一个项目(若有)之间的空间。
其静态位置通过先在不包含绝对定位子元素的情况下完成完整的弹性布局来计算, 然后将每个绝对定位子元素定位为 仿佛它是该 弹性项目 的唯一一个, 并且假设子元素与 弹性容器 都是其已用尺寸的固定尺寸盒。
例如,默认情况下, 绝对定位子元素的静态位置将其对齐到主起点/交叉起点角, 这与弹性容器上的 justify-content 和 align-content 的默认值相对应。 但是,在 弹性容器 上设置 justify-content:center, 会使其在主轴上居中对齐。 - 更改了解析弹性长度的算法, 以使当弹性因子之和趋近于零时的行为连续。 (当总和 ≥ 1 时无变化。) (Issue 30) 用此处被 此新章节替换。
澄清
还进行了如下重要澄清:
-
弹性容器的绝对定位子元素不再称为“弹性项目”(避免术语混淆)。 (??)
名称: order 适用于: flex items 以及 弹性容器 的绝对定位子元素 根据 order 重新排序弹性项目 以及弹性容器的绝对定位子元素 。
-
澄清 float 仍会影响计算的 display(这可能影响在确定弹性项目之前运行的盒修正规则)。
(Issue 7)
float 和 clear 对 弹性项目 无影响 , 也不会使其脱离文档流。 但是,float 属性仍可通过影响 display 属性的计算值来影响盒生成。
-
澄清“white space”的含义。(Issue 26)
然而,仅包含 white space 的匿名弹性项目 (即可被 white-space 属性影响的字符) 不会被渲染,效果等同于 display:none。
- 澄清表格匿名盒的生成发生在内部表格元素的计算值转换位置(以替代之)。
-
澄清弹性项目判定与 display-inside /
display-outside(display 的新长属性,定义于 CSS Display Module Level 3)之间的交互。
注意:该变更已被回退。如果由某元素生成的 弹性容器 的某个流内子元素指定的 display-outside 为 inline-level, 则其计算为 block-level。 (这实际上将任何内联的 display 值转换为对应的块级等价物。)
- 澄清 overflow 适用于弹性容器。
- 澄清 ::first-line 与 ::first-letter 伪元素 不适用于弹性容器(因为它们不是块容器)。
-
澄清 stretch 检查的是交叉尺寸属性的计算值是否为
auto,
这意味着表现为 auto 的百分比交叉尺寸(因为它们不相对于明确尺寸解析)
不会被拉伸。
(Issue 5)
确定每个弹性项目的已用交叉尺寸。 如果某个弹性项目具有 align-self: stretch, 且其 计算的 交叉尺寸属性为 auto, 并且 …
-
澄清用于确定弹性容器主尺寸的,是其所参与的格式化上下文的规则。
确定弹性容器的主尺寸 使用 其所参与的格式化上下文的规则
其主尺寸属性。 - 澄清绘制时使用的是经过 order 修改的文档顺序,而非原始文档顺序。 (这在 order 章节中已说明,但未在专门关于绘制顺序的章节中明确。)
-
澄清断行规则,以精确处理负尺寸的弹性项目和行尾的零尺寸项目。
(Issue 1)
否则, 从第一个未收集的项目开始, 收集 连续的项目,一个接一个, 直到第一次将要收集的下一个项目 无法放入弹性容器的内部主尺寸为止, 或直到遇到强制断开为止。 如果第一个未收集的项目本身也无法放入, 则仅将它收集到该行中
尽可能多的连续弹性项目,直到填满为止 或遇到强制断开为止 (但至少收集一个) 到弹性容器的内部主尺寸中的一条弹性行里。注意,
具有零主尺寸的项目从不会开始新的一行, 除非它们是弹性容器中的第一个项目, 或它们之前存在强制断开。“尽可能多地收集”这一行将把它们零尺寸的弹性项目 收集到前一行的末尾, 即便最后一个非零项目刚好“填满”了该行。 -
澄清弹性容器的交叉尺寸仍需受其最小/最大属性的夹取。
(Issue 24)
隐私注意事项
本规范未报告新的隐私注意事项。
安全注意事项
本规范未报告新的安全注意事项。
测试
the order property, now in css-display-3
- order-interpolation.html (在线测试) (源码)
- flexbox-anonymous-items-001.html (在线测试) (源码)
- flexbox_order-abspos-space-around.html (在线测试) (源码)
- flexbox_order-box.html (在线测试) (源码)
- flexbox-order-from-lowest.html (visual test) (源码)
- 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 (在线测试) (源码)
- flexbox_computedstyle_order.html (在线测试) (源码)
- flexbox_computedstyle_order-inherit.html (在线测试) (源码)
- flexbox_computedstyle_order-integer.html (在线测试) (源码)
- flexbox_computedstyle_order-invalid.html (在线测试) (源码)
- flexbox_computedstyle_order-negative.html (在线测试) (源码)
- order-001.htm (visual test) (源码)
- order-abs-children-painting-order-different-container.html (在线测试) (源码)
- order-abs-children-painting-order.html (在线测试) (源码)
- order-with-column-reverse.html (在线测试) (源码)
- order-with-row-reverse.html (在线测试) (源码)
- order-painting.html (在线测试) (源码)
- order_value.html (在线测试) (源码)
- order-computed.html (在线测试) (源码)
- order-invalid.html (在线测试) (源码)
- order-valid.html (在线测试) (源码)
print stuff
- 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 (在线测试) (源码)
non-specific crashers
- 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 (在线测试) (源码)
need quirks mode
- fixed-table-layout-with-percentage-width-in-flex-item.html (在线测试) (源码)
- percentage-size-quirks-002.html (在线测试) (源码)
- percentage-size-quirks.html (在线测试) (源码)
- quirks-auto-block-size-with-percentage-item.html (在线测试) (源码)
css box 3 tests
- percentage-padding-001.html (在线测试) (源码)
- percentage-padding-002.html (在线测试) (源码)
- percentage-padding-003.html (在线测试) (源码)
- percentage-padding-004.html (在线测试) (源码)
- percentage-padding-005.html (在线测试) (源码)
unsure/nonspecific
- remove-wrapped-001.html (在线测试) (源码)
- remove-wrapped-002.html (在线测试) (源码)
- scrollbars-auto-min-content-sizing.html (在线测试) (源码)
- select-element-multiple.html (在线测试) (源码)
- shrinking-column-flexbox.html (在线测试) (源码)
- table-as-item-large-intrinsic-size.html (在线测试) (源码)
- table-with-float-paint.html (在线测试) (源码)