CSS 灵活盒布局模块 第1级

W3C 候选推荐标准,

此版本:
https://www.w3.org/TR/2018/CR-css-flexbox-1-20181119/
最新发布版本:
https://www.w3.org/TR/css-flexbox-1/
编辑草案:
https://drafts.csswg.org/css-flexbox-1/
先前版本:
测试套件:
http://test.csswg.org/suites/css-flexbox-1_dev/nightly-unstable/
编辑:
Tab Atkins Jr. (Google)
Elika J. Etemad / fantasai (特邀专家)
(微软)
前任编辑:
(微软公司)
L. David Baron (Mozilla)
(Mozilla公司)
(前Opera软件)
(前Netscape公司)
建议编辑此规范:
GitHub编辑器
问题追踪:
GitHub问题
WPT路径前缀:
css/css-flexbox/

摘要

该规范描述了一个针对用户界面设计优化的CSS盒模型。在弹性布局模型中,弹性容器的子元素可以沿任意方向布局,并且可以通过“弹性”调整其大小,既可以扩展以填充未使用的空间,也可以缩小以避免溢出父元素。子元素的水平和垂直对齐都可以轻松操作。通过嵌套这些盒子(横向嵌入纵向,或纵向嵌入横向),可以构建二维布局。

CSS 是一种描述结构化文档(如HTML和XML)在屏幕、纸张等介质上渲染的语言。

本文档状态

本节描述了本文档在发布时的状态。其他文档可能会取代此文档。当前W3C出版物和此技术报告的最新修订版本列表可在W3C技术报告索引 https://www.w3.org/TR/中找到。

本文档由CSS工作组作为候选推荐标准发布。本文档旨在成为W3C推荐标准。 为确保有机会进行广泛的评审,本文档至少会保持候选推荐标准状态到

GitHub问题是讨论本规范的首选方式。 在提交问题时,请在标题中加入“css-flexbox”字样,最好是这样: “[css-flexbox] …评论摘要…”。 所有问题和评论都会被存档,并且还有一个历史存档

提供了初步实现报告

发布为候选推荐标准并不意味着获得W3C成员的认可。本文档是草案,可能会随时更新、替换或废弃为其他文档。将本文档引用为其他内容是不合适的,它仅代表一项正在进行的工作。

本文档由遵循W3C专利政策的工作组产生。W3C维护了与该工作组交付成果相关的任何专利公开的公开列表;该页面还包括披露专利的说明。 任何个人如实际知晓包含必要声明的专利,必须按照W3C专利政策第6节披露相关信息。

本文档遵循2018年2月1日W3C流程文件的规定。

有关自上一草案以来的更改,请参见更改部分。

1. 引言

本节非规范性内容。

CSS 2.1 定义了四种布局模式——这些算法根据元素与其兄弟和祖先盒子的关系确定盒子的大小和位置:

本模块引入了一种新的布局模式,弹性布局,其设计用于布局更复杂的应用程序和网页。

1.1. 概述

本节非规范性内容。

弹性布局在表面上类似于块布局。 它缺少许多可以在块布局中使用的与文本或文档相关的复杂属性,例如浮动。 作为交换,它获得了简单而强大的工具, 用于分配空间和对齐内容, 这是Web应用程序和复杂网页通常需要的。 弹性容器的内容:

下面是一个包含标题、照片、描述和购买按钮的目录示例。 设计师的意图是每个条目具有相同的整体大小, 照片位于文本上方, 并且购买按钮无论条目描述的长度如何,都对齐在底部。 弹性布局使该设计的许多方面变得简单:
#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>这是你能买到的最好的电脑,适合预算有限的人。
    </p> 
    <ul>
      <li>电脑
      <li>显示器
      <li>键盘
      <li>鼠标
    </ul> 
    <img src="images/computer.jpg" 
         alt="你将获得:一台配有匹配外设的白色电脑。">
    <button>立即购买</button>
  </section>
  <section class="sale-item"></section></section> 
你将获得:一台配有匹配键盘和显示器的白色电脑。

电脑初学者套装

这是你能买到的最好的电脑, 适合预算有限的人。

  • 电脑
  • 显示器
  • 键盘
  • 鼠标
你将获得:漂亮的ASCII艺术。

打印机

只能打印ASCII艺术。

  • 不含纸和墨水。
上述代码的示例渲染。

1.2. 模块交互

本模块扩展了display 属性的定义[CSS21], 添加了新的块级和内联级显示类型, 并定义了一种新的格式化上下文类型, 以及用于控制其布局的属性。 本模块定义的任何属性均不适用于::first-line::first-letter伪元素。

CSS盒子对齐模块扩展并取代了 此处引入的对齐属性的定义 (justify-contentalign-itemsalign-selfalign-content)。

2. 弹性布局盒模型与术语

弹性容器是由具有 计算后的display 属性为flexinline-flex的元素生成的盒子。 弹性容器中的流内子元素称为弹性项目,它们使用弹性布局模型进行布局。

与偏向于块和内联流方向的块布局和内联布局不同, 弹性布局偏向于弹性方向。 为了更容易讨论弹性布局, 本节定义了一组与弹性流动相关的术语。 flex-flow值和 书写模式确定了这些术语如何映射到 物理方向(上/右/下/左)、轴线(垂直/水平)和尺寸(宽度/高度)。

展示应用于弹性容器的各种方向和尺寸术语的图示。
主轴
主维度
弹性容器的主轴是沿着弹性项目布局的主要轴线。 它在主维度上延伸。
主开始
主结束
弹性项目放置在容器内, 从主开始侧开始, 并朝向主结束侧延伸。
主尺寸
主尺寸属性
弹性容器弹性项目的宽度或高度, 无论哪个位于主维度, 都是该盒子的主尺寸。 其主尺寸属性 是其宽度高度属性, 无论哪个位于主维度。 类似地,其最小主尺寸属性最大主尺寸属性是其 最小宽度/ 最大宽度最小高度/ 最大高度属性, 无论哪个位于主维度, 并确定其最小/ 最大主尺寸
交叉轴
交叉维度
主轴垂直的轴线称为交叉轴。 它在交叉维度上延伸。
交叉开始
交叉结束
弹性行填充项目并放置在容器中, 从弹性容器的交叉开始侧开始, 并朝向交叉结束侧延伸。
交叉尺寸
交叉尺寸属性
弹性容器弹性项目的宽度或高度, 无论哪个位于交叉维度, 都是该盒子的交叉尺寸。 其交叉尺寸属性 是其宽度高度属性, 无论哪个位于交叉维度。 类似地,其最小交叉尺寸属性最大 交叉尺寸属性是其最小宽度/ 最大宽度最小高度/ 最大高度属性, 无论哪个位于交叉维度, 并确定其最小/ 最大交叉尺寸

本规范中使用的其他尺寸术语在CSS 内在和外在尺寸中定义。 [CSS-SIZING-3]

3. 弹性容器:flexinline-flex display

名称: display
新值: flex | inline-flex
flex
该值使元素生成一个弹性容器盒, 当它位于流布局中时,是块级盒。
inline-flex
该值使元素生成一个弹性容器盒, 当它位于流布局中时,是内联级盒。

弹性容器为其内容建立一个新的 弹性格式化上下文。 这与建立块格式化上下文相同, 只是使用弹性布局代替了块布局。 例如,浮动不会侵入弹性容器, 并且弹性容器的边距不会与其内容的边距合并。弹性容器为其内容形成一个包含块, 与块容器一样[CSS21] overflow属性适用于弹性容器

弹性容器不是块容器, 因此某些假设块布局的属性在弹性布局的上下文中不适用。 特别是:

如果元素的指定display值为 inline-flex, 那么在某些情况下,它的display属性会计算为 flexCSS 2.1 第9.7节中的表格 将添加一行, 其中“指定值”列中为inline-flex, “计算值”列中为flex

4. 弹性项目

大致而言,弹性项目弹性容器的盒子, 它们代表了其文档流中的内容。

每个弹性容器的文档流子元素都变成弹性项目, 并且每个连续的子文本运行被包裹在一个 匿名 块容器 弹性项目中。 但是,如果整个子文本运行序列只包含 空白(即 可以受white-space属性影响的字符), 则该序列不会被渲染(就像其文本节点display:none一样)。

弹性项目示例:

<div style="display:flex">

    <!-- 弹性项目:块子元素 -->
    <div id="item1">block</div>

    <!-- 弹性项目:浮动元素;浮动被忽略 -->
    <div id="item2" style="float: left;">float</div>

    <!-- 弹性项目:围绕内联内容的匿名块框 -->
    匿名项目3

    <!-- 弹性项目:内联子元素 -->
    <span>
        项目4
        <!-- 弹性项目不会 围绕块 拆分 -->
        <q style="display: block" id=not-an-item>项目4</q>
        项目4
    </span>
</div>
从上面的代码块确定的弹性项目
  1. 包含block的弹性项目。
  2. 包含float的弹性项目。
  3. 包含匿名项目3的匿名(不可样式化)弹性项目。
  4. 包含三个连续块的弹性项目:
    • 包含项目4的匿名块。
    • 包含项目4<q>元素块。
    • 包含项目4的匿名块。

请注意,元素之间的空白消失了: 它不会成为自己的弹性项目, 尽管元素间的文本确实会被包裹在匿名弹性项目中。

还要注意,匿名项目的框是不可样式化的, 因为没有元素可以为其分配样式规则。 但其内容会继承弹性容器的样式(如字体设置)。

弹性项目为其内容建立了独立的格式化上下文。 然而,弹性项目本身是弹性级盒,而不是块级盒: 它们参与的是容器的弹性格式化上下文, 而不是块格式化上下文。


注意: 阅读本规范的作者可能希望跳过以下框生成和静态位置的详细信息

display值为 弹性项目的元素是块化的: 如果生成弹性容器的元素的文档流子元素的指定display值是内联级值, 则其会计算为块级等效值。 (有关这种display值转换的详细信息,请参见 CSS2.1第9.7节 [CSS21]CSS Display [CSS3-DISPLAY])。

注意:某些display值通常会在原始盒子周围触发匿名盒的创建。 如果这样的盒子是弹性项目, 它首先会被块化, 因此不会发生匿名盒的创建。 例如,两个连续的弹性项目,其display:table-cell会变成两个单独的 display: block 弹性项目, 而不是被包裹成一个匿名表。

对于display:table的弹性项目, 表包装盒成为弹性项目orderalign-self属性适用于它。 任何标题盒的内容都会影响表包装盒的最小内容和最大内容大小的计算。 然而,类似于widthheightflex长手写适用于表盒如下: 通过执行布局计算出弹性项目的最终大小, 就像表包装盒的边缘与表盒的内容边缘之间的距离都属于表盒的边框+内边距区域一样, 并且表盒是弹性项目

4.1. 绝对定位的弹性子元素

由于它是脱离文档流的,弹性容器的绝对定位子元素不会参与弹性布局。

绝对定位子元素的静态位置由以下方式决定: 该子元素被视为是弹性项目的唯一成员, 并且假设子元素和弹性容器 都是固定尺寸的盒子,其大小为使用过的尺寸。 为此目的,auto的外边距被视为零。

换句话说, 绝对定位子元素的静态位置矩形弹性容器的内容盒, 其中静态位置矩形 是用于确定绝对定位盒静态位置偏移的 对齐容器

(在块布局中,静态位置矩形对应于CSS2.1§10.3.7中描述的“假想盒子”的位置。 由于没有对齐属性,CSS2.1总是使用绝对定位盒在 块起始行内起始 的对齐方式。 请注意,这一定义最终将被移至CSS定位模块。)

这一效果意味着,如果你在弹性容器的绝对定位子元素上设置了align-self: center;, 子元素的自动偏移将会使其在弹性容器交叉轴上居中。

然而,由于绝对定位盒被视为“固定大小”, 因此stretch的值将被视为与flex-start相同。

4.2. 弹性项目的边距和内边距

相邻弹性项目的边距不会 折叠

块盒子上的百分比边距和内边距类似, 弹性项目的百分比边距和内边距 是相对于其包含块内联尺寸来解析的, 例如,左/右/上/下的百分比都根据其包含块宽度在水平书写模式中解析。

自动边距会扩展以吸收相应维度上的额外空间。 它们可用于对齐, 或者将相邻的弹性项目推开。 请参见使用auto边距对齐

4.3. 弹性项目的Z轴排序

弹性项目的绘制方式与内联块类似 [CSS21], 只是使用了经过order修改的文档顺序来代替原始文档顺序, 并且z-index 除了auto以外的值都会创建一个堆叠上下文, 即使position的值是 static (表现得完全像positionrelative一样)。

注意: 定位在弹性项目之外的后代元素仍然会参与由弹性项目建立的任何堆叠上下文。

4.4. 折叠的项目

在弹性项目上指定 visibility:collapse 会导致其成为 折叠的弹性项目, 产生类似于 visibility:collapse 在表行或表列上的效果: 折叠的弹性项目将完全从渲染中移除, 但留下一个“支撑”,保持弹性行的交叉尺寸稳定。 因此,如果弹性容器只有一条弹性行, 动态折叠或展开项目可能会改变弹性容器主尺寸, 但保证不会影响其交叉尺寸,也不会导致页面其余布局“晃动”。 不过,折叠后会重新执行弹性行换行,因此具有多行的弹性容器的交叉尺寸可能会改变。

尽管折叠的弹性项目不会被渲染, 但它们确实会出现在格式化结构中。 因此,与display:none的项目不同 [CSS21], 依赖于框出现的效果(例如计数器递增或运行动画和过渡)仍然会对折叠的项目起作用。

在下面的例子中, 侧边栏根据其内容进行大小调整。使用visibility: collapse 来动态隐藏部分导航侧边栏,而不影响其宽度,尽管最宽的项目(“Architecture”)在一个折叠的部分中。
以下代码示例的实时渲染
鼠标悬停在左侧菜单上: 每个部分都会展开显示其子项目。 为了保持侧边栏的宽度(以及这个主区域的宽度)稳定, 使用visibility: collapse而不是display: none。 这样可以确保侧边栏总是足够宽以显示“Architecture”这个单词,即使它并不总是可见。
@media (min-width: 60em) {
  /* 两列布局仅在足够宽时使用(相对于默认文本大小) */
  div { display: flex; }
  #main {
    flex: 1;         /* 主区域占据所有剩余空间 */
    order: 1;        /* 将其放在导航之后(右侧) */
    min-width: 12em; /* 优化主内容区域的尺寸 */
  }
}
/* 菜单项使用弹性布局,以便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">About</a><li id="nav-projects"><a href="#nav-projects">Projects</a>
        <ul>
          <li><a href="…">Art</a>
          <li><a href="…">Architecture</a>
          <li><a href="…">Music</a>
        </ul>
      <li id="nav-interact"><a href="#nav-interact">Interact</a></ul>
  </nav>
</div>
<footer>

要计算支撑的大小,首先使用未折叠的项目执行弹性布局, 然后重新运行,将每个折叠的项目替换为支撑,以保持项目原始行的交叉尺寸。 参见弹性布局算法以获取 visibility:collapse 与弹性布局交互的规范定义。

注意: 在任何弹性项目上使用 visibility:collapse 将导致弹性布局算法在部分过程中重复,重新运行最昂贵的步骤。 如果项目不会被动态折叠和展开,建议作者继续使用 display:none 来隐藏项目, 因为这对于布局引擎来说更高效。 (然而,由于 visibility 改变时只需重复部分步骤, 因此在动态情况下仍建议使用 'visibility: collapse')。

4.5. 弹性项目的自动最小尺寸

注意: auto 关键字,代表一个 自动最小尺寸, 是 min-widthmin-height 属性的新初始值。 该关键字以前在本规范中定义,但现在在 CSS 尺寸 模块中定义。

为了为 弹性项目 提供更合理的默认 最小尺寸, 非 滚动容器 上的 主轴 自动最小尺寸 的使用值是一个基于内容的最小尺寸; 对于 滚动容器自动最小尺寸 通常为零。

通常,基于内容的最小尺寸弹性项目内容尺寸建议指定尺寸建议 中较小的值。 但是,如果该框具有纵横比且没有 指定尺寸, 则其 基于内容的最小尺寸 是其 内容尺寸建议 和其 转移尺寸建议 中较小的值。 如果该框既没有 指定尺寸建议 也没有纵横比, 则其 基于内容的最小尺寸内容尺寸建议

内容尺寸建议指定尺寸建议转移尺寸建议 会根据相关的最小/最大/首选尺寸属性计算, 以防止 基于内容的最小尺寸 干扰任何作者提供的约束, 并且它们定义如下:

指定尺寸建议
如果项目的计算主尺寸属性确定的, 那么 指定尺寸建议 就是该尺寸 (如果它是 确定的,则由其 最大主尺寸属性 限制)。 否则,它是未定义的。
转移尺寸建议
如果项目具有内在纵横比, 并且其计算的 交叉尺寸属性确定的, 则 转移尺寸建议 就是该尺寸 (如果它们是 确定的,则由其 最小和最大交叉尺寸属性 限制), 通过纵横比转换。 否则,它是未定义的。
内容尺寸建议
内容尺寸建议最小内容尺寸主轴上, 如果它具有纵横比,则由任何 确定的 最小和最大交叉尺寸属性 限制, 然后再由 最大主尺寸属性 限制,如果该属性是 确定的

为了计算框的内在尺寸 (例如框的 最小内容尺寸), 基于内容的最小尺寸 使该轴上的框的尺寸变得不确定 (即使其 宽度 属性指定了 确定的 尺寸)。 请注意,这意味着根据此尺寸计算的百分比将 表现为自动

尽管如此,尽管这可能需要在某些情况下进行额外的布局传递以重新解析百分比, 但该值 (如 最小内容最大内容适合内容 值 在 [CSS-SIZING-3] 中定义) 并不会阻止项目内百分比尺寸的解析。

请注意,尽管基于内容的最小尺寸通常是合适的, 并有助于防止内容重叠或溢出其容器, 但在某些情况下并不适用:

特别是,如果弹性尺寸用于文档的主要内容区域, 最好设置一个明确的字体相关最小宽度,例如 min-width: 12em。 基于内容的最小宽度可能会导致大表格或大图像 将整个内容区域的尺寸拉伸到溢出区域, 从而使文本行过长且难以阅读。

另外,使用基于内容的尺寸时,如果项目内容较多, 布局引擎必须遍历所有这些内容才能找到其最小尺寸, 而如果作者设置了明确的最小值,则不需要这样做。 (然而,对于内容较少的项目, 这种遍历是微不足道的,因此不是性能问题。)

5. 排序和方向

弹性容器的内容可以按任何方向和顺序排列。 这使得作者可以轻松实现以前需要复杂或不稳定方法的效果, 例如使用 浮动清除 属性的技巧。 该功能通过 flex-directionflex-wraporder 属性暴露出来。

注意: 弹性布局的重排序功能有意只影响 视觉渲染, 并保持基于源代码顺序的语音顺序和导航顺序。 这使得作者可以在保留源代码顺序的同时操纵视觉呈现,以便为非 CSS 的用户代理以及语音和顺序导航等线性模型提供支持。 请参见 重排序和可访问性 以及 弹性布局概述, 其中的例子使用了这种二分法来改善可访问性。

作者 不得 使用 order*-reverse 值作为 flex-flow/flex-direction 的替代来进行正确的源代码排序, 因为这可能会破坏文档的可访问性。

5.1. 弹性流方向:flex-direction 属性

名称: flex-direction
值: row | row-reverse | column | column-reverse
初始值: row
适用于: 弹性容器
继承:
百分比: 不适用
计算值: 指定的关键字
规范顺序: 按语法
动画类型: 离散

flex-direction 属性指定 弹性项目 在弹性容器中的放置方式, 通过设置弹性容器的 主轴 方向。 这决定了弹性项目的排列方向。

row
弹性容器的 主轴 与当前 内联轴 的方向相同 在当前的 书写模式 中。 主起始主结束 方向分别等同于 当前书写模式中的 内联起始内联结束 方向。
row-reverse
row 相同, 只是 主起始主结束 方向是反转的。
column
弹性容器的 主轴 与当前书写模式中的 块轴 方向相同。 主起始主结束 方向分别等同于 当前 块起始块结束 方向。
column-reverse
column 相同, 只是 主起始主结束 方向是反转的。

注意: 反向值不会反转框顺序: 像 writing-modedirection [CSS3-WRITING-MODES], 它们只改变流动方向。 绘制顺序、语音顺序和顺序导航顺序不受影响。

5.2. 弹性行换行:flex-wrap 属性

名称: flex-wrap
值: nowrap | wrap | wrap-reverse
初始值: nowrap
适用于: 弹性容器
继承:
百分比: 不适用
计算值: 指定的关键字
规范顺序: 按语法
动画类型: 离散

flex-wrap 属性控制弹性容器是 单行 还是 多行, 以及 交叉轴 的方向, 决定了新行的堆叠方向。

nowrap
弹性容器为 单行
wrap
弹性容器为 多行
wrap-reverse
wrap 相同。

对于不是 wrap-reverse 的值, 交叉起始 方向等同于当前 内联起始块起始 方向(取决于哪个在 交叉轴 中), 交叉结束 方向与 交叉起始 方向相反。 当 flex-wrapwrap-reverse 时, 交叉起始交叉结束 方向将被交换。

5.3. 弹性方向和换行:flex-flow 速记属性

名称: flex-flow
值: <‘flex-direction’> || <‘flex-wrap’>
初始值: 参见各个属性
适用于: 参见各个属性
继承: 参见各个属性
百分比: 参见各个属性
计算值: 参见各个属性
动画类型: 离散
规范顺序: 按语法

flex-flow 属性是用于设置 flex-directionflex-wrap 的速记属性, 它们共同定义了弹性容器的主轴和交叉轴。

以下是在英语 (从左到右的水平书写模式)文档中的一些有效流动的示例:
div { flex-flow: row; }
/* 初始值。主轴为内联方向,无换行。
   (项目将要么缩小以适应,要么溢出。) */
div { flex-flow: column wrap; }
/* 主轴为块方向(从上到下)
   并且行在内联方向(向右)换行。 */
div { flex-flow: row-reverse wrap-reverse; }
/* 主轴与内联方向相反
   (从右到左)。新行向上换行。 */
请注意,flex-flow 方向与 书写模式 有关。 例如在垂直日语中, row 弹性容器会从上到下布局其内容, 如下例所示:
英语 日语
flex-flow: row wrap;        
writing-mode: horizontal-tb;
flex-flow: row wrap;        
writing-mode: vertical-rl;

5.4. 显示顺序:order 属性

弹性项目 默认情况下按照它们在源文档中的出现顺序显示和布局。 可以使用 order 属性更改此顺序。

名称: order
值: <integer>
初始值: 0
适用于: 弹性项目
继承:
百分比: 不适用
计算值: 指定的整数
规范顺序: 按语法
动画类型: 按计算值类型

order 属性控制 弹性项目在弹性容器中的显示顺序, 通过将它们分配到不同的序号组。 它接受一个 <integer> 值, 指定弹性项目所属的序号组。

弹性容器按照 修改后的文档顺序 布局其内容, 从最低的序号组开始依次排列。 具有相同序号组的项目按照它们在源文档中的出现顺序布局。 这也影响 绘制顺序 [CSS21], 正如弹性项目在源文档中重新排序一样。 弹性容器的绝对定位子项目视为具有 order: 0, 用于确定它们相对于弹性项目的绘制顺序。

以下图示展示了一个简单的标签界面, 其中活动面板的标签始终显示在最前:

可以使用以下 CSS 来实现(仅展示相关代码):

.tabs {
  display: flex;
}
.tabs > .current {
  order: -1; /* 低于默认值 0 */
}

除非未来的规范另有规定, 否则该属性对非弹性项目的盒子没有影响。

5.4.1. 重新排序和可访问性

order 属性影响非视觉媒体中的排序 (如语音)。 同样,order 也不会影响 顺序导航模式的默认遍历顺序 (例如通过链接循环,参见 tabindex [HTML])。

作者必须仅将order 用于视觉内容的重新排序,而不是逻辑排序。 使用 order 进行逻辑重排的样式表是非合规的。

注意: 这样做是为了使非视觉媒体和非 CSS 用户代理 (通常线性地呈现内容), 可以依赖于逻辑的源顺序, 而 order 用于调整视觉顺序。 (由于视觉感知是二维的且非线性的, 所以所需的视觉顺序并不总是逻辑的。)

许多网页在标记中具有类似的形状, 顶部有一个标题, 底部有一个页脚, 然后中间是内容区域和一个或两个附加列。 通常, 希望内容在页面的源代码中排在附加列之前。 然而,这使得许多常见设计, 如简单地将附加列放在左侧而内容区域放在右侧, 变得难以实现。 多年来,这个问题通过许多方式得到解决, 通常在有两个附加列时被称为“圣杯布局”。order 使这个问题变得非常简单。 例如,以下是一个页面代码和期望布局的示意图:
<!DOCTYPE html>
<header>...</header>
<main>
   <article>...</article>
   <nav>...</nav>
   <aside>...</aside>
</main>
<footer>...</footer>
在此页面中,header 位于顶部,footer 位于底部,但 article 位于中心,右侧是 nav,左侧是 aside。

这个布局可以通过弹性布局轻松实现:

main { display: flex; }
main > article { order: 2; min-width: 12em; flex:1; }
main > nav     { order: 1; width: 200px; }
main > aside   { order: 3; width: 200px; }

额外的好处是, 所有列默认都是等高的, 并且主内容会根据需要扩展至填满屏幕。 此外, 还可以将其与媒体查询结合使用,在狭窄的屏幕上切换为全垂直布局:

@media all and (max-width: 600px) {
  /* 过于狭窄,无法支持三列布局 */
  main { flex-flow: column; }
  main > article, main > nav, main > aside {
    /* 将它们恢复到文档顺序 */
    order: 0; width: auto;
  }
}

(进一步使用多行弹性容器来实现更智能的包装,留给读者作为练习。)

为了在所有展示模式下保留作者的预期顺序, 作者工具(包括所见即所得编辑器以及基于 Web 的创作工具)必须重新排列底层文档源代码 并且不能使用 order 进行重新排序 除非作者明确指出底层 文档顺序(决定语音和导航顺序)应与视觉顺序不同步

例如,一个工具可以提供拖放式 弹性项目的重新排序 以及针对不同屏幕尺寸范围的媒体查询处理。

由于大多数情况下,重新排序应影响所有屏幕范围 以及导航和语音顺序, 因此工具应在 DOM 层进行拖放式重新排序。 然而,在某些情况下,作者可能希望在每个屏幕尺寸上有不同的视觉顺序。 该工具可以通过使用order结合媒体查询提供此功能, 但也将最小屏幕尺寸的排序与底层 DOM 顺序关联 (因为这最有可能是一个逻辑线性呈现顺序) 同时在其他尺寸范围内使用order确定视觉展示顺序。

此工具是符合规范的,而仅使用order来处理 拖放式重新排序的工具 (尽管从实现的角度来看这可能很方便) 则不符合规范。

注意: 用户代理,包括浏览器、辅助技术和 扩展, 可能提供空间导航功能。 本节不排除在确定这些空间导航模式中的元素顺序时尊重 order 属性; 实际上,为了使这样的功能正常工作,它是需要考虑的。 但是 order 并不是此类空间导航功能需要考虑的唯一(或主要)CSS 属性。 一个良好实现的空间导航功能需要考虑 所有修改空间关系的 CSS 布局特性。

6. 弹性行

弹性项目 在一个 弹性容器 中进行布局和对齐, 它们位于 弹性行 中,这些是假想的容器,用于由布局算法进行分组和对齐。 弹性容器可以是 单行多行, 这取决于 flex-wrap 属性:

这个例子展示了四个按钮,它们无法水平并排放置, 因此会换行到多行中。
#flex {
  display: flex;
  flex-flow: row wrap;
  width: 300px;
}
.item {
  width: 80px;
}
<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-contentalign-self 属性仅考虑每次一行中的项目。

在一个 多行弹性容器 中(即使只有一行), 每一行的 交叉尺寸 是容纳该行中 弹性项目 的最小尺寸 (在 align-self 对齐后), 并且这些行会根据 align-content 属性在弹性容器内对齐。 在一个 单行 弹性容器 中, 该行的 交叉尺寸 是弹性容器的 交叉尺寸, 并且 align-content 没有影响。 该行的 主尺寸 总是与弹性容器内容框的 主尺寸 相同。

这是与前一个相同的例子, 只是所有弹性项目都设置了 flex: auto。 第一行有 60px 的剩余空间, 所有项目的灵活性相同, 因此该行上的三个项目每个会获得 20px 的额外宽度, 最终每个宽度为 100px。 剩下的项目会位于自己的一行上, 并会延展到整行的宽度,即 300px。
上述内容的渲染, 但所有项目都设置了 flex: auto

7. 灵活性

弹性布局的定义特性是使 弹性项目“弹性化”, 调整它们的宽度/高度以填充 主轴 中的可用空间。 这是通过 flex 属性来完成的。 一个弹性容器会将可用空间分配给它的项目(按其 弹性增长因子 的比例), 或者缩小它们(按其 弹性收缩因子 的比例)以防止溢出。

如果 弹性项目flex-growflex-shrink 值都为零, 则它是 完全不可伸缩的, 否则是 可伸缩的

7.1. flex 简写

名称: flex
值: none | [ <‘flex-grow’> <‘flex-shrink’>? || <‘flex-basis’> ]
初始值: 0 1 auto
适用于: 弹性项目
继承: no
百分比: 参见各个属性
计算值: 参见各个属性
动画类型: 按计算值类型
规范顺序: 按语法

flex 属性指定了 弹性长度 的组成部分: 包括 弹性因子增长收缩) 以及 弹性基准。 当一个框是 弹性项目 时,会使用 flex 来代替 主尺寸属性 来确定该框的 主尺寸。 如果一个框不是 弹性项目flex 则不起作用。

<‘flex-grow’>
<number> 组件设置 flex-grow 长写形式并指定 弹性增长因子, 它决定了当分配正的可用空间时,弹性项目 将相对于同容器中的其他 弹性项目 增长的程度。 如果省略,则设置为 1
0 和 1 之间的弹性值有一些特殊的行为:当行内弹性值总和小于 1 时,它们将占据少于 100% 的可用空间。

项目的 flex-grow 值实际上是对部分可用空间的请求,1 意味着“100% 的可用空间”;如果行内项目请求的总量超过 100%,则这些请求会被重新平衡,保持相同比例但正好使用 100% 的可用空间。然而,如果项目请求的总量少于全部空间(例如三个项目的 flex-grow: .25),那么每个项目会正好获得所请求的空间(每个获得 25% 的可用空间,最终剩余 25% 的空间未被使用)。详见 §9.7 解决弹性长度 了解可用空间的具体分配细节。

此模式是为了在 flex-grow 值接近零时实现连续的行为(意味着项目不希望占据任何可用空间)。没有此行为时,flex-grow: 1 项目将占据所有的可用空间;同样,flex-grow: 0.1flex-grow: 0.01 项目也是如此,直到最终值小到下溢为零,项目突然不占据任何可用空间。通过这种行为,项目会随着 flex-grow 值小于 1 时逐渐占据更少的可用空间,平滑地过渡到不占据任何可用空间的状态。

除非 明确 希望实现这种“部分填充”行为,否则作者应坚持使用 ≥ 1 的值;例如,使用 12 通常比使用 .33.67 更好,因为这样在项目被添加、删除或换行时,它们更可能按预期工作。

<‘flex-shrink’>
<number> 组件设置 flex-shrink 长写形式并指定 弹性收缩因子, 它决定了当分配负的可用空间时,弹性项目 相对于同容器中的其他 弹性项目 收缩的程度。 如果省略,则设置为 1

注意: 弹性收缩因子会与 弹性基准大小 相乘来分配负的空间。这样,较小的项目不会在较大的项目显著缩小之前就缩小到零。

<‘flex-basis’>
该组件设置 flex-basis 长写形式, 指定 弹性基准: 在根据弹性因子分配可用空间之前,弹性项目 的初始 主尺寸

<‘flex-basis’> 接受与 widthheight 属性相同的值(除了 auto 被视为不同),加上 content 关键字:

auto
当在 弹性项目 上指定时,auto 关键字会检索 主尺寸属性 的值作为使用的 flex-basis。 如果该值本身为 auto,则使用的值为 content
content
表示基于 弹性项目 内容的 自动尺寸。 (它通常等效于 最大内容尺寸,但会调整以处理纵横比、固有大小约束和正交流;详见 详情§9 弹性布局算法 中。)

注意: 该值在弹性盒布局的初始版本中不存在,因此一些旧的实现可能不支持它。等效效果可以通过使用 auto 并将主尺寸(widthheight)设置为 auto 来实现。

<‘width’>
对于所有其他值,flex-basis 解析方式与 widthheight 相同。

当省略 flex 简写时,其指定值为 0

none
关键字 none 展开为 0 0 auto
该图显示了“绝对”弹性(从零基准开始)和“相对”弹性(从项目的内容大小基准开始)之间的区别。这三个项目的弹性因子分别为 112:注意弹性因子为 2 的项目增长速度是其他项目的两倍。

flex 组件的初始值相当于 flex: 0 1 auto

注意: flex-growflex-basis 的初始值与它们在省略 flex 简写时的默认值不同。这样做是为了让 flex 简写更好地适应最 常见情况

如果一个无单位的零前面没有两个弹性因子,则必须将其解释为弹性因子。为了避免误解或无效声明,作者必须为零的 <‘flex-basis’> 组件指定一个单位,或在其前面加上两个弹性因子。

7.1.1. 基本 flex

本节为信息性内容。

下面的列表总结了四种 flex 值的效果, 它们代表了大多数常见的需求:

flex: initial
等效于 flex: 0 1 auto。(这是初始值。) 基于 width/height 属性调整项目的大小。 (如果项目的 主尺寸属性 计算为 auto, 这将根据项目内容调整弹性项目的大小。) 当有正的可用空间时,使弹性项目不可伸展, 但当空间不足时允许它收缩到最小尺寸。 可以使用 对齐能力auto margin 沿 主轴 对齐弹性项目。
flex: auto
等效于 flex: 1 1 auto。 基于 width/height 属性调整项目的大小, 但使它们完全灵活,这样它们就可以吸收沿 主轴 的任何可用空间。 如果所有项目要么是 flex: auto,要么是 flex: initialflex: none, 则在项目调整大小后,任何正的可用空间将平均分配给使用 flex: auto 的项目。
flex: none
等效于 flex: 0 0 auto。 该值根据 width/height 属性调整项目的大小, 但使弹性项目 完全不可伸缩。 这类似于 initial, 不同之处在于弹性项目即使在溢出情况下也不允许收缩。
flex: <positive-number>
等效于 flex: <positive-number> 1 0。 使弹性项目灵活并将 弹性基准 设置为零, 这样项目将获得弹性容器中可用空间的指定比例。 如果弹性容器中的所有项目都使用此模式, 它们的大小将与指定的弹性因子成比例。

默认情况下,弹性项目不会收缩到小于其最小内容大小(最长单词或固定大小元素的长度)。 要更改此设置,请设置 min-widthmin-height 属性。 (请参阅 §4.5 弹性项目的自动最小大小。)

7.2. 灵活性的组成部分

可以通过独立的长写属性来控制灵活性的各个组件。

建议作者使用 flex 简写来控制灵活性, 而不是直接使用其长写属性, 因为简写会正确重置任何未指定的组件, 以适应 常见用法

7.2.1. flex-grow 属性

名称: flex-grow
值: <number>
初始值: 0
适用于: 弹性项目
继承性:
百分比: 不适用
计算值: 指定的数字
规范顺序: 按照语法
动画类型: 按计算值类型

建议作者使用 flex 简写 来控制灵活性,而不是直接使用 flex-grow, 因为简写可以正确重置未指定的组件,以适应 常见用途

flex-grow 属性将 弹性增长因子 设置为提供的 <number>。 负数是无效的。

7.2.2. flex-shrink 属性

名称: flex-shrink
值: <number>
初始值: 1
适用于: 弹性项目
继承性:
百分比: 不适用
计算值: 指定值
规范顺序: 按照语法
动画类型: 数字

建议作者使用 flex 简写 来控制灵活性,而不是直接使用 flex-shrink, 因为简写可以正确重置未指定的组件,以适应 常见用途

flex-shrink 属性将 弹性收缩因子 设置为 提供的 <number>。 负数是无效的。

7.2.3. flex-basis 属性

名称: flex-basis
值: content | <‘width’>
初始值: auto
适用于: 弹性项目
继承性:
百分比: 相对于 弹性容器 内部的 主尺寸
计算值: 指定的关键字或计算后的 <length-percentage>
规范顺序: 按照语法
动画类型: 按计算值类型

建议作者使用 flex 简写 来控制灵活性,而不是直接使用 flex-basis, 因为简写可以正确重置未指定的组件,以适应 常见用途

flex-basis 属性设置 弹性基础值。 它接受与 widthheight 属性相同的值, 另外还有 content

对于 autocontent(在上文中定义)以外的所有值, flex-basis 的解析方式与水平方向的 width 相同 [CSS21], 除非该值会解析为 auto, 在这种情况下,它将解析为 content

例如,flex-basis 的百分比值是根据弹性项目的包含块(即其 弹性容器)来解析的; 如果该包含块的大小是 不确定的, 则用于 flex-basis 的值是 content。 作为另一个推论,flex-basis 决定内容框的大小, 除非另有规定, 例如通过 box-sizing [CSS3UI]

8. 对齐

当弹性容器的内容完成弹性调整后,所有弹性项目的尺寸已最终确定, 它们可以在弹性容器内对齐。

margin 属性可以用来对齐项目, 类似于块布局中的边距对齐,但功能更强大。弹性项目 还遵循 CSS Box Alignment 中的对齐属性, 这些属性允许通过关键字轻松地在 主轴交叉轴 上对齐项目。 这些属性使许多常见的对齐类型变得非常简单, 包括一些在 CSS 2.1 中非常困难的对齐方式,比如水平和垂直居中。

注意: 虽然对齐属性是在 CSS Box Alignment 中定义的 [CSS-ALIGN-3], 弹性盒布局在此重现了相关的定义, 以避免创建可能延缓规范进展的规范性依赖。 这些属性仅适用于弹性布局, 直到 CSS Box Alignment Level 3 完成, 并定义它们对其他布局模式的影响。 此外,Box Alignment 模块中定义的任何新值将适用于弹性盒布局; 换句话说,Box Alignment 模块一旦完成, 将取代这里的定义。

8.1. 使用 auto 边距对齐

本节为非规范性内容。 关于边距如何影响弹性项目的规范定义在 弹性布局算法 部分。

弹性项目上的 auto 边距的效果与块流中的 auto 边距非常相似:

注意: 如果空闲空间被分配给 auto 边距, 那么对齐属性在该维度上将不起作用, 因为边距将占据弹性调整后剩余的所有空闲空间。

在主轴上使用 auto 边距的一个用途是将弹性项目分为不同的“组”。 下面的例子展示了如何使用此功能来再现一个常见的 UI 模式 - 一个包含多个操作的单行栏,其中一些操作对齐在左侧,另一些操作对齐在右侧。
下面代码的示例渲染。
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> 
        
下图说明了在溢出情况下使用 auto 边距 和使用 对齐属性 的交叉轴对齐方式的差异。
关于
专制主义
博客
关于
专制主义
博客
左图中的项目使用边距居中, 而右图中的项目使用 align-self 居中。 如果将此列弹性容器放置在页面左侧, 边距行为将更为理想, 因为长项目将完全可读。 在其他情况下, 真正的居中行为可能会更好。

8.2. 轴对齐:justify-content 属性

名称: justify-content
值: flex-start | flex-end | center | space-between | space-around
初始值: flex-start
适用范围: 弹性容器
是否继承:
百分比: n/a
计算值: 指定的关键字
规范顺序: 按语法
动画类型: 离散

justify-content 属性沿着 主轴 对当前弹性容器行中的 弹性项目 进行对齐。 这是在解决任何弹性长度和 auto 边距 之后完成的。 通常,它有助于分配剩余的空闲空间, 例如当行中的所有 弹性项目 都是不可弹性, 或者它们是弹性的但已达到最大尺寸。 它还对项目在行溢出的情况下的对齐方式施加一些控制。

flex-start
弹性项目 会朝行的起始方向排列。 第一个 弹性项目主轴起点 边距紧贴行的 主轴起点 边缘, 每个后续的 弹性项目 都紧贴在前一个项目之后。
flex-end
弹性项目 会朝行的末尾方向排列。 最后一个 弹性项目主轴终点 边距紧贴行的 主轴终点 边缘, 每个前一个 弹性项目 都紧贴后一个项目。
center
弹性项目 会朝行的中心排列。 行中的 弹性项目 紧贴排列, 并居中对齐, 在行的 主轴起点 边缘与行上的第一个项目之间, 以及行的 主轴终点 边缘与行上的最后一个项目之间留有相等的空间。 (如果剩余的空闲空间为负数, 则 弹性项目 将在两个方向上均匀溢出。)
space-between
弹性项目 会均匀分布在行中。 如果剩余的空闲空间为负数或行中只有一个 弹性项目, 则此值与 flex-start 相同。 否则, 行上的第一个 弹性项目主轴起点 边距紧贴行的 主轴起点 边缘, 最后一个 弹性项目主轴终点 边距紧贴行的 主轴终点 边缘, 行上的其他 弹性项目 均匀分布, 相邻项目之间的间距相同。
space-around
弹性项目 会均匀分布在行中, 两端留有半个尺寸的空间。 如果剩余的空闲空间为负数或行中只有一个 弹性项目, 则此值与 center 相同。 否则,行上的 弹性项目 均匀分布, 相邻 弹性项目 之间的间距相同, 第一个和最后一个 弹性项目弹性容器 边缘之间的间距是项目之间间距的一半。

五个 justify-content 关键字及其对包含三个彩色项目的弹性容器的影响示意图。

8.3. 交叉轴对齐:align-itemsalign-self 属性

名称: align-items
值: flex-start | flex-end | center | baseline | stretch
初始值: stretch
适用范围: 弹性容器
是否继承:
百分比: n/a
计算值: 指定的关键字
规范顺序: 按语法
动画类型: 离散
名称: align-self
值: auto | flex-start | flex-end | center | baseline | stretch
初始值: auto
适用范围: 弹性项目
是否继承:
百分比: n/a
计算值: 指定的关键字
规范顺序: 按语法
动画类型: 离散

弹性项目 可以在当前弹性容器行的 交叉轴 上对齐, 类似于 justify-content,但在垂直方向上。align-items 为所有弹性容器的 项目 设置默认对齐方式, 包括匿名的 弹性项目align-self 允许为单个 弹性项目 覆盖此默认对齐方式。 (对于匿名弹性项目,align-self 始终匹配其相关弹性容器上的 align-items 值。)

如果 弹性项目 的任何交叉轴边距为 auto,则 align-self 无效。

各值含义如下:

auto
交叉轴 对齐控制 转移给父级框上的 align-items 值。 (这是 align-self 的初始值。)
flex-start
弹性项目交叉起点 边缘 放置于行的 交叉起点 边缘。
flex-end
弹性项目交叉终点 边缘 放置于行的 交叉终点 边缘。
center
弹性项目 的边距框在行内的 交叉轴 上居中。 (如果弹性行的 交叉尺寸 小于 弹性项目 的尺寸, 它会向两个方向溢出。)
baseline
弹性项目 参与基线对齐: 行上所有参与对齐的 弹性项目 都会对齐基线, 并且基线与 交叉起点 边缘之间距离最大的项目 放置在行的 交叉起点 边缘。 如果项目在必要的轴上没有基线, 则会从该 弹性项目 的边框框中 合成 一个基线。
stretch
如果 交叉尺寸属性弹性项目 计算为 auto, 并且两个 交叉轴 边距均不为 auto, 则该 弹性项目 会被 拉伸。 其使用的值是使项目的 交叉尺寸 尽可能接近行的尺寸的长度, 同时仍尊重 最小高度最小宽度最大高度最大宽度 等约束。

注意: 如果弹性容器的高度受到约束, 则此值可能会导致 弹性项目 的内容溢出该项目。

交叉起点 边缘 的 弹性项目 被放置在 行的 交叉起点 边缘。

五个 align-items 关键字及其对包含四个彩色项目的弹性容器的影响示意图。

8.4. 在 Flex 行中打包:align-content 属性

名称: align-content
值: flex-start | flex-end | center | space-between | space-around | stretch
初始值: stretch
应用于: 多行 flex 容器
是否继承:
百分比: 不适用
计算值: 指定的关键字
规范顺序: 按语法规则
动画类型: 离散型

align-content 属性用于在 flex 容器中对齐其行 ,当在 交叉轴中有多余空间时起作用,类似于 justify-content 在主轴上对齐 flex 项的作用。此属性对单行 flex 容器 无效。含义如下:

flex-start
各行向 flex 容器的起始方向打包。 第一行的 cross-start 边缘与 flex 容器的 cross-start 边缘对齐,每个后续行与前一行对齐。
flex-end
各行向 flex 容器的末尾方向打包。 最后一行的 cross-end 边缘与 flex 容器的 cross-end 边缘对齐,每个前一行与后一行对齐。
center
各行向 flex 容器的中央打包。各行在 flex 容器中彼此对齐,并居中排列。cross-start 内容边缘与第一行之间,以及 cross-end 内容边缘与最后一行之间的空隙相等。(如果剩余空间为负数,各行将会平均溢出两边。)
space-between
各行在 flex 容器中均匀分布。如果剩余空间为负数,或 flex 容器中只有一行 flex 行,此值等同于 flex-start。否则,第一行的 cross-start 边缘与 flex 容器的 cross-start 内容边缘对齐,最后一行的 cross-end 边缘与 flex 容器的 cross-end 内容边缘对齐,其余各行均匀分布。
space-around
各行在 flex 容器中均匀分布,两端留有半个空隙。如果剩余空间为负数,此值等同于 center。否则,各行均匀分布,相邻两行之间的空隙相等,第一行与最后一行与 flex 容器边缘的空隙为相邻行之间空隙的一半。
stretch
各行伸展以占据剩余空间。如果剩余空间为负数,此值等同于 flex-start。否则,剩余空间在所有行之间平均分配,增加其交叉尺寸。

注意: 只有 多行 flex 容器 才有交叉轴上的空余空间用于对齐各行,因为单行 flex 容器 的唯一一行会自动伸展以填充空间。

图解 align-content 关键字及其对 多行 flex 容器的效果。

8.5. Flex 容器的基线

为了使 flex 容器 自身 参与基线对齐(例如当 flex 容器 自身是外部 flex 容器 中的 flex 项时), 它需要提交最能代表其内容的基线位置。 为此,flex 容器的基线如下确定 (在使用 order 重新排序并考虑 flex-direction 之后):

第一个/最后一个 主轴基线集
内联轴flex 容器主轴 匹配时, 基线如下确定:
  1. 如果 flex 容器的最开始/最后一个 flex 行 上的任何 flex 项 参与基线对齐, 则 flex 容器的第一个/最后一个 主轴基线集 是从这些 flex 项 的共享 对齐基线 生成的

  2. 否则,如果 flex 容器至少有一个 flex 项, 则 flex 容器的第一个/最后一个 主轴基线集 是从最开始/最后一个 flex 项对齐基线 生成的。 (如果该项没有与 flex 容器 主轴 平行的 对齐基线, 则首先根据其边框边缘 合成一个基线。)

  3. 否则,flex 容器没有第一个/最后一个主轴 基线集, 如有需要,则根据其 对齐上下文 的规则 合成基线。

第一个/最后一个 交叉轴基线集
内联轴flex 容器交叉轴 匹配时, 基线如下确定:
  1. 如果 flex 容器至少有一个 flex 项, 则 flex 容器的第一个/最后一个 交叉轴基线集 是从最开始/最后一个 flex 项对齐基线 生成的。 (如果该项没有与 flex 容器 交叉轴 平行的 对齐基线, 则首先根据其边框边缘 合成一个基线。)

  2. 否则,flex 容器没有第一个/最后一个交叉轴 基线集, 如有需要,则根据其 对齐上下文 的规则 合成基线。

根据上述规则计算基线时, 如果提供基线的盒子的 overflow 值允许滚动, 则在确定其基线时,必须将该盒子视为处于初始滚动位置。

确定表格单元的基线 时, flex 容器提供的基线与行框或表行相同。 [CSS21]

有关基线的更多信息,请参见 CSS Writing Modes 3 §4.1 基线介绍CSS Box Alignment 3 §9 基线对齐细节

9. 弹性布局算法

本节包含规范算法,详细描述了弹性容器及其内容的确切布局行为。此处的算法旨在优化可读性和理论简洁性,可能不一定是最有效的实现方式。实现者可以使用任何实际的算法,但必须生成与此处描述的算法相同的结果。

注意:本节主要面向实现者。编写网页的作者通常可以通过个别属性描述获得帮助,除非他们对理解CSS布局的复杂细节有强烈的兴趣,否则不需要阅读本节内容。

以下部分定义了为弹性容器及其内容布局的算法。

注意:弹性布局根据弹性项目顺序修改文档顺序工作,而不是它们的原始文档顺序。

9.1. 初始设置

  1. 生成匿名弹性项目,如§4 弹性项目中所述。

9.2. 行长度确定

  1. 确定弹性项目的可用主轴和交叉轴空间。对于每个维度, 如果该维度的弹性容器的内容框是确定大小,则使用该值; 如果该维度的弹性容器最小内容约束最大内容约束下被调整大小,则该维度的可用空间是该约束; 否则,从该维度中为弹性容器提供的可用空间中减去弹性容器的外边距、边框和填充,并使用该值。这可能导致一个无限值。

    例如,浮动弹性容器中的弹性项目的可用空间为:

    • 弹性容器的包含块宽度减去弹性容器的外边距、边框和填充的水平维度
    • 垂直维度为无限大
  2. 确定每个项目的弹性基础大小假设主尺寸
    1. 如果项目具有确定的使用的弹性基础,则该值即为弹性基础大小。
    2. 如果弹性项目具有... 那么弹性基础大小根据其内部交叉尺寸弹性项目的固有纵横比计算。
    3. 如果使用的flex basiscontent或取决于其可用空间,并且弹性容器正在最小或最大内容约束下调整大小(例如执行自动表布局[CSS21]), 则根据该约束调整项目大小。弹性基础大小是项目的主尺寸
    4. 否则, 如果使用的flex basiscontent或取决于其可用空间,可用的主尺寸是无限的,并且弹性项目的内联轴与主轴平行,按正交流中盒子的规则[CSS3-WRITING-MODES]布局项目。 弹性基础大小是项目的最大内容主尺寸

      注意:例如,在包含垂直日文(垂直书写模式弹性项目的列弹性容器的英文文档(水平书写模式)中,可能会发生这种情况。

    5. 否则, 使用其使用的flex basis代替其主尺寸,将项目调整为可用空间,将content值视为max-content。 如果需要交叉尺寸来确定主尺寸(例如,当弹性项目主尺寸在其块轴中时),并且弹性项目的交叉尺寸为auto且不是确定的, 则在此计算中使用fit-content作为弹性项目交叉尺寸弹性基础大小是项目的结果主尺寸

    在确定弹性基础大小时, 会忽略项目的最小和最大主尺寸 (不会发生任何限制操作)。 此外,在应用box-sizing时, 将内容框尺寸向下限制为零的大小计算也会被忽略。 (例如,一个指定大小为零、正填充,并且具有 box-sizing: border-box的项目将具有外部弹性基础大小为零——因此其内部 弹性基础大小将为负值。)

    假设主尺寸是项目的 弹性基础大小, 根据其使用的最小和最大 主尺寸进行限制(并将内容框尺寸限制为零)。

  3. 根据其参与的格式化上下文规则确定弹性容器的主尺寸。 在此计算中,弹性项目上的auto外边距视为0

9.3. 主尺寸确定

  1. 将弹性项目收集到弹性行中:
    • 如果弹性容器是单行的, 将所有弹性项目收集到一个弹性行中。
    • 否则,从第一个未收集的项目开始,一个接一个地收集连续的项目,直到第一次遇到下一个收集的项目无法放入弹性容器的内部主尺寸(或遇到强制换行,请参见第10节 弹性布局的分片)。如果第一个未收集的项目不能适应,只收集它到行中。

      在此步骤中,弹性项目的大小是其外部假设主尺寸(注:这可能是负数。)

      重复直到所有弹性项目都被收集到弹性行中。

      请注意,“收集尽可能多的项目”这一行将会把零大小的弹性项目收集到前一行的末尾,即使最后一个非零项目完全“填满”了这一行。

  2. 解决所有弹性项目的弹性长度,以找到它们的使用主尺寸。参见第9.7节 解决弹性长度

9.4. 副尺寸确定

  1. 通过使用主尺寸和可用空间来确定每个项目的假设副尺寸,将自动视为fit-content
  2. 计算每个弹性行的副尺寸。

    如果弹性容器是单行的,并且具有明确的副尺寸,则弹性行的副尺寸是弹性容器的内部副尺寸

    否则,对于每个弹性行:

    1. 收集所有其内联轴与主轴平行、其align-self属性为基线,且其副轴边距均为非自动的弹性项目。找到每个项目的基线与其假设的外部副轴起始边缘之间的最大距离,以及每个项目的基线与其假设的外部副轴结束边缘之间的最大距离,并将这两个值相加。
    2. 在上一步未收集的所有项目中,找到最大的外部假设副尺寸
    3. 弹性行的实际使用副尺寸是前两步找到的最大数值和零之间的较大值。

      如果弹性容器是单行的,则将该行的副尺寸限制在容器的计算最小值和最大副尺寸之间。请注意,如果CSS 2.1的最小/最大宽度/高度定义更普遍适用,则此行为将自动产生。

  3. 处理'align-content: stretch'。如果弹性容器具有明确的副尺寸,align-contentstretch,并且弹性行的副尺寸总和小于弹性容器的内部副尺寸,则通过增加每个弹性行的副尺寸,使它们的总和正好等于弹性容器的内部副尺寸。
  4. 折叠visibility:collapse的项目。如果有弹性项目具有visibility: collapse,请记录它们所在行的副尺寸作为该项目的支柱尺寸,并从头开始重新布局。

    在第二次布局中,当将项目收集到行中时,将折叠的项目视为具有零主尺寸。在接下来的算法步骤中,完全忽略这些折叠的项目(就像它们是display:none一样),但在计算行的副尺寸之后,如果任何行的副尺寸小于该行中所有折叠项目的最大支柱尺寸,则将该行的副尺寸设置为该支柱尺寸

    跳过第二次布局中的此步骤。

  5. 确定每个弹性项目的实际使用副尺寸。如果一个弹性项目的align-self: stretch,其计算的副尺寸属性为自动,并且其副轴两侧的边距都不是自动,则使用的外部副尺寸为该弹性行的使用副尺寸,根据该项目的最小和最大副尺寸进行限制。 否则,使用的副尺寸是该项目的假设副尺寸

    如果弹性项目的align-self: stretch,则为其内容重新布局,视该使用尺寸为其确定的副尺寸,以便可以解析百分比大小的子元素。

    请注意,此步骤不会影响弹性项目的主尺寸,即使它具有固有的宽高比。

9.5. 主轴对齐

  1. 分配剩余的可用空间。 对于每个弹性行:
    1. 如果剩余的可用空间为正值,并且该行上至少有一个主轴边距是自动,则将可用空间均匀分配给这些边距。否则,将所有自动边距设置为零。
    2. 根据justify-content沿主轴对齐项目。

9.6. 副轴对齐

  1. 解决副轴上的自动边距。 如果弹性项目具有自动副轴边距:
    • 如果其外部副尺寸(将这些自动边距视为零)小于其弹性行的副尺寸,则将这些尺寸的差额均匀分配给自动边距。
    • 否则,如果块起始内联起始边距(无论哪个在副轴上)是自动,则将其设置为零。设置相对的边距,使该项目的外部副尺寸等于其弹性行的副尺寸。
  2. 根据align-self沿副轴对齐所有弹性项目,如果项目的副轴边距均不是自动
  3. 确定弹性容器的使用副尺寸:
    • 如果副尺寸属性是明确的尺寸,则使用该尺寸,并根据弹性容器的使用最小和最大副尺寸进行限制。
    • 否则,使用弹性行的副尺寸总和,并根据弹性容器的使用最小和最大副尺寸进行限制。
  4. 根据align-content对齐所有弹性行

9.7. 解决弹性长度

要解决弹性行中项目的弹性长度:

  1. 确定使用的弹性因子。 将行上所有项目的外部假设主尺寸相加。如果总和小于弹性容器的内部主尺寸,则在本算法中使用弹性增长因子;否则,使用弹性收缩因子。
  2. 调整非弹性项目的大小。 冻结,将其目标主尺寸设置为其假设主尺寸...
  3. 计算初始可用空间 将行上所有项目的外部尺寸相加,并从弹性容器的内部主尺寸中减去。对于冻结的项目,使用它们的外部目标主尺寸;对于其他项目,使用它们的外部弹性基准尺寸
  4. 循环:
    1. 检查弹性项目。 如果行上的所有弹性项目都已冻结,则可用空间已分配完毕;退出此循环。
    2. 如上所述,计算剩余可用空间 如果未冻结的弹性项目的弹性因子总和小于1,将初始可用空间乘以此总和。如果该值的大小小于剩余可用空间的大小,则使用此值作为剩余可用空间
    3. 按弹性因子分配可用空间。
      如果剩余可用空间为零
      不做任何操作。
      如果使用弹性增长因子
      找出项目的弹性增长因子与所有未冻结项目的弹性增长因子总和的比率。将项目的目标主尺寸设置为其弹性基准尺寸加上按比率分配的剩余可用空间的一部分。
      如果使用弹性收缩因子
      对于行上所有未冻结的项目,将其弹性收缩因子乘以其内部弹性基准尺寸,并将此值记为其缩放弹性收缩因子。找出项目的缩放弹性收缩因子与所有未冻结项目的缩放弹性收缩因子总和的比率。将项目的目标主尺寸设置为其弹性基准尺寸减去按比率分配的剩余可用空间的绝对值的一部分。注意,这可能导致内部主尺寸为负值;将在下一步中修正。
      否则
      不做任何操作。
    4. 修复最小/最大限制的违规情况。 将每个未冻结项目的目标主尺寸限制在其使用的最小和最大主尺寸范围内,并将其内容框大小限制为不小于零。如果项目的目标主尺寸变小,则是最大值违规。如果项目的目标主尺寸变大,则是最小值违规。
    5. 冻结过度调整的项目。 总违规量是上一步调整的总和∑(限制后的大小 - 未限制的大小)。如果总违规量为:
      冻结所有项目。
      正值
      冻结所有最小值违规的项目。
      负值
      冻结所有最大值违规的项目。
    6. 返回到此循环的开头。
  5. 将每个项目的使用主尺寸设置为其目标主尺寸

9.8. 确定和不确定的尺寸

尽管 CSS 尺寸 [CSS-SIZING-3] 定义了确定的不确定的长度,Flexbox 有一些额外的情况,使得一个长度可以被视为确定的

  1. 如果一个单行弹性容器有一个确定的副尺寸,任何拉伸的弹性项目的外部副尺寸是弹性容器的内部副尺寸(限制在该弹性项目的最小和最大副尺寸范围内),并被视为确定的
  2. 如果弹性容器有一个确定的主尺寸,一个弹性项目的弹性调整后的主尺寸也被视为确定的,即使它依赖于同一行中任何弹性项目的不确定尺寸。
  3. 一旦弹性行的副尺寸确定,对于布局目的,自动大小的弹性容器中的项目也被视为确定的;参见步骤11

注意:具有确定的弹性基准尺寸完全非弹性项目的主尺寸,根据定义,是确定的

9.9. 固有尺寸

固有尺寸用于生成基于内容的各种自动尺寸,比如收缩适合的逻辑宽度(使用fit-content公式)和基于内容的逻辑高度(使用最大内容尺寸)。

请参见[CSS-SIZING-3],以获取本节中术语的定义。

9.9.1. 弹性容器的固有主尺寸

最大内容主尺寸弹性容器可以采用的最小尺寸,同时保持其最大内容贡献,在项目的灵活性允许范围内:

  1. 对于每个弹性项目,从其弹性基准尺寸中减去其最大内容贡献尺寸。如果结果为正,则除以其弹性增长因子(最小值为1);如果为负,则除以其缩放弹性收缩因子(将弹性收缩因子最小值设为1)。这是项目的最大内容弹性分数
  2. 将所有弹性项目放入无限长度的行中。
  3. 在每行内,找到所有弹性项目中最大的最大内容弹性分数。将每个项目的弹性基准尺寸与其弹性增长因子(如果选择的最大内容弹性分数为负,则为缩放弹性收缩因子)的乘积相加,然后将结果限制在最大主尺寸最小主尺寸之间。
  4. 弹性容器最大内容尺寸是所有项目在单行内计算出的尺寸的最大总和。

最小内容主尺寸单行弹性容器的计算方式与最大内容主尺寸相同,只是使用了最小内容贡献而非最大内容贡献。然而,对于多行容器,它仅是最小内容贡献中的最大值。

当弹性和的值小于1时,此算法的影响

上述算法旨在为两个特殊情况提供正确的行为,并在这两种情况之间转换时使得弹性容器的大小连续:

  1. 如果所有项目都是非弹性的,弹性容器的大小将调整为其弹性基准尺寸之和。(非弹性的弹性基准尺寸基本上取代了宽度/高度,而当指定时,它就是最大内容贡献在块布局中的基础。)

  2. 当所有项目的弹性因子≥ 1 时,弹性容器的大小将调整为其项目的最大内容贡献之和(或稍大的尺寸,使得每个弹性项目至少具有其最大内容贡献的大小,但也具有其尺寸与其他项目尺寸的正确比例,按照其弹性决定)。

例如,如果一个弹性容器有一个弹性项目,其flex-basis: 100px;,但最大内容尺寸为200px,则当该项目的flex-grow: 0时,弹性容器(以及弹性项目)的宽度为100px,但当该项目的flex-grow: 1或更高时,弹性容器(及弹性项目)的宽度为200px

有几种方法可以在这些两种情况之间实现整体行为的连续性,尤其是在一行上的弹性总和在0到1之间时,但所有方法都有其缺点。我们选择了一种我们认为影响最小的方法;不幸的是,当弹性总和小于1时,它会"重复应用"弹性。在上述示例中,如果项目的弹性增长: .5,则弹性容器的宽度最终为150px,但项目随后在可用空间中正常调整大小,最终宽度为125px

9.9.2. 弹性容器的固有副尺寸

最小内容/最大内容副尺寸单行弹性容器是其最小内容贡献/最大内容贡献(分别)的最大值。

对于多行弹性容器最小内容/最大内容副尺寸是根据在副轴方向上的最小内容约束/最大内容约束(分别)调整弹性容器大小后,所有弹性行副尺寸的总和。 然而,如果弹性容器flex-flow: column wrap;, 那么首先找到所有最小内容/最大内容副尺寸贡献中的最大值(分别),然后在布局期间将该尺寸作为每个弹性项目在副轴上的可用空间

注意:此用于 column wrap弹性容器的启发式方法提供了对弹性容器应该尺寸的合理近似,每个弹性项目最终为 min(项目自身的最大内容, 所有项目中的最大最小内容),且每个弹性行不大于其最大的弹性项目。 在某些情况下,它不是一个完美的匹配,但完全正确的处理是非常昂贵的,而这个方法表现得相当不错。

9.9.3. 弹性项目的固有尺寸贡献

最小内容贡献的主尺寸弹性项目是其外部最小内容尺寸和外部首选尺寸(适用时为其宽度高度)中较大的一个, 如果该值不是auto,则按其弹性基准尺寸作为最大值(如果不可增长)和/或作为最小值(如果不可收缩)进行限制,然后再进一步按其最小主尺寸/最大主尺寸进行限制。

最大内容贡献的主尺寸弹性项目是其外部最大内容尺寸和外部首选尺寸(适用时为其宽度高度)中较大的一个,按其弹性基准尺寸作为最大值(如果不可增长)和/或作为最小值(如果不可收缩)进行限制,然后再进一步按其最小主尺寸/最大主尺寸进行限制。

10. 分片弹性布局

弹性容器可以在页面间断开,断开位置可以在项目之间、项目的行之间(在多行模式下)以及项目内部。 break-*属性对弹性容器的应用与块级或内联级框相同。 本节定义了它们如何应用于弹性项目及其内容。 有关更多上下文,请参阅CSS 分片模块[CSS3-BREAK]

以下断开规则将分片容器称为“页面”。 同样的规则适用于任何其他分片上下文。 (根据需要,将“页面”替换为适当的分片容器类型。) 为了可读性,本节中的术语“行”和“列”指的是弹性容器相对于分片上下文的块流方向的相对方向,而不是相对于弹性容器本身。

在此级别的弹性盒布局中,未定义分片弹性容器的精确布局。 然而,弹性容器内部的断开遵循以下规则(使用修改后的文档顺序解释):

10.1. 示例弹性分片算法

本信息性部分展示了一个可能的弹性容器分片算法。 鼓励实现者改进该算法,并向CSS工作组提供反馈

该算法假设分页总是仅在前进方向上进行; 因此,在下面的算法中,分页前的大部分对齐都被忽略。 高级布局引擎可能能够在跨片段时保持对齐。

单行列弹性容器
  1. 运行弹性布局算法(不考虑分页) 直到副尺寸确定
  2. 布局尽可能多的连续弹性项目或项目片段 (至少一个或其片段), 从第一个开始, 直到页面没有更多空间 或遇到强制中断。
  3. 如果上一步耗尽了空间 且剩余空间为正, UA可以减少当前页面上的分配剩余空间 (减至零,但不超过), 以便为下一个不可断开的弹性项目或片段腾出空间。 否则, 不适合的项目或片段将被推到下一页。 如果剩余空间中有超过50%的片段可以放下, UA应当将其拉上,反之则推到下一页。
  4. 如果有任何弹性项目或片段未被上一步布局, 则重新运行弹性布局算法, 从行长度确定副尺寸确定, 使用下一页的大小和所有内容(包括已布局的内容), 并返回上一步, 但从第一个尚未布局的项目或片段开始。
  5. 对于每个弹性容器片段, 从主轴对齐继续弹性布局算法,直到完成。

本算法的目的是使列方向的单行弹性容器 分页行为与块流非常相似。 为测试该目的, 带有justify-content:start且没有弹性项目的弹性容器应当与 具有相同内容、相同已使用大小和相同已使用边距的块内流子元素的分页完全相同。

多行列弹性容器
  1. 运行弹性布局算法考虑分页 (将弹性容器的最大行长度限制为页面剩余空间) 直到副尺寸确定
  2. 布局尽可能多的弹性行 (至少一行), 直到弹性容器在副尺寸方向上没有更多空间 或遇到强制中断:
    1. 布局尽可能多的连续弹性项目 (至少一个), 从第一个开始, 直到页面没有更多空间 或遇到强制中断。 忽略弹性项目内部的强制中断。
    2. 如果这是第一个弹性容器片段, 该行仅包含一个比页面剩余空间大的弹性项目, 且弹性容器尚未位于页面顶部, 则将弹性容器移至下一页 并重新开始整个弹性容器布局。
    3. 如果第一步没有布局所有弹性项目, 则重新运行弹性布局算法, 从主尺寸确定副尺寸确定, 仅使用未布局的项目, 并返回上一步, 从第一个未布局的项目开始。
  3. 如果上一步没有布局所有弹性项目, 则重新运行弹性布局算法, 从行长度确定副尺寸确定, 使用下一页的大小和仅未布局的项目, 并返回上一步, 但从第一个未布局的项目开始。
  4. 对于每个弹性容器片段, 从主轴对齐继续弹性布局算法,直到完成。

如果一个弹性项目不能完全适应单个页面, 它将不会多行列弹性容器中分页。

单行行弹性容器
  1. 运行整个弹性布局算法(不考虑分页), 但将任何align-self值(非flex-startbaseline)视为flex-start
  2. 如果不可断开的项目不适合页面剩余空间, 且弹性容器未位于页面顶部, 则将弹性容器移至下一页 并重新开始整个弹性容器布局。
  3. 对于每个项目, 布局尽可能多的内容以适应页面剩余空间, 并将剩余内容分页到下一页, 重新运行弹性布局算法, 从行长度确定主轴对齐,适应新页面大小, 使用所有内容(包括已完成的项目)。

    任何完全适合先前片段的弹性项目 仍会在后续片段的主轴上占据空间。

  4. 对于每个弹性容器片段, 从副轴对齐继续运行弹性布局算法直到完成。 对于除第一个以外的所有片段, 将align-selfalign-content视为flex-start,适用于所有项目片段和行。
  5. 如果任何项目, 按照其原始align-self值对齐 适应所有弹性容器片段的组合副尺寸, 它可以被移入该片段并适当对齐。
多行行弹性容器
  1. 运行弹性布局算法(不考虑分页), 直到副尺寸确定
  2. 布局尽可能多的弹性行 (至少一行), 从第一行开始, 直到页面没有更多空间 或遇到强制中断。

    如果一行不适合页面, 且该行不位于页面顶部, 则将该行移至下一页 并重新启动弹性布局算法, 仅使用该行及之后的项目。

    如果弹性项目本身引起强制中断, 则重新运行弹性布局算法, 从主尺寸确定主轴对齐, 仅使用该行及之后的项目, 但自动在断行步骤中 使引起中断的项目开始新行, 然后继续此步骤。 忽略弹性项目内部的强制中断。

  3. 如果上一步没有布局所有弹性项目, 则重新运行弹性布局算法, 从行长度确定主轴对齐,适应下一页的大小, 并且仅针对未布局的项目。 返回上一步, 但从尚未布局的第一行开始。
  4. 对于每个弹性容器片段, 从副轴对齐继续运行弹性布局算法直到完成。

附录A:轴映射

本附录为非规范性内容。

针对ltr + horizontal-tb的轴映射 (例如英语)
flex-flow 主轴 起点 终点 交叉轴 起点 终点
+ nowrap/wrap 水平 垂直
行反转 + nowrap/wrap
+ wrap-reverse
行反转 + wrap-reverse
+ nowrap/wrap 垂直 水平
列反转 + nowrap/wrap
+ wrap-reverse
列反转 + wrap-reverse

致谢

感谢以下人员的反馈和贡献:

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.

更改

本节记录了自上次发布以来的更改。

自2017年10月16日CR版本以来的更改

还可以查看评论处理意见

自2016年5月26日CR版本以来的更改

还可以查看评论处理意见

实质性更改和错误修复

澄清

自2016年3月1日CR版本以来的更改

还可以查看评论处理意见

实质性更改和错误修复

澄清

自2015年5月14日 LCWD以来的更改

还提供了评论处理

实质性更改和错误修复

澄清

自2014年9月25日 LCWD 以来的更改

也提供了评论处理结果

实质性更改和错误修复

澄清

自 2014年3月25日以来的更改

也提供了 评论处理结果

实质性更改和错误修复

以下是自 2014年3月25日最后一次工作草案 以来的重大更改

澄清

以下是自 2014年3月25日最后一次工作草案 以来的重大更改

自 2012年9月18日候选推荐标准以来的更改

也提供了 评论处理结果

实质性更改和错误修复

以下是自 2012年9月18日候选推荐标准 以来的重大更改:

澄清

还进行了以下重要的澄清:

11. 隐私和安全考虑

Flexbox 没有引入新的隐私泄露或安全问题,除了“正确实现它”。

一致性

文档惯例

一致性要求通过描述性断言和 RFC 2119 术语的结合来表达。在本文件的规范部分中,关键字 “MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、“MAY” 和 “OPTIONAL” 应按照 RFC 2119 中的描述进行解释。然而,为了提高可读性,这些词在本规范中不会全部以大写字母形式出现。

本规范的所有文本都是规范性的,除非明确标记为非规范的部分、示例和注释。[RFC2119]

本规范中的示例以“例如”开头或通过 class="example" 与规范文本分开显示,例如:

这是一个信息性示例。

信息性注释以“注释”开头,并使用 class="note" 与规范文本分开显示,例如:

注释,这是一个信息性注释。

建议是规范部分,用于引起特别注意,并使用 <strong class="advisement"> 与其他规范文本分开显示,例如:用户代理必须提供一个可访问的替代方案。

一致性类别

本规范的一致性定义了三类一致性:

样式表
一个 CSS 样式表
渲染器
一个 用户代理,其解释样式表的语义并渲染使用这些样式表的文档。
创作工具
一个 用户代理,其编写样式表。

样式表符合本规范,如果其使用本模块中定义的语法的所有声明都根据通用 CSS 语法和本模块中每个特性的单个语法有效。

渲染器符合本规范,如果除了按照适当的规范解释样式表外,它还支持本规范中定义的所有特性,并通过正确解析它们并相应地渲染文档。然而,用户代理由于设备限制而无法正确渲染文档,不会使其不符合规范。(例如,用户代理不需要在单色显示器上渲染颜色。)

创作工具符合本规范,如果它编写的样式表根据通用 CSS 语法和本模块中每个特性的单个语法是语法正确的,并符合本模块中描述的样式表的所有其他一致性要求。

CSS 负责任实现的要求

以下部分定义了负责实现 CSS 的几个一致性要求,以促进当前和未来的互操作性。

部分实现

为了使作者能够利用向前兼容的解析规则分配回退值,CSS 渲染器 必须 将任何不支持的 at-rules、属性、属性值、关键字和其他语法结构视为无效(并根据需要忽略)。 特别是,用户代理 不得 在一个多值属性声明中选择性地忽略不支持的属性值并仅遵守支持的值:如果任何值被认为是无效的(因为不支持的值必须如此),CSS 要求整个声明被忽略。

不稳定和专有特性的实现

为了避免与未来稳定的 CSS 特性发生冲突,CSS 工作组建议遵循最佳实践来实现不稳定的特性和专有扩展到 CSS。

CR 级别特性的实现

一旦规范达到候选推荐阶段,实施者应发布任何 CR 级别特性的无前缀实现,并避免公开该特性的带前缀变体,前提是他们能够证明这些特性已根据规范正确实现。

为了建立并维护 CSS 实现的互操作性,CSS 工作组要求非实验性 CSS 渲染器在发布任何 CSS 特性的无前缀实现之前,向 W3C 提交实现报告(如果需要,还需提交用于该实现报告的测试用例)。提交给 W3C 的测试用例将由 CSS 工作组审查和修改。

有关提交测试用例和实现报告的更多信息,请访问 CSS 工作组的网站 http://www.w3.org/Style/CSS/Test/。如有问题,请联系 public-css-testsuite@w3.org 邮件列表。

CR 退出标准

为了将本规范推进到提议推荐阶段,必须有至少两个独立的、互操作的实现每个特性。每个特性可以由不同的产品集实现,不要求所有特性由单个产品实现。为了满足这一标准,我们定义了以下术语:

独立
每个实现必须由不同的组织开发,不能共享、重用或派生自另一个合格实现所使用的代码。与本规范的实现无关的代码部分不受此要求的限制。
互操作性
通过官方 CSS 测试套件中的相关测试用例,或如果实现不是 Web 浏览器,则通过等效测试来验证。每个相关测试在测试套件中都应有一个等效测试,如果要使用此类用户代理(UA)来声称互操作性,还必须有一个或多个其他 UA 也能够以相同方式通过这些等效测试,以实现互操作性。等效测试必须公开提供,以便同行评审。
实现
一个用户代理:
  1. 实现了规范。
  2. 对公众可用。实现可以是发布产品或其他公开可用的版本(例如测试版、预览版或“夜间构建”)。非发布产品版本必须至少实现该功能一个月,以证明其稳定性。
  3. 不是实验性的(即,专门设计用于通过测试套件且不打算用于正常使用的版本)。

本规范将至少保持六个月的候选推荐状态。

索引

本规范定义的术语

通过引用定义的术语

参考文献

规范性引用

[CSS-ALIGN-3]
Elika Etemad; Tab Atkins Jr.. CSS Box Alignment Module Level 3. 2018年8月30日. WD. URL: https://www.w3.org/TR/css-align-3/
[CSS-CASCADE-4]
Elika Etemad; Tab Atkins Jr.. CSS Cascading and Inheritance Level 4. 2018年8月28日. CR. URL: https://www.w3.org/TR/css-cascade-4/
[CSS-INLINE-3]
Dave Cramer; Elika Etemad; Steve Zilles. CSS Inline Layout Module Level 3. 2018年8月8日. WD. URL: https://www.w3.org/TR/css-inline-3/
[CSS-OVERFLOW-3]
David Baron; Elika Etemad; Florian Rivoal. CSS Overflow Module Level 3. 2018年7月31日. WD. URL: https://www.w3.org/TR/css-overflow-3/
[CSS-POSITION-3]
Rossen Atanassov; Arron Eicholz. CSS Positioned Layout Module Level 3. 2016年5月17日. WD. URL: https://www.w3.org/TR/css-position-3/
[CSS-PSEUDO-4]
Daniel Glazman; Elika Etemad; Alan Stearns. CSS Pseudo-Elements Module Level 4. 2016年6月7日. WD. URL: https://www.w3.org/TR/css-pseudo-4/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS Intrinsic & Extrinsic Sizing Module Level 3. 2018年3月4日. WD. URL: https://www.w3.org/TR/css-sizing-3/
[CSS-TEXT-3]
Elika Etemad; Koji Ishii. CSS Text Module Level 3. 2018年9月20日. WD. URL: https://www.w3.org/TR/css-text-3/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2018年8月14日. CR. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2018年10月10日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 2018年5月24日. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS21]
Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS2/
[CSS3-BREAK]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 3. 2017年2月9日. CR. URL: https://www.w3.org/TR/css-break-3/
[CSS3-DISPLAY]
Tab Atkins Jr.; Elika Etemad. CSS Display Module Level 3. 2018年8月28日. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS3-IMAGES]
Elika Etemad; Tab Atkins Jr.. CSS Image Values and Replaced Content Module Level 3. 2012年4月17日. CR. URL: https://www.w3.org/TR/css3-images/
[CSS3-WRITING-MODES]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 3. 2018年5月24日. CR. URL: https://www.w3.org/TR/css-writing-modes-3/
[CSSOM-1]
Simon Pieters; Glenn Adams. CSS Object Model (CSSOM). 2016年3月17日. WD. URL: https://www.w3.org/TR/cssom-1/
[RFC2119]
S. Bradner. 关键字用于在RFCs中指示要求级别. 1997年3月. 最佳当前实践. URL: https://tools.ietf.org/html/rfc2119

参考性引用

[CSS-TEXT-DECOR-3]
Elika Etemad; Koji Ishii. CSS Text Decoration Module Level 3. 2018年7月3日. CR. URL: https://www.w3.org/TR/css-text-decor-3/
[CSS3UI]
Tantek Çelik; Florian Rivoal. CSS Basic User Interface Module Level 3 (CSS3 UI). 2018年6月21日. REC. URL: https://www.w3.org/TR/css-ui-3/
[HTML]
Anne van Kesteren; et al. HTML Standard. 现行标准. URL: https://html.spec.whatwg.org/multipage/

属性索引

名称 初始值 应用于 继承 %值 动画类型 语法顺序 计算值
align-content flex-start | flex-end | center | space-between | space-around | stretch stretch 多行弹性容器 不适用 离散 依语法 指定关键字
align-items flex-start | flex-end | center | baseline | stretch stretch 弹性容器 不适用 离散 依语法 指定关键字
align-self auto | flex-start | flex-end | center | baseline | stretch auto 弹性项目 不适用 离散 依语法 指定关键字
flex none | [ <‘flex-grow’> <‘flex-shrink’>? || <‘flex-basis’> ] 0 1 auto 弹性项目 见各个属性 按计算值类型 依语法 见各个属性
flex-basis content | <‘width’> auto 弹性项目 相对于弹性容器的内部主尺寸 按计算值类型 依语法 指定关键字或计算的 <length-percentage> 值
flex-direction row | row-reverse | column | column-reverse row 弹性容器 不适用 离散 依语法 指定关键字
flex-flow <‘flex-direction’> || <‘flex-wrap’> 见各个属性 见各个属性 见各个属性 见各个属性 见各个属性 依语法 见各个属性
flex-grow <number> 0 弹性项目 不适用 按计算值类型 依语法 指定数字
flex-shrink <number> 1 弹性项目 不适用 数字 依语法 指定值
flex-wrap nowrap | wrap | wrap-reverse nowrap 弹性容器 不适用 离散 依语法 指定关键字
justify-content flex-start | flex-end | center | space-between | space-around flex-start 弹性容器 不适用 离散 依语法 指定关键字
order <integer> 0 弹性项目 不适用 按计算值类型 依语法 指定整数