CSS 盒子对齐模块第三级

W3C 工作草案,

更多文档详情
此版本:
https://www.w3.org/TR/2025/WD-css-align-3-20250311/
最新发布版本:
https://www.w3.org/TR/css-align-3/
编者草案:
https://drafts.csswg.org/css-align/
历史:
https://www.w3.org/standards/history/css-align-3/
反馈:
CSSWG Issues Repository
规范内问题索引
编者:
Elika J. Etemad / fantasai (Apple)
Tab Atkins Jr. (Google)
为此规范提出修改建议:
GitHub 编辑器

摘要

本模块包含了 CSS 中与各种 CSS 盒子布局模型(块级布局、表格布局、弹性布局和网格布局)中盒子在其容器内对齐相关的特性。(文本和行内级内容的对齐在 [CSS-TEXT-3][CSS-INLINE-3] 中定义。)

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

本文档状态

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

本文档由 CSS 工作组作为工作草案发布,采用推荐标准流程。 作为工作草案发布 并不意味着 W3C 及其成员的认可。

这是一份草案文件, 可能随时被其他文件更新、替换 或废弃。 将本文档作为正在进行的工作以外的任何形式引用都是不合适的。

请通过在 GitHub 上提交问题(首选)发送反馈, 并在标题中包含规范代码“css-align”,例如: “[css-align] …评论摘要…”。 所有问题和评论都会存档。 或者,反馈可以发送到(已存档的)公共邮件列表 www-style@w3.org

本文档受 2023 年 11 月 3 日 W3C 流程文档的约束。

本文档由一个在 W3C 专利政策下运作的小组制作。 W3C 维护一个与该小组交付成果相关的任何专利披露的公开列表; 该页面还包含披露专利的说明。 任何个人如果实际知晓某项专利,并认为该专利包含基本权利要求, 则必须根据 W3C 专利政策第 6 条披露该信息。

以下特性处于风险之中,并可能在 CR(候选推荐标准)阶段被删除:

“At-risk”(处于风险中)是 W3C 流程中的一个术语,并不一定意味着该特性有被删除或延迟的危险。它意味着工作组认为该特性可能难以按时实现互操作性,标记为此允许工作组在必要时,在过渡到提议推荐标准 (Proposed Rec) 阶段时删除该特性,而无需首先发布不包含该特性的新的候选推荐标准 (Candidate Rec)。

1. 引言

CSS 第 1 级和第 2 级允许通过 text-align 对齐文本,并通过平衡 auto 外边距来对齐块级元素。 然而,除了表格单元格之外, 垂直对齐是不可能的。 随着 CSS 增加更多功能, 在各个维度上对齐盒子的能力变得更加重要。 本模块试图创建一个内聚且通用的盒子对齐模型,以便在所有 CSS 中共享。

注意:文本和行内级内容的对齐在 [CSS-TEXT-3][CSS-INLINE-3] 中定义。

注意:本规范无意更改 CSS2.1 中定义的任何行为, 当此处定义的属性设置为其初始值时。 如果实现者或任何其他人注意到差异, 请将其作为错误报告给 CSSWG。

(以上)本节不具有规范性。

1.1. 模块交互

本模块为 [CSS2] 第 9 章第 10 章中描述的块布局模型添加了一些新的对齐功能,重新定义了如何解析过度约束的块级盒子外边距, 并定义了这些新的对齐属性 与使用 vertical-align 对齐表格单元格内容的交互, 如 [CSS2] 第 17 章所定义。

这些属性与 网格布局 [CSS-GRID-1] 和弹性盒子布局 [CSS-FLEXBOX-1] 的交互在其各自的模块中定义。 此处的属性定义取代了 [CSS-FLEXBOX-1] 中的定义(后者具有更小、更早的允许值子集)。

本模块中的任何属性均不适用于 ::first-line::first-letter 伪元素。

1.2. 值定义

本规范遵循 [CSS2] 中的 CSS 属性定义约定,使用 [CSS-VALUES-3] 中的值定义语法。 本规范中未定义的值类型在 CSS Values & Units [CSS-VALUES-3] 中定义。 与其他 CSS 模块的组合可能会扩展这些值类型的定义。

除了在其定义中列出的特定于属性的值之外, 本规范中定义的所有属性 也接受 CSS 范围关键字作为其属性值。 为便于阅读,未明确重复它们。

1.3. 部分实现

由于预计本模块中特性的支持 将分阶段部署,对应于受影响的各种布局模型, 因此在此澄清, 要求将任何不受支持的特性视为无效的部分实现规则 适用于任何对齐关键字, 如果该关键字未在其适用的所有布局模块中得到支持, 而实现通常支持该属性的布局模型。

例如, 如果一个实现支持 [CSS-GRID-1][CSS-FLEXBOX-1] 中的 align-self, 那么它必须将 start 视为无效, 除非它在网格和弹性容器中都得到支持。 但是,如果同一个实现根本不支持块级元素的 align-self, 那么未实现 align-self: start 并不会触发将其视为无效的要求。

2. 对齐属性概述

CSS 中的盒子对齐属性是一组 6 个属性, 用于控制盒子在其他盒子内的对齐方式。 它们可以沿两个轴进行描述:

注意:本规范使用术语“justify”和“align”来区分 主轴/行内轴和交叉轴/块轴方向上的对齐。 这种选择有些随意,但使用这两个术语可以形成 一个适用于所有 CSS 布局模型的一致命名方案 (包括 CSS Flexbox 1 § 2 Flex 布局盒子模型和术语)。

下表总结了盒子对齐属性以及它们可以应用的显示类型。

通用 对齐对象 适用于
justify-content 主轴/行内轴 元素内内容对齐图示 元素内的内容 (有效地调整内边距) 块容器弹性容器网格容器
align-content 交叉轴/块轴
justify-self 行内轴 元素在父元素内对齐图示 元素在父元素内 (有效地调整外边距) 块级盒子、绝对定位盒子和网格项目
align-self 交叉轴/块轴 绝对定位盒子、弹性项目网格项目
justify-items 行内轴 盒子内项目对齐图示 盒子内的项目 (控制子项目的 justify-self: auto 块容器网格容器
align-items 交叉轴/块轴 弹性容器网格容器

注意:*-items 属性 不影响元素本身。 当在容器上设置时, 它们指定了容器元素子元素上任何 *-self: auto 的解释。

3. 对齐术语

由于本模块定义了 CSS 中所有布局模式的对齐属性, 因此引入了一些抽象术语:

对齐主体
对齐主体是指被属性对齐的一个或多个事物。 对于 justify-selfalign-self对齐主体是设置了该属性的盒子的外边距盒子, 并采用该盒子的书写模式。 对于 justify-contentalign-content对齐主体由布局模式定义 并指其内容的某些方面; 它也采用设置了该属性的盒子的书写模式
对齐容器
对齐容器对齐主体在其中对齐的矩形。 这由布局模式定义, 但通常是对齐主体的包含块, 并采用建立包含块的盒子的书写模式
回退对齐
某些对齐方式只能在特定情况下实现 或者在它们可以消耗的空间方面受到限制; 例如,space-between 只能在有多个对齐主体时操作, 而基线对齐一旦实现,可能不足以吸收所有多余的空间。 在这些情况下,回退对齐会生效 (如下所定义) 以完全消耗多余的空间。

4. 对齐关键字

所有的对齐属性都使用一组通用的关键字值, 这些值在本节中定义。 关键字分为三类:

位置对齐
这些关键字将对齐定义为对齐容器内的绝对位置。
基线对齐
这些关键字将对齐定义为对齐上下文内多个对齐主体基线之间的关系。
分布式对齐
这些关键字将对齐定义为对齐主体之间的空间分布。

4.1. 位置对齐:centerstartendself-startself-endflex-startflex-endleftright 关键字

位置对齐关键字指定对齐主体相对于其对齐容器的位置。

值的含义如下:

center (自身, 内容)
在其对齐容器内居中对齐主体
start (自身, 内容)
对齐主体对齐容器在相应轴上的起始边缘对齐。
end (自身, 内容)
对齐主体对齐容器在相应轴上的结束边缘对齐。
self-start (自身)
对齐主体对齐容器中对应于对齐主体在相应轴上的起始侧的边缘对齐。
self-end (自身)
对齐主体对齐容器中对应于对齐主体在相应轴上的结束侧的边缘对齐。
flex-start (自身, 内容)
仅用于弹性布局。 [CSS-FLEXBOX-1]对齐主体对齐容器中对应于弹性容器的主轴起始或交叉轴起始侧(视情况而定)的边缘对齐。

弹性格式化上下文之外使用时,此值的行为类似于 start。 也就是说,对于非弹性项目(或假装是弹性项目, 例如在确定作为弹性容器子元素的绝对定位盒子的静态位置时), 此值在自对齐属性中使用时行为类似于 start, 而对于非弹性容器的盒子, 此值在内容分布属性中使用时行为类似于 start

flex-end (自身, 内容)
仅用于弹性布局。对齐主体对齐容器中对应于弹性容器的主轴结束或交叉轴结束侧(视情况而定)的边缘对齐。

弹性格式化上下文之外使用时,此值的行为类似于 end。 也就是说,对于非弹性项目(或假装是弹性项目, 例如在确定作为弹性容器子元素的绝对定位盒子的静态位置时), 此值在自对齐属性中使用时行为类似于 end, 而对于非弹性容器的盒子, 此值在内容分布属性中使用时行为类似于 end

left (仅 justify-*)
对齐主体对齐容器行左物理左边缘(以相应轴为准)对齐。

如果属性的轴与任一左↔右轴都不平行, 此值的行为类似于 start目前,唯一属性的轴 与任一左↔右轴都不平行的情况 是在列式弹性盒中。

right (仅 justify-*)
对齐主体对齐容器行右物理右边缘(以相应轴为准)对齐。

如果属性的轴与任一左↔右轴都不平行, 此值的行为类似于 start目前,唯一属性的轴 与任一左↔右轴都不平行的情况 是在列式弹性盒中。

使用两个语法术语来表示这些值的某些子集:

<self-position>
此集合由 justify-selfalign-self 用于在其对齐容器内对齐盒子, 也由 justify-itemsalign-items(用于指定 justify-selfalign-self 的默认值)使用。
<self-position> = center | start | end | self-start | self-end |
        flex-start | flex-end
    
<content-position>
此集合由 justify-contentalign-content 用于在盒子自身内部对齐其内容。
<content-position> = center | start | end | flex-start | flex-end
    

注意:leftright<self-position><content-position> 中排除, 尽管它们是 justify-content/justify-self/justify-items 的有效位置对齐值, 因为它们不允许在 align-* 属性中使用。 它们被明确包含在 justify-* 属性的语法中。

对于大多数布局模型(块、表、网格等), justify-* 属性始终在行内轴中对齐事物, 而 align-* 属性始终在块轴中对齐事物。

另一方面,Flexbox 使 justify-*主轴中对齐事物,而 align-*交叉轴中对齐事物。 这取决于 flex-direction 的值: 当 flex-directionrowrow-reverse 时, 它与其他布局模型匹配 (行内轴justify-*块轴align-*); 当 flex-directioncolumncolumn-reverse 时, 它具有相反的对应关系。

使其更容易理解“start”和“end”相对于正交流的双轴特性。

4.2. 基线对齐:baseline 关键字 和 first/last 修饰符

参见 CSS 书写模式 3 § 4.1 基线简介

基线对齐是 一种位置对齐形式, 它通过匹配它们的对齐基线来对齐共享对齐上下文(例如一行中的单元格) 中的多个对齐主体。 如果基线共享组 内的对齐主体的位置 没有被基线对齐完全约束(即,它们可以在各自的 对齐容器内移动, 同时保持基线对齐), 则它们会尽可能地进行回退对齐,同时保留它们的基线对齐

基线对齐关键字由 <baseline-position> 语法项表示:

<baseline-position> = [ first | last ]? && baseline
    

firstlast 值赋予盒子一个基线对齐偏好: 分别为“first”或“last”, 默认为“first”。

值具有以下含义:

baseline
计算为 first baseline,定义如下。
first baseline
指定参与第一基线对齐: 将盒子的第一基线集对齐基线 与其基线共享组的相应基线对齐。 更多详细信息请参见 § 9.3 按基线对齐盒子

first baseline回退对齐safe self-start(对于自对齐) 或 safe start(对于内容分布)。

last baseline
指定参与最后基线对齐: 将盒子的最后基线集对齐基线 与其基线共享组的相应基线对齐。 更多详细信息请参见 § 9.3 按基线对齐盒子

last baseline回退对齐safe self-end(对于自对齐) 或 safe end(对于内容分布)。

当为 align-content 指定时, 这些值会触发基线内容对齐, 在盒子的内容框内移动其内容, 并且也可能影响盒子本身的大小。 参见 § 5.4 基线内容对齐

当为 align-self/justify-self 指定时, 这些值会触发基线自对齐, 在容器内移动整个盒子, 这可能会影响其容器的大小。 参见 § 6.4 基线自对齐

当在盒子上指定基线 自对齐时,首先执行内容分布, 然后将生成的盒子及其内容进行自对齐。然而,如果盒子在同一轴向上也有基线内容对齐, 或者其在同一轴向上的内容分布属性normal, 则其在该轴向上使用的 内容分布属性 对于其基线自对齐的“first”或“last”的基线对齐偏好分别为 startsafe end

在此处添加示例图片。

如果一个盒子不属于共享对齐上下文, 则使用回退 对齐。 例如,块级盒子上的 align-content: baseline 会回退到 start 对齐。 回退对齐也用于在其对齐容器内对齐基线共享组

注意:因为它们是等效的,并且 baseline 更短, 所以 CSSOM 将 first baseline 序列化为 baseline。 参见 CSSOM § 6.7.2 序列化 CSS 值

注意:对于有些相关的 vertical-align 属性, 由于 CSS2.1 中不一致的设计决策,baseline 并不 等同于 first baseline,因为行内级盒子的基线对齐偏好取决于 display。 (例如,inline-block 默认使用其最后基线, 而 inline-table 默认使用其第一基线。)

4.3. 分布式对齐:stretchspace-betweenspace-aroundspace-evenly 关键字

分布式 对齐值由 justify-contentalign-content 用于在其对齐主体之间分散容器的额外空间。

space-between | space-around | space-evenly | stretch
分布式对齐

当无法以这种方式分布空间时, 这些值的行为与其回退对齐相同。 每个分布值都有一个关联的默认回退 对齐。 (此模块的未来级别可能允许显式指定回退 对齐。)

space-between
对齐 主体对齐容器中均匀分布。 第一个对齐主体对齐容器的起始边缘齐平放置, 最后一个对齐主体对齐容器的结束边缘齐平放置, 其余的对齐主体则被分布,使得任意两个相邻对齐 主体之间的间距相同。
例如,给定三个项目,所有多余空间被分成两半并进行分配:一半在第一个和第二个项目之间,另一半在最后两个项目之间。

此值的默认回退对齐safe flex-start(对于除弹性布局之外的布局模式,flex-startstart 相同。)

space-around
对齐 主体对齐容器中均匀分布, 两端各留有半个大小的空间。 对齐主体被分布,使得任意两个相邻对齐 主体之间的间距相同, 并且第一个对齐 主体之前和最后一个对齐主体之后的间距是其他间距的一半。
例如,给定三个项目,所有多余空间被分成六份并进行分配:起始处一份,末尾处一份,第一个和第二个项目之间以及最后两个项目之间各两份(各占三分之一)。

此值的默认回退对齐safe center

space-evenly
对齐 主体对齐容器中均匀分布, 两端各留有一个完整大小的空间。 对齐主体被分布,使得任意两个相邻对齐 主体之间、 第一个对齐主体之前、 以及最后一个对齐主体之后的间距相同。
例如,给定三个项目,所有多余空间被分成四份并进行分配:分别分配给起始处、末尾处、第一个和第二个项目之间以及最后两个项目之间。

此值的默认回退对齐safe center

stretch
如果对齐主体的组合大小小于对齐 容器的大小, 任何auto大小的对齐主体 的大小会均等增加(非按比例), 同时仍然遵守max-height/max-width(或等效功能)施加的约束, 以便组合大小恰好填满对齐 容器
例如,给定三个项目,所有多余空间被分成三份并进行分配:每个项目各占一份。

此值的默认回退对齐flex-start(对于除弹性布局之外的布局模式,flex-startstart 相同。)

注意:此 `align-content/stretch` 定义 适用于内容分布属性自对齐属性 justify-self/align-self 有其自己的 stretch 值, 它可以增大或缩小对齐主体以确保其恰好适合对齐 容器

这些值由 <content-distribution> 语法项表示:

<content-distribution> = space-between | space-around | space-evenly | stretch
    

4.4. 溢出对齐:safeunsafe 关键字以及滚动安全限制

对齐主体 大于对齐容器时, 它会溢出。 某些对齐模式,如果在这种情况下得到遵守, 可能会导致数据丢失: 例如,如果侧边栏的内容居中, 当它们溢出时,可能会将其部分框发送到视口起始边缘之外, 而该边缘无法滚动到。

下图说明了“安全”与“不安全”居中的区别, 以列式 flexbox 为例:
关于
威权主义
博客
关于
威权主义
博客
当居中项目大于其容器时,“安全”(左侧) 与“不安全”(右侧) 居中的示例。

左图中项目居中,除非它们溢出,在这种情况下,所有溢出都超出结束边缘, 而右图中的项目都严格居中, 即使那个太长而无法容纳的项目在两侧都溢出。

如果容器放置 在页面左边缘, “安全”行为会更可取, 因为长项目将完全可读, 而不是被屏幕左边缘裁剪。 在其他情况下, “不安全”的居中行为可能更好, 因为它正确地居中了所有项目。

为了控制这种情况, 可以显式指定溢出对齐 模式。 “不安全”对齐在溢出情况下遵守指定的对齐模式,即使它会导致数据丢失, 而“安全”对齐在溢出情况下会更改对齐模式,以试图避免数据丢失。 默认行为是将对齐主体包含在可滚动区域内, 尽管在撰写本文时,此安全功能尚未实现。

<overflow-position> = unsafe | safe
safe
如果对齐主体的大小溢出对齐容器, 则对齐主体将改为像对齐模式为 start 一样对齐。
unsafe
无论对齐主体对齐容器的相对大小如何, 都会遵守给定的对齐值。
(未指定值)
如果未显式指定溢出 对齐, 则默认的溢出对齐是“安全”和 “不安全”的混合。 有关详细信息,请参见 § 4.4.1 自动溢出对齐安全

4.4.1. 自动溢出对齐安全性

如果未为属性指定溢出对齐模式,则默认行为介于安全 (safe)不安全 (unsafe)之间,并且因布局模式而异。

4.4.1.1. 滚动容器的内容分布

滚动容器内容分布的默认溢出对齐行为是不安全 (unsafe)内容分布属性的非normal值会改变可滚动溢出区域,以便允许访问溢出内容。请参见§ 5.3 对齐溢出和滚动容器

4.4.1.2. 绝对定位盒子的自对齐

对于相关的自对齐属性不是normal绝对定位对齐主体,默认的溢出对齐行为如下:

  1. 默认溢出矩形 (default overflow rect)对齐主体偏移属性修改的包含块 (inset-modified containing block)及其原始包含块 (original containing block)的边界矩形。

  2. 如果对齐主体溢出其偏移属性修改的包含块(其正常的对齐容器),但未溢出默认溢出矩形,则按指定对齐(不安全 (unsafe))。

  3. 如果对齐主体大小适合默认溢出矩形,但其指定的对齐方式会导致其溢出默认溢出矩形,则将其移动最小量以保持在默认溢出矩形内,同时尽可能地遵循对齐方式(即,与其试图溢出的原始包含块的边缘齐平)。

  4. 如果对齐主体的大小溢出默认溢出矩形,则它将在默认溢出矩形内进行起始对齐(类似于安全 (safe))。

(对于不满足上述条件的绝对定位对齐主体,请参见§ 4.4.1.3 所有其他对齐。)

4.4.1.3. 所有其他对齐

对于所有其他元素:

  1. 如果对齐主体溢出其对齐容器,则按指定对齐(不安全 (unsafe))。

  2. 如果对齐主体将溢出其最近祖先滚动容器可滚动溢出区域(从而延伸到“不可滚动”区域),则其在该方向上的溢出将通过将任何剩余溢出偏向另一侧来限制。

实现“智能”默认行为可能不具有 Web 兼容性(尽管我们希望如此,并认为很有可能),因此 UA 应将关于此点的任何反馈传递给 WG。尚未实现“智能”默认行为的 UA 必须在块容器上的 align-content 表现为安全 (safe),否则表现为不安全 (unsafe)

5. 内容分布:在盒子内部对齐其内容

内容分布 控制盒子内容在其内容框内的对齐。 它由内容分布属性 align-contentjustify-content(及其 place-content 简写)指定。

示意图,显示元素内部内容的对齐受到影响。

5.1. justify-contentalign-content 属性

名称: align-content
值: normal | <baseline-position> | <content-distribution> | <overflow-position>? <content-position>
初始值: normal
应用于: 块容器、多列容器、弹性容器和网格容器
继承性:
百分比: 不适用
计算值: 指定的关键字
规范顺序: 根据语法
动画类型: 离散
名称: justify-content
值: normal | <content-distribution> | <overflow-position>? [ <content-position> | left | right ]
初始值: normal
应用于: 多列容器、弹性容器和网格容器
继承性:
百分比: 不适用
计算值: 指定的关键字
规范顺序: 根据语法
动画类型: 离散

将盒子作为一个整体的内容(作为对齐主体)在盒子自身内部(作为对齐容器)进行对齐: 沿盒子的内联/行/主轴(对于 justify-content) 或盒子的块/列/交叉轴(对于 align-content)。 除 normal 之外的值在上面的 § 4 对齐关键字中定义。

对于所有布局模式,对齐主体对齐容器都采用设置了 *-content 属性的盒子的书写模式

5.1.1. 块容器(包括表格单元格)

对齐容器 块容器的内容框。
对齐主体 块的全部内容,作为一个单元。
align-content 块轴。 如果指定了 <content-distribution>,则改用其回退对齐。 如果未指定 <overflow-position>,并且块容器不是滚动容器, 则对齐是 safe
justify-content 不适用于块容器,也对其没有影响。
normal 行为 normal 之外的所有值都会强制块容器建立一个独立的格式化上下文

对于表格单元格,align-content: normal 的行为取决于 vertical-align 的计算值:top 使其行为像 startbottom 使其行为像 end; 否则 middle 使其行为像 center, 所有其他值使其行为像 baseline[CSS2]

normal 在其他情况下行为像 start

5.1.2. 多列容器

对齐容器 多列容器的内容框。
对齐主体 列框,列框之间插入的任何间距都添加到相关的列间隙中。
align-content 块轴, 将列框(以及任何跨列元素)视为一个单元。 如果指定了 <content-distribution>,则改用其回退对齐
justify-content 内联轴
normal 行为 normal 的行为与 stretch 类似; 两者均按照 [CSS-MULTICOL-1] 中的列大小规则进行定义。

对于具有非 auto column-width 的多列容器,除 normalstretch 之外的 justify-content 值会导致列采用其指定的 column-width 而不是拉伸以填充容器。 然后根据 justify-content 指定的方式对齐列框。

5.1.3. 弹性容器

对齐容器 弹性容器的内容框。
对齐主体 对于 justify-content,是每个弹性行中的弹性项目

对于 align-content, 是弹性行。 注意,这仅对多行弹性容器有效。

align-content 交叉轴
justify-content justify-content 属性沿主轴应用, 但由于主轴上的拉伸由 flex 控制, stretch 的行为与 flex-start 类似。
normal 行为 normal 的行为与 stretch 类似。

有关详细信息,请参见 [CSS-FLEXBOX-1]

5.1.4. 网格容器

对齐容器 网格容器的内容框。
对齐主体 相应轴上的网格轨道, 轨道之间插入的任何间距都添加到相关的间隙中, 并将折叠的间隙视为单个空间插入机会。
align-content 块轴, 对齐网格行
justify-content 内联轴, 对齐网格列
normal 行为 normal 的行为与 stretch 类似。

有关详细信息,请参见 [CSS-GRID-1]

5.2. 内容分布简写:place-content 属性

名称: place-content
值: <'align-content'> <'justify-content'>?
初始值: normal
应用于: 块容器、弹性容器和网格容器
继承性:
百分比: 不适用
计算值: 见各属性
规范顺序: 根据语法
动画类型: 离散

简写属性在一个声明中同时设置 align-contentjustify-content 属性。 第一个值赋给 align-content。 第二个值赋给 justify-content; 如果省略,则从第一个值复制, 除非该值是 <baseline-position>,在这种情况下,它默认为 start

5.3. 对齐溢出和滚动容器

内容分布属性设置在具有溢出对齐主体滚动容器上时, 它们会减少负向可滚动溢出区域的裁剪,刚好足以确保对齐主体可以滚动到其 start 对齐位置。

例如, 如果一个可滚动的弹性容器设置为 justify-content: flex-end (或 justify-content: flex-startflex-flow: row-reverse), 其流内内容最初将被定位, 以使其内容的 main-end 边缘与弹性容器的 main-end 边缘对齐, 并且其内容将看起来溢出其 main-start 边缘。 但是,查看者将能够向上滚动以查看溢出的流内内容, 就像指定了 justify-content: flex-start 一样。
问题:用合适的 SVG 替换此图像。

注意: 对齐主体不一定与可滚动溢出区域相同: 溢出对齐主体的内容——例如脱离流的盒子——会增加可滚动溢出区域但不会增加对齐主体。 因此,一个 end 对齐的滚动容器可能最初不会一直滚动到底部, 如果定位内容比构成对齐主体流内内容更深地进入负向可滚动溢出区域,则它仍然可能被裁剪。

溢出不是对齐主体的一部分, 即使对于滚动容器也是如此。

也替换此图像。

注意: 滚动条的存在可以改变滚动容器内容框的大小——从而改变对齐容器和/或对齐主体的大小。

5.4. 基线内容对齐

参与行式布局上下文(共享对齐上下文)的盒子的内容可以相互进行基线对齐。 基线内容对齐有效地增加了盒子上的 内边距,以使其内容的对齐基线 与其基线共享组中其他基线对齐盒子的基线对齐。

基线内容对齐仅在 align-content 轴 与盒子的块轴平行时才适用 (即,它不适用于“列”弹性容器); 否则使用回退对齐

参与基线内容对齐的盒子集合取决于布局模型:

表格单元格:
一个(非替换的表格单元格在其最开始/最末尾的行中参与 第一/最后基线内容对齐,前提是其内联轴与表格本身的内联轴平行,并且 其计算的 align-contentfirst baselinelast baseline)。

注意: 不支持共享同一列的单元格的基线内容对齐; 但是,如果有足够的需求和实现者兴趣,将来可能会在某个级别中添加此功能。

弹性项目:
一个非替换的弹性项目 在其弹性行中参与 第一/最后基线内容对齐,前提是 其计算的 align-contentfirst baseline/last baseline,并且其内联轴主轴平行。
网格项目:
一个非替换的网格项目 在其最开始/最末尾的行或列(以与其内联轴平行的为准)中参与 第一/最后基线内容对齐, 并且其计算的 align-contentfirst baseline/last baseline

此外, 为了参与基线内容对齐,它还必须具有协调的自对齐偏好, 以保证盒子将其相关边缘与其基线共享组中的其他盒子对齐。 也就是说,当盒子的基线对齐偏好为“first”(“last”)时,其startend外边距边缘必须意图——并且实际——与其包含块的相应边缘对齐。 否则,它将采用其回退对齐

自对齐偏好何时是协调的?

当一个盒子的起始外边距边缘与其包含块的相应边缘对齐,并且对于“第一”基线对齐偏好,它在相关轴上具有协调的自对齐偏好时:

当一个盒子的末端外边距边缘与其包含块的相应边缘对齐,并且对于“最后”基线对齐偏好,它在相关轴上具有协调的自对齐偏好时:

有关其他详细信息,请参见 § 9.3 按基线对齐盒子基线内容对齐可以增加盒子的固有大小。

6. 自对齐:在父元素内对齐盒子

自对齐控制盒子在其包含块内的对齐方式。 它由自对齐属性 align-selfjustify-self(以及它们的place-self 简写)指定。

示意图,显示元素在其包含块内的对齐受到影响。

6.1. 行内轴(或主轴)自对齐:justify-self 属性

名称: justify-self
值: auto | normal | stretch | <baseline-position> | <overflow-position>? [ <self-position> | left | right ]
初始值: auto
适用于: 块级盒子、绝对定位盒子和网格项目
继承:
百分比: 不适用
计算值: 指定的关键字
规范顺序: 按语法
动画类型: 离散

在其包含块(作为对齐容器)内, 沿着对齐容器的行内/行/主轴对齐盒子(作为对齐主体): 盒子的外边缘在其对齐容器根据其对齐值进行对齐。 各值含义如下:

auto

如果盒子没有父元素,或者在确定绝对定位盒子的实际位置时,其行为与 normal 相同。 否则,其行为与父盒子的计算 justify-items 值相同 (减去任何 legacy 关键字) (包括在确定绝对定位盒子的静态位置时)。

normal

表示布局模式的“默认”对齐方式。 其行为取决于布局模式,如下所述。

stretch

当盒子的计算 width/height (视轴而定) 为 auto 且其任一边距(在相应轴上)均不为 auto 时, 将盒子的使用尺寸设置为必要的长度,使其外尺寸 尽可能接近填充对齐容器, 同时仍遵守 min-height/min-width/max-height/max-width 施加的约束。

除非另有规定,否则此值通常回退到 flex-start, 如果盒子还在同一轴上指定了 第一基线最后基线 基线内容对齐 (分别),则回退到 self-startself-end

注意: stretch 关键字可能导致元素收缩, 以适应其容器。

<baseline-position>

表示基线自对齐, 定义见 § 4.2 基线对齐:baseline 关键字和 first/last 修饰符§ 6.4 基线自对齐§ 9 基线对齐详情

<overflow-position>? <self-position>

定义见上文 § 4 对齐关键字

stretch 之外的值会导致 width/heightauto 值被视为 fit-content

注意: auto 外边距, 因为它们有效地调整了外边距区域的大小, 所以优先于 justify-self

6.1.1. 块级盒子

justify-self 通常是块的包含块行内轴。 在确定静态位置时,是静态位置包含块行内轴
对齐容器 盒子的包含块, 但对于建立块格式化上下文并放置在浮动元素旁边的块级元素, 对齐容器会减去浮动元素占用的空间, 假设包含块书写模式
对齐主体 盒子的外边距盒, 假设块的书写模式
normal 行为 盒子根据块布局的默认规则进行布局 (参见 CSS2.1§10.3)。
其他详情 就 CSS2.1 块级格式化 [CSS2] 而言, 第 10.3.3 节中“过度约束”计算的规则被忽略, 而采用此处指定的对齐方式, 因此不会调整外边距属性的已用值来纠正过度约束。

此属性不适用于浮动元素。

这些规则的效果是, 例如,一个自动调整大小的块级表格, 可以在对齐的同时仍然具有侧边距。 如果表格的最大内容尺寸小于其包含块, 则它会收缩到该尺寸并按指定方式对齐。 如果表格的最大内容尺寸更宽,则它会填充其包含块, 并且外边距提供与包含块边缘的适当间距。

6.1.2. 绝对定位盒子

本节描述 justify-self 对绝对定位盒子的外边距盒 相对于其(绝对定位)包含块的定位方式的影响。

justify-self 盒子的包含块的行内轴
对齐容器 盒子的包含块, 由内边距属性(top/right/bottom/left)修改, 假设包含块书写模式。 如果相关轴中的两个内边距属性都为 auto, 则使用盒子的静态位置矩形(即,将两个内边距都设置为盒子的静态位置) 并假设静态位置包含块书写模式
对齐主体 盒子的外边距盒, 假设盒子的书写模式
normal 行为 行为类似于 stretchstart, 取决于盒子的类型。 参见 CSS 定位布局 3 § 4 绝对定位布局模型
其他详情 就 CSS2.1 格式化 [CSS2] 而言, 第 10.3.7 节中“过度约束”计算的规则被忽略, 而采用此处指定的对齐方式, 并且不会调整内边距属性的已用值来纠正过度约束。

stretchnormal 之外的值会导致非替换绝对定位盒子使用fit-content sizing 来计算受影响轴中的 auto 尺寸。

请注意,stretch 确实会导致替换的绝对定位盒子 填充其包含块, 就像非替换盒子一样。

注意: 如果只有一个内边距属性为 autoCSS2 第 10.3.7 节中的计算将完全确定其大小和位置, 并且 justify-self 没有效果。 (如果两者都为 auto, 则盒子是静态定位的, 见上文, 并且可以在静态位置矩形内对齐。)

6.1.3. 表格单元格

此属性不适用于表格单元格, 因为它们的位置和大小完全受表格布局的约束。

6.1.4. 弹性项目

此属性不适用于弹性项目, 因为在主轴上有多个项目。 有关拉伸,请参见 flex;有关主轴对齐,请参见 justify-content[CSS-FLEXBOX-1]

6.1.5. 网格项目

justify-self 网格的行内轴
对齐容器 网格项目网格区域, 假设网格容器书写模式
对齐主体 网格项目的外边距盒, 假设网格项目书写模式
normal 行为 大小调整为 stretch(典型的非替换元素) 或 start(典型的替换元素); 参见 [CSS-GRID-1] 中的 网格项目大小调整。 然后将生成的盒子起始对齐。

有关详细信息,请参见 [CSS-GRID-1]

6.2. 块轴(或交叉轴)自对齐:align-self 属性

名称: align-self
值: auto | normal | stretch | <baseline-position> | <overflow-position>? <self-position>
初始值: auto
适用于: 弹性项目、网格项目和绝对定位盒子
继承:
百分比: 不适用
计算值: 指定的关键字
规范顺序: 按语法
动画类型: 离散

在其包含块(作为对齐容器)内, 沿着对齐容器的块/列/交叉轴对齐盒子(作为对齐主体): 盒子的外边缘在其对齐容器根据其对齐值进行对齐。 各值含义如下:

auto

如果盒子没有父元素,或者在确定绝对定位盒子的实际位置时,其行为与 normal 相同。 否则,其行为与父盒子的计算 align-items 值相同 (减去任何 legacy 关键字) (包括在确定绝对定位盒子的静态位置时)。

normal

表示布局模式的“默认”对齐方式, 如下定义。

stretch

justify-self§ 6.1 行内轴(或主轴)自对齐:justify-self 属性中的定义相同。

<baseline-position>

表示基线自对齐, 定义见 § 4.2 基线对齐:baseline 关键字和 first/last 修饰符§ 6.4 基线自对齐§ 9 基线对齐详情

<overflow-position>? <self-position>

定义见上文 § 4 对齐关键字

注意: auto 外边距, 因为它们有效地调整了外边距区域的大小, 所以优先于 align-self

6.2.1. 块级盒子

align-self 属性不适用于块级盒子 (包括浮动元素), 因为在块轴上有多个项目。

6.2.2. 绝对定位盒子

本节描述 align-self 对绝对定位盒子的外边距盒 相对于其(绝对定位)包含块的定位方式的影响。

align-self 通常是盒子的包含块块轴。 在确定静态位置时,是静态位置包含块块轴
对齐容器 盒子的包含块, 由内边距属性 (top/right/bottom/left)修改, 假设包含块书写模式。 如果相关轴中的两个内边距属性都为 auto, 则使用盒子的静态位置矩形(即,将两个内边距都设置为盒子的静态位置) 并假设静态位置包含块书写模式
对齐主体 盒子的外边距盒, 假设盒子的书写模式
normal 行为 行为类似于 stretchstart, 取决于盒子的类型。 参见 CSS 定位布局 3 § 4 绝对定位布局模型
其他详情 就 CSS2.1 格式化 [CSS2] 而言, 第 10.6.4 节中“过度约束”计算的规则 被忽略,而采用此处指定的对齐方式, 并且不会调整内边距属性的已用值来纠正过度约束。

stretchnormal 之外的值会导致非替换绝对定位盒子使用fit-content sizing 来计算受影响轴中的 auto 尺寸。

请注意,stretch 确实会导致替换的绝对定位盒子 填充其包含块, 就像非替换盒子一样。

注意: 如果只有一个内边距属性为 autoCSS2 第 10.6.4 节中的计算将完全确定其大小和位置, 并且 align-self 没有效果。 (如果两者都为 auto, 则盒子是静态定位的, 见上文, 并且可以在静态位置矩形内对齐。)

6.2.3. 表格单元格

此属性不适用于表格单元格, 因为它们的位置和大小完全受表格布局的约束。

6.2.4. 弹性项目

align-self 弹性容器交叉轴
对齐容器 弹性项目所在的弹性行, 假设弹性容器书写模式
对齐主体 弹性项目的外边距盒, 假设弹性项目书写模式
normal 行为 行为类似于 stretch

有关详细信息,请参见 [CSS-FLEXBOX-1]

6.2.5. 网格项目

align-self 网格的块轴
对齐容器 网格项目网格区域, 假设网格容器书写模式
对齐主体 网格项目的外边距盒, 假设网格项目书写模式
normal 行为 大小调整为 stretch(典型的非替换元素) 或 start(典型的替换元素); 参见 [CSS-GRID-1] 中的 网格项目大小调整。 然后将生成的盒子起始对齐。

有关详细信息,请参见 [CSS-GRID-1]

6.3. 自对齐简写:place-self 属性

名称: place-self
值: <'align-self'> <'justify-self'>?
初始值: auto
适用于: 块级盒子、绝对定位盒子和网格项目
继承:
百分比: 不适用
计算值: 参见各个属性
规范顺序: 按语法
动画类型: 离散

简写属性 在一个声明中同时设置 align-selfjustify-self 属性。 第一个值赋给 align-self。 第二个值赋给 justify-self; 如果省略,则从第一个值复制。

6.4. 基线自对齐

参与行式布局上下文(共享对齐上下文)的盒子 可以相互进行基线对齐。基线自对齐有效地增加了盒子的 外边距,以使其对齐基线 与其基线共享组中的其他基线对齐盒子的基线对齐。

参与基线自对齐的盒子集合取决于布局模型:

弹性项目:
如果弹性项目的计算 align-selffirst baseline/last baseline,则它参与其弹性行中的 第一/最后基线自对齐。 有关详细信息,请参见 [CSS-FLEXBOX-1]
网格项目:
如果网格项目align-selfjustify-self 属性(分别) 计算为 first baseline/last baseline,则它参与其最开始/最末尾行或列中的 第一/最后基线自对齐

有关确切详细信息,请参见 § 9.3 按基线对齐盒子基线自对齐可以增加盒子的固有尺寸贡献。

6.5. 对具有静态位置内边距的绝对定位盒子的大小调整的影响

对于行内轴偏移量均为 auto 的绝对定位盒子, 用于计算行内尺寸可用空间也受对齐的影响。

注意:[CSS2] 中,可用空间取决于静态位置包含块direction 属性。 (参见 CSS2§10.3.7CSS2§10.3.8。) 从根本上说,这些规则将其中一个 auto 内边距 (默认为起始边缘内边距) 设置为静态位置矩形的相应边缘,另一个设置为包含块的相应边缘(即,将内边距设置为零)。 正如自对齐属性替换了包含块direction 查找以进行放置一样, 它们也替换了此查找以进行大小调整, 如此处指定。

因此, 在解释 CSS2§10.3.7CSS2§10.3.8 中的规则时, 无论何时引用静态位置包含块direction 属性, 都应改为引用 align-selfjustify-self 属性的值 (以定义为适用于相关轴的为准), 将左等效对齐视为 ltr 定义的对齐,将右等效对齐视为 rtl 定义的对齐。 将 normal 视为 start,并将任何分布式对齐值视为其回退对齐

center 对齐的情况下, 盒子的可用空间静态位置矩形的中心与包含块在相关轴上最近边缘之间距离的两倍。

起始对齐将大小调整到静态位置矩形的起始边缘与包含块的结束边缘之间的空间。
    结束对齐将大小调整到静态位置矩形的结束边缘与包含块的起始边缘之间的空间。
    居中对齐将大小调整到静态位置矩形的两个边缘之间的空间。
[CSS2] 中指定的始终在 行内起始 静态位置行内结束 包含块边缘之间的可用空间内调整大小不同, 具有 auto 内边距的绝对定位元素 将参照 最适合其指定自对齐静态位置矩形的边缘进行大小调整。
例如, 当盒子的包含块directionltr 且其自身的 justify-selfend 时, 应用 direction: rtl 的规则; 当 directionrtljustify-contentspace-between 时, 应用 direction: rtl 的规则; 等等。 对于 center(或其等效值)的情况, 将两侧都设置为匹配静态位置。 然后将绝对定位盒子调整到 生成的空间(向下取整为零)。

注意: align-self/justify-self 属性 还可以修改大小调整的其他方面: 例如,justify-self: stretch 将替换 到可用空间中的“收缩以适应”(fit-content)大小调整为拉伸以适应大小调整(消耗所有可用空间)。 这与此处的可用空间调整是独立的效果。

注意: 这仅影响如何计算可用空间 以调整绝对定位盒子的大小; 其对齐方式如前几节所述。

7. 默认对齐

align-itemsjustify-items 属性 (及其 place-items 简写) 设置元素子盒子的默认 align-selfjustify-self 行为。

示意图,显示元素内网格项目的对齐方式受到影响。

7.1. 行内轴(或主轴)默认对齐:justify-items 属性

名称: justify-items
值: normal | stretch | <baseline-position> | <overflow-position>? [ <self-position> | left | right ] | legacy | legacy && [ left | right | center ]
初始值: legacy
适用于: 所有元素
继承性: no
百分比: 不适用
计算值: 指定的关键字,legacy 除外(见正文)
规范顺序: 根据语法
动画类型: 离散

此属性为参与此盒子格式化上下文的所有子盒子(包括匿名盒子)指定默认的 justify-self。 值具有以下含义:

legacy
此关键字使值有效地继承到后代。

如果 legacy 关键字单独出现 (没有附带的 leftrightcenter 关键字): 如果 justify-items继承值 包含 legacy 关键字, 则此值计算为继承值; 否则计算为 normal

justify-self:auto 引用 justify-items 的值时, 它仅引用对齐关键字,而不引用 legacy 关键字。 它的存在是为了实现 HTML 的 <center> 元素和 align 属性的旧版对齐行为。

其他值没有特殊处理,仅由 justify-self 引用。

7.2. 块轴(或交叉轴)默认对齐:align-items 属性

名称: align-items
值: normal | stretch | <baseline-position> | [ <overflow-position>? <self-position> ]
初始值: normal
适用于: 所有元素
继承性: no
百分比: 不适用
计算值: 指定的关键字
规范顺序: 根据语法
动画类型: 离散

此属性为参与此盒子格式化上下文的所有子盒子(包括匿名盒子)指定默认的 align-self

值没有特殊处理,仅由 align-self 引用。

7.3. 默认对齐简写:place-items 属性

名称: place-items
值: <'align-items'> <'justify-items'>?
初始值: 参见各属性
适用于: 所有元素
继承性: no
百分比: 不适用
计算值: 参见各属性
规范顺序: 根据语法
动画类型: 离散

简写属性在单个声明中同时设置 align-itemsjustify-items 属性。 第一个值赋给 align-items。 第二个值赋给 justify-items; 如果省略,则从第一个值复制。

8. 盒子之间的间隙

虽然 marginpadding 可以用来指定单个盒子周围的视觉间距, 但在给定的布局上下文中,全局指定相邻盒子之间的间距有时更方便, 特别是当同级盒子之间的间距与第一个/最后一个盒子和容器边缘之间的间距不同时。

gap 属性及其 row-gapcolumn-gap 子属性, 为多列弹性(flex)网格(grid)布局提供了此功能。

8.1. 行和列间距:row-gapcolumn-gap 属性

名称: row-gapcolumn-gap
值: normal | <length-percentage [0,∞]>
初始值: normal
适用于: 多列容器弹性容器网格容器
继承性:
百分比: 参见 § 8.3 gap 属性中的百分比
计算值: 指定的关键字,否则为计算的 <length-percentage>
规范顺序: 根据语法
动画类型: 按计算值类型

这些属性指定容器中项目之间的固定长度间距, 在它们之间添加空间——方式类似于内容分布属性space-between 关键字, 但大小是固定的,而不是剩余空间的一部分。 column-gap 属性指定“列”之间的间距, 在容器的行内轴中分隔框, 类似于行内轴外边距; 而 row-gap 表示“行”之间的间距, 在容器的块轴中分隔框。

值具有以下含义:

<length-percentage [0,∞]>

指定“行”或“列”之间的间隙,由其应用的布局模式定义; 详见下面的小节。

负值无效。 对于百分比, 参见 § 8.3 gap 属性中的百分比

normal

normal 表示 在多列容器上使用值为 1em, 在所有其他上下文中表示使用值为 0px

间距影响项目之间的最小间距: 可以通过 justify-content/align-content 添加额外的间距。 这种额外的空间有效地增加了这些间距的大小。

这些属性的确切处理方式因布局容器而异:

多列容器
column-gap 指定相邻列框之间的间距, 参见 [CSS-MULTICOL-1]row-gap 指定由 column-height 建立的列框行之间的间距, 参见 [CSS-MULTICOL-2]
弹性容器
当应用于主轴(例如,row 弹性容器中的 column-gap)时, 表示项目之间的最小间距 (如同在单行中相邻弹性项目之间插入了额外的固定大小外边距)。

当应用于交叉轴(例如,row 弹性容器中的 row-gap)时, 表示相邻弹性行之间的最小间距。

网格容器
row-gapcolumn-gap 属性, 当在网格容器上指定时, 分别定义网格行网格列之间的间距。 有关精确详细信息,请参见 CSS 网格布局 1 § 10.1 间距:row-gap、column-gap 和 gap 属性

在所有情况下,当间距分段断点重合时,它会消失。 [CSS-BREAK-3]

注意: 表格盒子不使用 gap 属性 来指定其单元格之间的分隔。 相反,它们使用 border-spacing 属性, 该属性的功能略有不同: 它会继承, 并且还指定最外层单元格与表格边框之间的额外间距 (类似于 space-evenly 而不是 space-between)。

8.2. Gap 简写:gap 属性

名称: gap
值: <'row-gap'> <'column-gap'>?
初始值: 参见各属性
适用于: 多列容器弹性容器网格容器
继承性:
百分比: 参照内容区域的相应维度
计算值: 参见各属性
规范顺序: 根据语法
动画类型: 按计算值类型

此属性是一个简写,用于在一个声明中设置 row-gapcolumn-gap。 如果省略 <'column-gap'>, 则将其设置为与 <'row-gap'> 相同的值。

一个示意图,显示外边距和内边距如何增加可见间距的大小

注意: gap 属性只是盒子之间创建的可见“间距”或“通道”的一个组成部分。 外边距、内边距或使用分布式对齐可能会增加盒子之间的可见分隔, 超出 gap 中指定的值。

8.3. gap 属性中的百分比

通常, 由 gap 属性引入的间隙 旨在表现得像一个具有间隙大小的空项目/轨道等; 换句话说, 作者应该能够通过仅在容器中插入额外的空项目/轨道等来重现 gap 的效果。

gap 总是根据元素的内容框的相应大小解析百分比。 当此大小确定时, 行为是明确定义的 并且在不同布局模式中是一致的。 但是由于不同的布局模式对项目/轨道等的循环百分比大小处理方式不同,gap 也是如此:

在网格布局中

如同最小尺寸属性和外边距/内边距 [CSS-SIZING-3]循环百分比大小在确定固有尺寸贡献时解析为零, 但在布局盒子内容时解析为盒子的内容框。

在弹性布局中

循环百分比大小在所有情况下都解析为零。

8.4. 旧版 Gap 属性:grid-row-gapgrid-column-gapgrid-gap 属性

网格布局模块最初是用它自己的一套间距属性编写的, 之后所有这些属性才统一到现有的 row-gap/column-gap 命名中。 为了与旧内容兼容, 必须按如下方式支持这些以 grid- 为前缀的名称:

9. 基线对齐详情

基线共享组中的盒子使用其对齐基线相互对齐。 例如,在水平书写模式中, 对同一行中的表格单元格指定 align-content: baseline 将对齐其第一个格式化行的基线。 本节详细定义了在考虑到国际化现代 CSS 中存在的众多基线和书写模式的情况下, 如何执行基线对齐。

基线集是 与公共基线表关联的一组基线(字母基线、中心基线等)。 通常,排版传统只会使用其中一种, 但不同的书写系统使用不同的基线, 混合书写系统可能会导致在单行内使用多种基线。 有关基线和书写模式的更多信息,请参阅 CSS 书写模式 3 § 4.1 基线简介

9.1. 确定盒子的基线

对于给定轴,每个盒子 都可能有一个 第一基线集(和 最后基线集), 名义上对应于 盒子内文本第一行/最后一行的基线集对齐基线, 即用于在其对齐上下文中对齐盒子的基线, 是其基线集中的基线之一, 通常是与共享对齐上下文关联的主导基线。 (请参阅 [CSS-INLINE-3] 中的 dominant-baselinealignment-baseline 属性。)

盒子的第一和最后基线集 根据布局模型的不同而确定,如下所示:

行盒
行盒的第一/最后基线集根据根内联盒的主导基线 和字体设置生成的。
块容器
块容器的第一/最后基线集取自块容器中的第一个/最后一个流入行盒 或块容器中贡献一组第一/最后基线的第一个/最后一个流入块级子元素, 以先出现/最后出现者为准。 如果没有这样的行盒或子元素, 则块容器没有基线集

但是,出于历史原因, 如果其 baseline-sourceauto初始值), 则作为滚动容器块级内联级块容器 始终具有最后基线集, 其所有基线都对应于其块末端 外边距边缘

多列容器
多列容器的第一基线集是具有最高(块起始端最近)基线的多列跨越者第一基线集, 该基线对应于多列容器对齐基线。 如果没有这样的行盒或子元素, 则多列容器没有第一基线集

最后基线集类似, 但使用最后基线集最低块末端最近)基线。

表格
表格盒的第一/最后基线集 是其第一行/最后一行的第一/最后基线集

在查找内联块的第一/最后基线集时, 必须跳过由表格盒贡献的任何基线。 (这是来自 [CSS2] 的历史行为。)

表格行
如果行中的任何单元格沿内联轴参与 第一基线/最后基线对齐, 则在执行对齐后,该行的第一/最后基线集将根据其共享对齐基线和该行的第一个可用字体生成。 否则,该行的第一/最后基线集根据行中单元格的最低和最高内容边缘合成。 [CSS2]

跨越单元格仅在其跨越的第一行/最后一行中参与 第一基线/最后基线对齐。

弹性容器
请参阅 [CSS-FLEXBOX-1] 中的 弹性基线
网格容器
请参阅 [CSS-GRID-1] 中的 网格基线

要从单个基线为盒子生成基线, 请使用该盒子的字体设置和第一个可用字体中的基线表, 并将该基线集与给定的单个基线对齐。

如果参与基线对齐的盒子没有基线集, 则其对齐基线根据其参与的格式化上下文的规则进行合成。 要从矩形(或两条平行线)合成基线, 请从下划线合成字母基线, 并通过平均两个边缘或线的位置来合成中心基线。 有关合成其他基线的规则,请参阅 CSS 内联布局 3 § A 合成对齐度量

注意: 用于从盒子合成基线的边缘 取决于其格式化上下文: 内联级盒子从其外边距边缘合成 [CSS-INLINE-3], 表格单元格从其内容边缘合成 [CSS2], 网格和弹性项目从其边框边缘合成 [CSS-GRID-1] [CSS-FLEXBOX-1]

通常,被对齐的盒子、形状或其他对象的书写模式 用于确定用于合成的下划线上划线边缘。 但是,当该书写模式块流向平行于对齐上下文的轴时, 必须假定一个轴兼容的书写模式

为了找到盒子的基线, 它及其所有具有滚动机制的流入后代(请参阅 overflow 属性) 必须被视为已滚动到其初始滚动位置。 此外, 如果滚动容器的第一/最后基线的位置超出其边框边缘, 则该基线的位置将被限制在边框边缘。

9.2. 基线对齐分组

基线共享组 由共同参与基线对齐的盒子组成。 这仅在它们同时满足以下条件时才可能:

注意: 参与基线内容对齐的盒子和 参与基线自对齐的盒子可以是同一基线共享组的一部分, 因此可以相互对齐。 两种方法之间的区别在于为执行对齐而插入额外空间的位置 (在盒子自身边框的内部或外部)。

当盒子满足以下条件时,它们沿特定轴共享由特定盒子建立的对齐上下文

注意: 从概念上讲, 行盒中的内联级盒子也共享一个自对齐上下文并参与基线共享组; 但是它们仅响应 vertical-align 属性进行基线对齐, 而不响应本模块中定义的任何属性。 请参阅 [CSS-INLINE-3]

如果一个盒子跨越多个共享对齐上下文, 则它沿该轴在其最开始/最末端的共享对齐上下文中参与第一/最后基线对齐。 例如,一个跨越三行的表格单元格 与其跨越的第一行中的表格单元格进行第一基线对齐, 或者与其跨越的最后一行中的表格单元格进行最后基线对齐

如果基线共享组中的两个盒子的基线对齐首选项具有以下特征, 则它们是兼容的

9.3. 按基线对齐盒子

给定一组对齐主体及其基线, 它们都属于单个基线共享组, 则对齐主体按如下方式进行基线对齐:

  1. 从组的对齐上下文第一个可用字体生成基线共享组的基线表, 并通过对齐它们的中心基线来覆盖此基线表的镜像。 这些是对齐主体将对齐的基线“网格”。

  2. 通过其指定的对齐基线将每个对齐主体与组的基线表或其镜像对齐, 以匹配对齐主体行方向为准。 除非另有规定(例如,通过 alignment-baseline 属性), 否则对齐基线对齐上下文主导基线

  3. 根据其回退对齐方式将对齐的基线共享组定位在对齐容器内。 基线共享组回退对齐方式是其项目解析为物理方向后的回退对齐方式

  4. 对于第一/最后基线内容对齐, 然后在对齐容器的开始/结束内容边缘与对齐主体的边缘之间添加最小的必要额外空间, 以对齐对齐上下文中所有对齐容器的开始/结束外边距边缘, 同时在基线共享组内保持基线对齐。

附录 A:静态位置术语

当给定轴上的两个内边距属性绝对定位的盒子上都为 auto 时, CSS2 使用其静态位置来解析其大小和位置。 请参阅 CSS2.1§10.3.7盒模型对齐属性会修改这些计算, 就像它们在其他布局模式中修改大小和定位计算一样。 这些修改引用了一个静态位置矩形, 其边缘表示盒子从其包含块的每一侧的静态位置

静态位置矩形及其对应的静态位置 由其“假设盒子”的布局模型定义:

块布局
块级盒子静态位置[CSS2] 第 10 章中定义。 静态位置矩形是一个零厚度矩形,跨越盒子静态位置包含块的行内轴两侧(参见 CSS2§10.3.7); 并位于其块起始静态位置(参见 CSS2§10.6.4)。
行内布局
行内级盒子静态位置[CSS2] 第 10 章中定义。 静态位置矩形是一个零厚度矩形,跨越本应包含其“假设盒子”的行盒上边线/下边线两侧 (参见 CSS2§10.3.7); 并位于其行内起始静态位置
弹性布局
弹性容器子元素的静态位置矩形对应于弹性容器内容边缘。 参见 CSS 弹性盒模型 1 § 4.1 绝对定位的弹性子元素
网格布局
默认情况下,网格容器子元素的静态位置矩形对应于网格容器内容边缘。 但是,如果该网格容器同时也是盒子的实际包含块, 则由网格放置属性指定的网格区域将改为建立其静态位置矩形。 参见 [CSS-GRID-1] 中的网格容器子元素的静态位置

10. 变更

2023 年 2 月 17 日工作草案以来的变更包括:

2021 年 12 月 24 日工作草案以来的变更包括:

2020 年 4 月 21 日工作草案以来的变更包括:

2018 年 12 月 6 日工作草案以来的变更包括:

2018 年 8 月 30 日工作草案以来的变更包括一些次要澄清。

2018 年 4 月 23 日工作草案以来的变更包括:

2017 年 9 月 6 日工作草案以来的变更包括:

2017 年 7 月 20 日工作草案以来的变更包括:

2017 年 5 月 15 日工作草案以来的变更包括:

2017 年 4 月 7 日工作草案以来的变更包括:

11. 隐私注意事项

作为一个简单的布局规范, 这没有引入新的隐私注意事项。

12. 安全注意事项

作为一个简单的布局规范, 这没有引入新的安全注意事项。

致谢

特别感谢 David Baron、Javier Fernandez、Markus Mielke、Alex Mogilevsky 以及 CSSWG 2008 年 3 月 F2F 对齐讨论的参与者 对本文所述对齐模型的贡献, 以及 Melanie Richards 对各种对齐关键字的插图。

一致性

文档约定

一致性要求通过描述性断言和 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"> 与其他规范性文本分开, 如下所示: 用户代理(UA)必须提供可访问的替代方案。

一致性类别

本规范的一致性 针对三个一致性类别进行定义:

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

如果样式表中使用本模块定义的语法的所有语句都根据通用 CSS 语法和本模块中定义的每个功能的各个语法有效, 则该样式表符合本规范。

如果渲染器除了按照相应规范定义解释样式表外, 还通过正确解析并相应地渲染文档来支持本规范定义的所有功能, 则该渲染器符合本规范。但是,由于设备限制导致 UA 无法正确渲染文档, 并不会使 UA 不符合规范。(例如,不要求 UA 在单色监视器上渲染颜色。)

如果创作工具编写的样式表根据通用 CSS 语法和本模块中每个功能的各个语法在语法上是正确的, 并且满足本模块中描述的样式表的所有其他一致性要求, 则该创作工具符合本规范。

部分实现

为了使作者能够利用向前兼容的解析规则来分配回退值, CSS 渲染器必须将任何它们没有可用支持级别的 @规则、属性、属性值、关键字和其他语法结构视为无效(并酌情忽略)。 特别是,用户代理不得在单个多值属性声明中选择性地忽略不受支持的组件值并接受受支持的值: 如果任何值被视为无效(不受支持的值必须如此),CSS 要求忽略整个声明。

不稳定和专有功能的实现

为避免与未来稳定的 CSS 功能冲突, CSS 工作组(CSSWG)建议在实现不稳定功能和 CSS 专有扩展遵循最佳实践

非实验性实现

一旦规范达到候选推荐(Candidate Recommendation)阶段, 就可以进行非实验性实现,实现者应发布任何他们可以证明已根据规范正确实现的 CR 级别功能的无前缀实现。

为了建立和维护 CSS 在不同实现之间的互操作性, CSS 工作组要求非实验性 CSS 渲染器在发布任何 CSS 功能的无前缀实现之前, 向 W3C 提交一份实现报告(以及必要时,该实现报告中使用的测试用例)。 提交给 W3C 的测试用例将由 CSS 工作组审查和更正。

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

索引

本规范定义的术语

引用定义的术语

参考文献

规范性引用

[CSS-BOX-4]
Elika Etemad. CSS Box Model Module Level 4. 2024 年 8 月 4 日. 工作草案. 链接: https://www.w3.org/TR/css-box-4/
[CSS-BREAK-4]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 4. 2018 年 12 月 18 日. 初次公开发布的工作草案. 链接: https://www.w3.org/TR/css-break-4/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 2022 年 1 月 13 日. 候选推荐标准. 链接: https://www.w3.org/TR/css-cascade-5/
[CSS-DISPLAY-4]
Elika Etemad; Tab Atkins Jr.. CSS Display Module Level 4. 2024 年 12 月 19 日. 初次公开发布的工作草案. 链接: https://www.w3.org/TR/css-display-4/
[CSS-FLEXBOX-1]
Tab Atkins Jr.; et al. CSS Flexible Box Layout Module Level 1. 2018 年 11 月 19 日. 候选推荐标准. 链接: https://www.w3.org/TR/css-flexbox-1/
[CSS-FONTS-4]
Chris Lilley. CSS Fonts Module Level 4. 2024 年 2 月 1 日. 工作草案. 链接: https://www.w3.org/TR/css-fonts-4/
[CSS-GRID-1]
Tab Atkins Jr.; et al. CSS Grid Layout Module Level 1. 2020 年 12 月 18 日. 候选推荐标准草案. 链接: https://www.w3.org/TR/css-grid-1/
[CSS-GRID-2]
Tab Atkins Jr.; Elika Etemad; Rossen Atanassov. CSS Grid Layout Module Level 2. 2020 年 12 月 18 日. 候选推荐标准草案. 链接: https://www.w3.org/TR/css-grid-2/
[CSS-INLINE-3]
Elika Etemad. CSS Inline Layout Module Level 3. 2024 年 12 月 18 日. 工作草案. 链接: https://www.w3.org/TR/css-inline-3/
[CSS-LOGICAL-1]
Rossen Atanassov; Elika Etemad. CSS Logical Properties and Values Level 1. 2018 年 8 月 27 日. 工作草案. 链接: https://www.w3.org/TR/css-logical-1/
[CSS-MULTICOL-1]
Florian Rivoal; Rachel Andrew. CSS Multi-column Layout Module Level 1. 2024 年 5 月 16 日. 候选推荐标准. 链接: https://www.w3.org/TR/css-multicol-1/
[CSS-MULTICOL-2]
Florian Rivoal; Rachel Andrew. CSS Multi-column Layout Module Level 2. 2024 年 12 月 19 日. 初次公开发布的工作草案. 链接: https://www.w3.org/TR/css-multicol-2/
[CSS-OVERFLOW-3]
Elika Etemad; Florian Rivoal. CSS Overflow Module Level 3. 2023 年 3 月 29 日. 工作草案. 链接: https://www.w3.org/TR/css-overflow-3/
[CSS-POSITION-3]
Elika Etemad; Tab Atkins Jr.. CSS Positioned Layout Module Level 3. 2025 年 3 月 11 日. 工作草案. 链接: https://www.w3.org/TR/css-position-3/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS Box Sizing Module Level 3. 2021 年 12 月 17 日. 工作草案. 链接: https://www.w3.org/TR/css-sizing-3/
[CSS-SIZING-4]
Tab Atkins Jr.; Elika Etemad; Jen Simmons. CSS Box Sizing Module Level 4. 2021 年 5 月 20 日. 工作草案. 链接: https://www.w3.org/TR/css-sizing-4/
[CSS-TEXT-3]
Elika Etemad; Koji Ishii; Florian Rivoal. CSS Text Module Level 3. 2024 年 9 月 30 日. 候选推荐标准草案. 链接: https://www.w3.org/TR/css-text-3/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2024 年 3 月 22 日. 候选推荐标准草案. 链接: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2024 年 3 月 12 日. 工作草案. 链接: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-3]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 3. 2019 年 12 月 10 日. W3C 推荐标准. 链接: https://www.w3.org/TR/css-writing-modes-3/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 2019 年 7 月 30 日. 候选推荐标准. 链接: https://www.w3.org/TR/css-writing-modes-4/
[CSS2]
Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011 年 6 月 7 日. W3C 推荐标准. 链接: https://www.w3.org/TR/CSS21/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997 年 3 月. 最佳当前实践. 链接: https://datatracker.ietf.org/doc/html/rfc2119
[SELECTORS-3]
Tantek Çelik; et al. Selectors Level 3. 2018 年 11 月 6 日. W3C 推荐标准. 链接: https://www.w3.org/TR/selectors-3/
[SOURCEMAP]
Source map format specification. 编辑草案. 链接: https://tc39.es/source-map/

信息性引用

[CSS-BREAK-3]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 3. 2018 年 12 月 4 日. 候选推荐标准. 链接: https://www.w3.org/TR/css-break-3/
[CSS-DISPLAY-3]
Elika Etemad; Tab Atkins Jr.. CSS Display Module Level 3. 2023 年 3 月 30 日. 候选推荐标准. 链接: https://www.w3.org/TR/css-display-3/
[CSSOM-1]
Daniel Glazman; Emilio Cobos Álvarez. CSS Object Model (CSSOM). 2021 年 8 月 26 日. 工作草案. 链接: https://www.w3.org/TR/cssom-1/

属性索引

名称 初始值 适用于 继承 百分比 动画类型 规范顺序 计算值
align-content normal | <baseline-position> | <content-distribution> | <overflow-position>? <content-position> normal 块容器、多列容器、弹性容器和网格容器 不适用 离散 根据语法 指定的关键字
align-items normal | stretch | <baseline-position> | [ <overflow-position>? <self-position> ] normal 所有元素 不适用 离散 根据语法 指定的关键字
align-self auto | normal | stretch | <baseline-position> | <overflow-position>? <self-position> auto 弹性项目、网格项目和绝对定位的盒子 不适用 离散 根据语法 指定的关键字
column-gap normal | <length-percentage [0,∞]> normal 多列容器、弹性容器、网格容器 见说明 按计算值类型 根据语法 指定的关键字,否则为计算的 <length-percentage> 值
gap <'row-gap'> <'column-gap'>? 参见独立属性 多列容器、弹性容器、网格容器 参照内容区域的相应维度 按计算值类型 根据语法 参见独立属性
justify-content normal | <content-distribution> | <overflow-position>? [ <content-position> | left | right ] normal 多列容器、弹性容器和网格容器 不适用 离散 根据语法 指定的关键字
justify-items normal | stretch | <baseline-position> | <overflow-position>? [ <self-position> | left | right ] | legacy | legacy && [ left | right | center ] legacy 所有元素 不适用 离散 根据语法 指定的关键字,legacy 除外(见正文)
justify-self auto | normal | stretch | <baseline-position> | <overflow-position>? [ <self-position> | left | right ] auto 块级盒、绝对定位盒和网格项目 不适用 离散 根据语法 指定的关键字
place-content <'align-content'> <'justify-content'>? normal 块容器、弹性容器和网格容器 不适用 离散 根据语法 参见独立属性
place-items <'align-items'> <'justify-items'>? 参见独立属性 所有元素 不适用 离散 根据语法 参见独立属性
place-self <'align-self'> <'justify-self'>? auto 块级盒、绝对定位盒和网格项目 不适用 离散 根据语法 参见独立属性
row-gap normal | <length-percentage [0,∞]> normal 多列容器、弹性容器、网格容器 见说明 按计算值类型 根据语法 指定的关键字,否则为计算的 <length-percentage> 值

问题索引

使其更容易理解“start”和“end”相对于正交流的双轴特性。
在此处添加示例图片。
实现“智能”默认行为可能与 Web 不兼容 (尽管我们希望如此,并认为很有可能), 因此 UA 应将关于此点的任何反馈传递给 WG。 尚未实现“智能”默认行为的 UA 在块容器上的 align-content 必须表现为 safe, 否则表现为 unsafe
也替换此图片。