CSS 内联布局模块 第3级

W3C 工作草案

关于此文档的更多详细信息
此版本:
https://www.w3.org/TR/2024/WD-css-inline-3-20241218/
最新发布版本:
https://www.w3.org/TR/css-inline-3/
编辑草案:
https://drafts.csswg.org/css-inline-3/
以前的版本:
历史记录:
https://www.w3.org/standards/history/css-inline-3/
反馈:
CSSWG 问题存储库
规范中的内联问题
编辑者:
Elika J. Etemad / fantasai (Apple)
前编辑者:
(Hachette Livre)
(Adobe)
建议修改此规范:
GitHub 编辑器
问题列表:
GitHub 中的 CSS3 行布局问题

摘要

CSS 格式化模型为容器中的元素和文本提供了一个包装成行的流。本模块描述了该内联布局模型的框模型,并定义了内联级内容的块轴对齐和尺寸,扩展了 [CSS2] 中的模型。它还增加了用于首字下沉的特殊布局模式。

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

本文件状态

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

该文档由 CSS 工作组 作为 工作草案 使用推荐轨道发布。 作为工作草案发布不意味着得到了 W3C 及其成员的认可。

这是一个草稿文档,可能会随时更新、替换或被其他文档废除。不适合将此文档作为除工作进展以外的其他引用。

请通过在 GitHub 中提交问题(优先),并在标题中包括规范代码“css-inline”,例如: “[css-inline] …评论摘要…”的方式来发送反馈。 所有问题和评论均被存档。 另外,反馈也可以发送到(存档的)公共邮件列表www-style@w3.org

本文件受 2023年11月3日 W3C 流程文件管辖。

本文件由在 W3C 专利政策 下运作的小组制作。 W3C 维护了与本小组的交付物有关的任何专利披露的公开列表; 该页面还包含有关披露专利的说明。 个人如果实际了解认为包含必要权利要求的专利,必须根据 W3C 专利政策第 6 节 披露信息。

以下功能存在风险,可能在 CR 期间被删除:

“存在风险”是 W3C 流程中的术语,不一定意味着该功能有被删除或推迟的危险。这意味着工作组认为该功能可能在及时互操作实现方面遇到困难,将其标记为存在风险可以在过渡到建议阶段时,如果必要的话不发布该功能而无需先发布一个没有该功能的新候选推荐。

1. 简介

本模块定义了 内联布局,即 CSS 模型,用于布局包含文本和 内联级框的混合流,并定义了该内容在每一行内的 块轴对齐和尺寸控制。此外,它还添加了一个用于首字母下沉等特殊样式的布局模式

注意:行内级内容的换行、对齐等方面在CSS 文本模块中处理。

这里的许多布局方面依赖于字体度量。虽然相关的度量在拉丁/西里尔/希腊文和 CJK 的 OpenType 中存在,但对许多其他书写系统则缺失。例如,希伯来语的视觉顶部度量在 OpenType 表中没有相应的度量。为了使本模块能适用于全世界,我们需要字体为所有书写系统提供相关的度量,这意味着 OpenType 需要允许这些度量,并且字体设计师需要提供准确的数字。参见 issue联络声明

1.1. 模块交互

本模块替换并扩展了 [CSS2] 第10.8节中定义的 CSS 内联布局模型及功能。

1.2. 值定义

本规范遵循来自 CSS 属性定义约定,采用 [CSS2]值定义语法,并使用 [CSS-VALUES-3] 的规范。未在本规范中定义的值类型由 CSS 值和单位模块 [CSS-VALUES-3] 定义。与其他 CSS 模块的结合可能会扩展这些值类型的定义。

除在各自定义中列出的特定属性值外,本规范中定义的所有属性还接受 CSS 全局关键词 作为其属性值。为了可读性,这些值没有被重复列出。

2. 内联布局模型

内联布局中,文本和 内联级框的混合递归流,形成 内联格式化上下文,并在 块容器内通过分割它们为一组 行框来布局。在每个行框内,内联级框沿着 块轴相互对齐,通常通过其文本的基线进行对齐。

任何直接包含 内联级内容的块容器——如内联框原子内联框文本序列——会建立一个内联格式化上下文,以使用内联布局来布局其内容。块容器内容边缘为其参与内联格式化上下文的每个内联级框形成了包含块

块容器还会生成一个根内联框,它是一个匿名 内联框,用于容纳其所有的内联级内容。(因此,内联格式化上下文中的所有文本都是直接包含在一个内联框中的,无论是根内联框还是它的某个子元素。)根内联框从其父级块容器继承样式,但本身无法应用样式。

内联格式化上下文中,内容沿着内联轴进行布局,按照 Unicode 双向算法及其控制 [CSS-WRITING-MODES-3] 排序,并根据 [CSS-TEXT-3] 中的排版控制进行分布。内联轴外边距边框内边距内联级框之间均被尊重(且它们的外边距不会折叠)。形成一行内联级内容的框所包含的结果矩形区域称为行框

注意:行框内联框内联级框是不同的概念!参见 [CSS-DISPLAY-3] 以深入讨论框类型和相关术语。

2.1. 行框的布局

行框会根据需要创建,以容纳内联级内容,位于内联格式化上下文中。当内联框超出行框逻辑宽度,或包含强制换行时,会将其拆分为多个片段 [CSS-BREAK-3],并分布在多个行框中。与 列框多列布局 [CSS-MULTICOL-1]中一样,行框是由其分片容器生成的格式化上下文,并不是 CSS 框树的一部分。

注意:内联框也可以因双向文本处理而在同一个行框内拆分为多个片段。参见 [CSS-WRITING-MODES-3]

行盒作为块容器盒的直接内容,在其块流动方向上堆叠,并根据 align-content [CSS-ALIGN-3] 在此容器内对齐。因此,一个行内格式化上下文由一叠行盒组成。行盒之间没有间隔地堆叠(除非另有规定,例如浮动清除),并且它们从不重叠。

通常,行盒行左边缘接触其包含块行左边缘,而行右边缘接触其包含块行右边缘,因此行盒的逻辑宽度等于其包含块内部逻辑宽度(即块容器内容框)。然而,浮动盒或首字母盒可以位于包含块边缘和行盒边缘之间,从而减少任何受影响的行盒的可用空间,进而减少其逻辑宽度。(参见 层叠样式表级别 2 修订版 1 (CSS 2.1) 规范 § visuren#inline-formatting/层叠样式表级别 2 修订版 1 (CSS 2.1) 规范 § visuren#floats§ 7 首字母。)

行框的逻辑高度在其内容块轴对齐后进行调整。该调整受 line-heightline-fit-edge 控制。块容器中的首行/末行行框还可以通过 text-box-trim 进行修剪。

如上所述,内联框拆分为多个行框的示意图
内联布局框模型

2.2. 行框内的布局

上文所述,用户代理会将内联级框流入一组 行框中。在每个 行框内进行布局,独立计算每个框片段行框的尺寸和位置,具体如下:

  1. 基线对齐:所有 流内内联级框行框中根据 块轴dominant-baselinevertical-align 对齐,这称为基线对齐。对于 行相对值baseline-shift,假设其对齐方式为最小化行框高度。

  2. 内容尺寸贡献计算:计算每个 内联级框行框中的 布局边界(即尺寸贡献):

  3. 行框尺寸调整:行框逻辑高度调整为完全包含其所有布局边界内联级框

  4. 内容定位:根内联框对齐子树和用于 baseline-shift行相对值行框内定位。

    需要定义对于顶部/底部/居中对齐的框高度大于其他内容时应如何处理。

注意:空的 内联框仍然有 外边距内边距边框line-height,因此与有内容的框一样会影响这些计算。

2.3. 幽灵行盒

行盒,如果不包含文本、没有保留的空白字符、没有行内轴外边距内边距边框非零的行内框,也没有其他流内内容(例如原子行内元素ruby 注解),并且不是以强制换行符结尾,则被称为幽灵行盒。在确定任何后代内容(例如绝对定位的框)的位置时,此类框必须被视为空高度行盒,并且行盒及其流内内容在任何其他布局或渲染目的中都必须被视为不存在。

什么是不可见的?

此类幽灵行盒,仍然可以包含未设置样式的空行内框流外框和/或折叠的文档空白字符,在以下情况中会被忽略,例如:

Firefox 允许幽灵行盒内的行内框接受轮廓,这使其能够显示焦点环。与其他浏览器一样,所有其他可能使元素可见的属性(例如 box-shadow)似乎都被忽略了。

2.4. 绘制顺序

除非对定位框另有规定(参见 [CSS-POSITION-3]),内联级框文档顺序进行绘制;z-index属性通常不适用。

3. 基线和对齐度量

3.1. 基线简介

基线是沿着行框的内联轴的一条线,用于对齐文本中的各个字形。基线指导字形在字体中的设计(例如,大多数字母字形的底部通常与字母基线对齐),并在排版时指导来自不同字体或不同字体大小的字形对齐。

两种字体大小的字母文本,显示基线和em框

两种字体大小的字母文本,显示基线和em框

不同的书写系统偏好不同的基线

拉丁文偏好字母基线,大多数字母位于其上,但一些字母有下垂部分悬挂其下。印度文字有时使用悬挂基线排版,因为其字形形状似乎悬挂在水平线上。基于汉字的系统,其字形被设计为填充方块,通常对齐在底部或中心。

各种书写系统中的首选基线

一个构造良好的字体包含一个基线表,它指示字体设计坐标空间中的一个或多个基线的位置。(设计坐标空间会随字体大小进行缩放。)

在设计良好的混合书写系统字体中,字形被定位在坐标空间内,以在排版时彼此协调。然后构建基线表以匹配字形的形状,每个基线的位置与其首选书写系统的字形匹配。

基线表是字体的一个属性,多个基线的位置适用于字体中的所有字形。

对于横排文本和竖排文本,可以提供不同的基线表。用户代理应在垂直排版模式中使用垂直基线表,其他情况下使用水平基线表。

注意:字体在每个轴上可以有多个基线表;用户代理应根据font-language-override属性和内容语言选择合适的基线表。

3.2. 基线和度量

CSS 使用以下基于文本的度量作为基线,用于对齐、盒子尺寸和首字母布局等内联布局功能。

CSS 工作组希望了解每个使用这些基线的属性(如 dominant-baselinealignment-baselinetext-box-edgeline-fit-edgeinitial-letter-align)所需的基线值,如果有任何可以删除或需要添加的,请参考 Issue 859

字母基线
用于书写拉丁文、西里尔文、希腊文及许多其他文字, 对应于大多数(但不是全部)字符的底部,例如“m”、“Ш”、“Δ”。 通常在字体设计坐标系统中表示为零; 在 OpenType 中指定为 romn, 在 TrueType AAT 中指定为 bsln 值零。
大写高度
对应于大写字母的顶部(如 “T”、“Б”、“Σ”)在拉丁文、西里尔文、希腊文等。 使用 OpenType 中的 sCapHeight 计算。
x-高度
对应于短小写字母的顶部(如 “m”、“л”、“α”)在拉丁文、西里尔文、希腊文等。 使用 OpenType 中的 sxHeight 计算。
x-中间
对应于 字母基线x-高度基线 之间的中点。
表意上方
对应于 CJK(汉字/韩文/假名)文本的 line-over 设计边缘。 在 OpenType 中指定为 idtp
表意下方
对应于 CJK(汉字/韩文/假名)文本的 line-under 设计边缘。 在 OpenType 中指定为 ideo
中央基线
对应于表意中央基线,位于 表意下方基线表意上方基线 之间的中点。 在 TrueType AAT 中指定为 bsln 值 1。
表意墨迹上方
对应于 CJK(汉字/韩文/假名)文本的 line-over 墨迹边缘。 在 OpenType 中指定为 icft
表意墨迹下方
对应于 CJK(汉字/韩文/假名)文本的 line-under 墨迹边缘。 在 OpenType 中指定为 icfb
悬挂基线
对应于从中悬挂藏文和类似独立音节文字的悬挂基线,这些文字有明显但不绝对的顶部边缘。 在 OpenType 中指定为 hang,在 TrueType AAT 中指定为 bsln 值 3。
数学基线
对应于围绕数学字符设计的中心基线。 在 OpenType 中指定为 math,在 TrueType AAT 中指定为 bsln 值 4。
文本上方
对应于用作行内框内容框线上方边缘的度量标准,根据[CSS2]
文本下方
对应于用作行内框内容框线下方边缘的度量标准,根据[CSS2]
em-上方
对应于概念上的 上升度量,经标准化确保 em-上方em-下方 之间为 1em。 参见 A.1: 计算 Em-上方和 Em-下方
em-下方
对应于概念上的 下降度量,经标准化确保 em-上方em-下方 之间为 1em。 参见 A.1: 计算 Em-上方和 Em-下方

注意:这些度量是光学设计度量,因此不一定与实际字形轮廓完全对应。

通常,这些度量从适当的字体中获得,但如果缺少或者需要从盒子而不是文本中派生出来,它们必须进行合成,参见第 3.3 节 字形和盒子的基线附录A:对齐度量的合成

3.2.1. 上升和下降度量

CSS 假设每个字体都有字体度量,指定了基线之上的特征高度——称为上升度量——以及基线下方的特征深度——称为下降度量——CSS 使用这些度量在内联格式化上下文中布局文本和盒子。请注意,这些是整个字体的度量,不一定与任何单个字形的升部和降部相对应。

注意:建议使用 OpenType 或 TrueType 字体的实现使用字体 OS/2 表中的 sTypoAscendersTypoDescender 度量(按当前元素的字体大小进行缩放)来查找 CSS 布局的 上升度量下降度量。如果没有这些度量,应使用 HHEA 表中的 "Ascent" 和 "Descent" 度量。

3.2.2. 行间距度量

字体格式允许为字体推荐“行间距”或“外部前导”度量。此度量称为行间距度量,当line-heightnormal时,可能会纳入行盒子逻辑高度计算,如第 5.3 节 计算内联盒子的逻辑高度贡献(“布局边界”)中所述。

注意:在 OpenType 中,行间距度量可以在 sTypoLineGaphhea.lineGap 中找到。

用户代理必须将行间距度量的最小值设置为零。

3.3. 字形和盒子的基线

假设每个字体、字形和内联级别盒子都有各自的基线坐标,用于表示各个基线类型在其块轴上的位置。这组基线称为其基线集合。从该集合中用于对齐盒子或字形的基线称为其对齐基线;用于在内部对齐其内容的基线称为其主导基线

对于单个字形,基线集合源自字体的基线表。对于内联盒子,它源自其第一个可用字体,无论盒子是否实际包含该字体的任何字形。如果字体缺少必要的度量,用户代理必须对其进行合成,参见A.2:合成基线(及其他字体度量)

对于其他,其基线集名义上是根据baseline-source及其参与的格式化上下文的规则从其内容派生的。对于在行内格式化上下文行内轴中没有基线集原子行内框,其对齐基线是从其外边距框合成的,请参见附录 A.3:为原子行内元素合成基线

4. 基线对齐

尽管大多数 CSS 格式化上下文通过相对于容器的边缘对齐盒子来定位内容,内联布局块轴方向上通过彼此对齐来定位盒子,使用它们的基线

更具体地说,(除非使用与行相关的偏移值)每个字形或内联级别盒子块轴方向上通过定位其对齐基线来与其父元素的对应基线对齐(即其对齐上下文),然后可能根据其后对齐偏移进行偏移。

注意: 基线对齐总是匹配对应的基线:字母基线对字母基线,悬挂基线对悬挂基线,数学基线对数学基线等。

当对齐一个盒子时,对齐基线根据其alignment-baselinebaseline-source值来选择(参见速记属性vertical-align),默认情况下匹配父元素的dominant-baseline。对于字形,对齐基线总是由父元素的主导基线确定。

给出以下示例标记:

<p><span class="outer">Ap <span class="inner">ਜੀ</span></span></p>

以及以下样式规则:

.inner { font-size: 75%; }

父元素(.outer)和子元素(.inner)的基线集合由于字体大小的差异不会匹配。子盒子通过匹配它们的字母基线与其父元素对齐。

在此示例中,基线集合中每个基线之间的距离在字体大小为 75% 的 span 中压缩 75%。然而,它们的字母基线是对齐的。

此处使用了字母基线,因为默认情况下,盒子的对齐基线与其父元素的主导基线匹配,而在水平排版模式中,主导基线本身默认为字母基线

如果我们在上面的示例中为.inner元素添加vertical-align: super,则使用相同的规则将.inner子元素对齐到其父元素;但除了基线对齐外,子元素还被移到上标位置。

在此示例中,最终对齐等同于将父元素的基线表向上偏移其上标偏移量,然后将子元素的字母基线对齐到父元素上标位置的字母基线。

4.1. 主导基线:dominant-baseline属性

名称: dominant-baseline
值: auto | text-bottom | alphabetic | ideographic | middle | central | mathematical | hanging | text-top
初始值: auto
适用于: 块容器、内联盒子、表行、网格容器、弹性容器和 SVG 文本内容元素
继承:
百分比: N/A
计算值: 指定的关键字
规范顺序: 按语法
动画类型: 离散

此属性指定了主导基线,这是用于在盒子内对齐内容的默认基线类型。

对于内联盒子主导基线用于对齐盒子的文本(除非另有指定,使用vertical-align)及其任何内联级别的子盒子,通过将每个字形/盒子的对应基线与盒子本身的主导基线对齐来实现。对于其他盒子,它指示了在盒子的对齐上下文中参与基线对齐的任何盒子的默认对齐基线;参见(alignment-baseline: baseline[CSS-ALIGN-3])。

值具有以下含义:

auto
等价于在水平书写模式和在垂直书写模式text-orientationsideways时等同于alphabetic。在 垂直书写模式中,当text-orientationmixedupright时等同于central

然而,在 SVG 文本中,字形的原点(用于基于坐标的字形定位)始终按照 central 处理,在 垂直书写模式中。

text-bottom
使用文本下方基线
alphabetic
使用字母基线
ideographic
使用表意文字下方基线
middle
使用x 中间基线;除非在 text-orientation: upright 下(其中 字母基线x 高度基线基本无意义),则使用中心基线
central
使用中心基线
mathematical
使用数学基线
hanging
使用悬挂基线
text-top
使用文本上方基线

参见 [CSS-WRITING-MODES-3] 了解主导基线的介绍。

为混合的垂直方向定义行为,当指定的基线不是中心时不要显得无意义。

4.2. 横向盒子对齐:vertical-align 属性

名称: vertical-align
值: [ first | last] || <'alignment-baseline'> || <'baseline-shift'>
初始值: baseline
适用于: 见各个属性
继承:
百分比: N/A
计算值: 见各个属性
动画类型: 见各个属性
规范顺序: 按语法

这个简写属性通过指定其对齐基线类型(alignment-baseline)、基线对齐偏好baseline-source)和对齐后偏移baseline-shift)来指定如何在行内对齐一个内联级别盒子。

如果指定了firstlast,它会设置baseline-source(否则重置为auto)。其他值与对应的长属性一致,见下文。

作者应使用这个简写(vertical-align),除非特定情况下需要独立级联其长属性或(在 SVG 元素上)支持遗留 SVG 实现。

注意:vertical-align 也可以影响表格单元格的对齐,当 align-contentnormal 时,尤其如此。具体来说,topbaseline-shift: top)将其映射为 startbottombaseline-shift: bottom)映射为 end,否则middlealignment-baseline: middle)映射为 center。参见 CSS Box Alignment 3 § 5.1.1 块容器(包括表格单元格)

4.2.1. 对齐基线来源:baseline-source 长属性

名称: baseline-source
值: auto | first | last
初始值: auto
适用于: 内联级别盒子
继承:
百分比: N/A
计算值: 指定的关键字
规范顺序: 按语法
动画类型: 离散

当一个内联级别盒子有多个可能的基线信息来源时(例如多行内联块或内联弹性容器),此属性指定是优先使用首个基线集还是最后一个基线集进行对齐,表示盒子的基线对齐偏好。值有以下含义:

auto
最后基线对齐内联块,其他内容使用首个基线对齐
first
指定为首个基线对齐
last
指定为最后基线对齐

有关如何查找除内联盒子以外的盒子的基线信息,请参见 CSS Box Alignment 3 § 9.1 确定盒子的基线

4.2.2. 对齐基线类型:alignment-baseline 长属性

名称: alignment-baseline
值: baseline | text-bottom | alphabetic | ideographic | middle | central | mathematical | text-top
初始值: baseline
适用于: 内联级别盒子、弹性项目、网格项目、表格单元格和 SVG 文本内容元素
继承:
百分比: N/A
计算值: 指定的关键字
规范顺序: 按语法
动画类型: 离散

此属性指定盒子的对齐基线:在应用其对齐后偏移(如适用)之前用于对齐盒子的基线

值定义如下:

baseline
使用父元素的主导基线选择。
text-bottom
使用文本底部基线
alphabetic
使用字母基线
ideographic
使用表意字符基线
middle
通常使用x-中间基线;但在text-orientation: upright的情况下(字母基线x-高度基线基本上没有意义),改用中央基线
central
使用中央基线
mathematical
使用数学基线
text-top
使用文本顶部基线

在执行基线对齐时,这些值指定盒子的哪个基线与其对齐上下文的相应基线对齐。(在内联格式化上下文中,内联级别盒子片段和字形共享一个由其父级内联盒子片段沿其内联轴建立的对齐上下文。)对于其他格式化上下文,请参见 CSS Box Alignment 3 § 9.2 基线对齐分组。在 SVG 文本布局中,这些值指定与 SVG 当前文本位置对齐的基线。

4.2.2.1. SVG 的遗留值

SVG 实现可以支持以下别名,以支持旧版内容:

这些值不允许在 vertical-align 简写属性中使用。

4.2.3. 对齐后偏移:baseline-shift 长属性

名称: baseline-shift
值: <length-percentage> | sub | super | top | center | bottom
初始值: 0
适用于: 内联级别盒子和 SVG 文本内容元素
继承:
百分比: 相对于line-height的已用值
计算值: 指定的关键字或计算的<length-percentage>
规范顺序: 按语法
动画类型: 按计算值类型

此属性指定盒子的对齐后偏移。基线相对偏移值baseline-relative shift values <length-percentage>subsuper 相对于基线对齐位置偏移盒子,而线相对偏移值 line-relative shift values topcenter,和 bottom 则相对于内联盒子及其内容相对于其行盒边界的偏移。

作者应使用自 CSS1 以来已存在的vertical-align速记属性,而不是此 baseline-shift 长属性(除非是在 SVG 内容中,相反,baseline-shift 在旧的用户代理中更广泛地支持)。

值的含义如下:

<length>
根据指定长度提升(正值)或降低(负值)。
<percentage>
根据line-height的指定百分比提升(正值)或降低(负值)。
sub
适当降低父盒子下标的偏移量。UA 可以使用父元素的字体度量找到这个偏移量,否则默认为下降父元素使用的font-size的五分之一。
super
适当提升父盒子的上标偏移量。UA 可以使用父元素的字体度量找到这个偏移量,否则默认为提升父元素使用的font-size的三分之一。
top
行顶部边缘与对齐子树对齐到行盒的行顶部边缘。
center
对齐子树的中心与行盒的中心对齐。
bottom
行底部边缘与对齐子树对齐到行盒的行底部边缘。

对齐子树 指的是一个 内联框布局边界 及其所有子 内联框对齐子树, 这些子框的计算后的 alignment-baseline 值不是 行相对移位值对齐子树line-over 边是子树中 布局边界 的最高 over 边, 而 line-under 边则是最低的。

行相对移位值 并不完全适合 alignment-baselinebaseline-shift 之间的二分法。 对两者各自都有 不错的 论据。 目前它们被草拟在此,但如果有强有力的理由将它们移动,请提交一个问题以供考虑。

4.2.3.1. SVG 的遗留值

用户代理可以另外支持关键字baseline,其计算结果为 0,以便支持遗留的 SVG 内容。此值不允许在vertical-align速记属性中使用。

我们希望移除baseline值,并正在寻求 SVG 用户代理的反馈,了解它是否必要。

5. 逻辑高度和行间距

块轴方向的行盒的尺寸取决于其对齐方式及其内联级内容的大小。此尺寸由line-heightline-fit-edge属性控制。

5.1. 行距:line-height属性

名称: line-height
值: normal | <number [0,∞]> | <length-percentage [0,∞]>
初始值: normal
适用于: 不可替换的内联框和 SVG 文本内容元素
继承:
百分比: 相对于 1em 计算
计算值: 指定的关键字、数字或计算的<length>
规范顺序: 按语法
动画类型: 按计算值类型

此属性指定盒子的首选行高,用于计算其“布局边界”,即其对其逻辑高度的贡献(参见§ 5.3 计算内联框的逻辑高度贡献(“布局边界”))。

注意:当在根内联框上指定时,它适用于块容器line-height有效地建立了块的行盒的最小高度。

此属性的值具有以下含义:

normal
基于字体度量自动确定首选行高
<length [0,∞]>
指定的长度用作首选行高。负值是非法的。
<number [0,∞]>
首选行高是此数字乘以元素的计算字号。负值是非法的。 计算值指定值相同。
<percentage [0,∞]>
属性的首选行高计算值是元素计算字号的此百分比。负值是非法的。

注意:除了首选可用字体外,其他字体的度量仅影响具有line-height: normal内联盒子布局边界

以下示例中的三个规则具有相同的使用行高:
div { line-height: 1.2; font-size: 10pt }     /* number */
div { line-height: 1.2em; font-size: 10pt }   /* length */
div { line-height: 120%; font-size: 10pt }    /* percentage */

但是,它们的继承方式不同:第一个继承为数字,如果后代具有不同的字体大小,将会导致不同的行高;最后两个继承为绝对长度,不受后代字体大小的影响。

百分比计算为长度这一事实令人烦恼。另请参见Issue 3118Issue 2165

注意:line-fit-edgeleading时,内联盒子的边距、边框和填充不会影响行盒的高度计算。然而,它们仍然会围绕这些盒子渲染。这意味着,如果line-height指定的大小小于盒子的大小,背景和边框可能会“渗入”相邻的行盒,可能遮挡先前的内容。

5.2. 文本边缘度量:line-fit-edge属性

名称: line-fit-edge
值: leading | <text-edge>
初始值: leading
适用于: 内联框
继承:
百分比: N/A
计算值: 指定的关键字
规范顺序: 按语法
动画类型: 离散

这是一个提案的早期草案,可能会随着设计批评和用例的注册以及与其他属性的各种细节和交互被解决后发生重大变化。请勿立即实现。

内联框,其主要目的是包含文本,其在块轴上的尺寸基于其字体度量。line-fit-edge属性控制使用哪些度量。这些选择的度量用作内联框(如果它不是根内联框)的布局边界的基础;默认情况下,也用于text-box-trim

<text-edge>值,标识特定的字体度量,展开为

<text-edge> = [ text | ideographic | ideographic-ink ]
              | [ text | ideographic | ideographic-ink | cap | ex ]
                [ text | ideographic | ideographic-ink | alphabetic ]

第一个值指定文本的上缘边缘;第二个值指定文本的下缘边缘。如果只指定一个值,则两个边缘都会分配相同的关键字(如果可能);否则假定缺失值为text

我们是否需要长手属性,或者这个简写就足够了?[Issue #5236]

值的含义如下:

leading
使用上升/下降加上任何正的半行距。边距/填充/边框在用于调整行盒大小时会被忽略。
text
使用文本上缘基线/文本下缘基线作为上缘/下缘边缘。
cap
使用大写字母高度基线作为上缘边缘。
ex
使用x-高度基线作为上缘边缘。
ideographic
使用表意上缘基线/表意下缘基线作为上缘/下缘边缘。
ideographic-ink
使用表意墨上缘基线/表意墨下缘基线作为上缘/下缘边缘。
alphabetic
使用字母基线作为下缘边缘。

text作为上升/下降度量的名称是否合理,还是可以想到更好的?同样适用于leading作为关键字。[Issue #8067]

除非line-fit-edgeleading,否则盒子的边距、填充和边框也会对布局边界做出贡献。

注意:leadingtext值依赖字体的上升下降,确保文本合适。其他值更可能导致由于超出指定度量的上升(例如带变音符号)而导致的重叠或溢出,因此使用这些值的作者需要谨慎提供足够的文本间距,尤其是在多语言环境中。

line-fit-edge 属性的三个不同值。
line-fit-edge 属性,显示了 leadingcapex 的值。 红线表示行内框的布局边界。

此插图与实际字体度量不符,它实际上说明的是大写字母高度,而不是升部。 [问题 #11364]

line-fit-edgeleading时,垂直节奏可能在段落中字体度量或垂直对齐发生变化时被打破。

其他值更可能给出一致的行间距——只要在根内联上添加的半行距足够大以容纳任何后代的指定度量。然而,为了避免行与行之间的重叠,行盒仍然会增长,以容纳那些否则会溢出的内容。

注意:虽然只有leading适用正的半行距,为了允许文本紧密设置,所有值都适用负的半行距,参见§ 5.3 计算内联框的逻辑高度贡献(“布局边界”)。半行距等量应用于文本的两侧;为了更精确地控制重叠,作者可以使用line-fit-edge: text与受影响文本上的负边距

5.3. 计算内联框的逻辑高度贡献(“布局边界”)

内联框的inline box对其逻辑高度的贡献,这里称为其布局边界,始终相对于其自身的文本度量进行计算,如下所述,并由line-fit-edgeline-height控制。子框的大小和位置不会影响其布局边界(也不会影响它自身的逻辑高度,参见inline-sizing)。

注意:布局边界不必对应于框的边缘

要找到内联框的布局边界,UA必须首先将内联框直接包含的所有字形按其主基线对齐。(参见§ 3.3 字形和框的基线。)如果内联框完全不包含任何字形,或仅包含来自回退字体的字形,则认为它包含一个“支柱”(一个零宽度的不可见字形),其度量使用框的第一个可用字体

对于每个字形(包括“支柱”),A表示其在基线以上的上升;D表示其在基线以下的下降。除非line-fit-edge指定使用不同的度量,A指的是上升度量(对于给定字体及其给定大小),D指的是下降度量,每个度量都经过调整以考虑主基线相对于零的偏移量。如果line-height计算为normal,并且line-fit-edgeleading或者这是根内联框,则字体的行距度量也可能通过作为半行距的一半添加到每一侧的AD中。

当其计算的line-heightnormal,内联框的布局边界包含了其所有字形,从最高的A到最深的D。(注意,单个框中的字形可能来自不同的字体,因此可能并不都具有相同的AD。)

当其计算的line-height不是normal,其布局边界仅从其第一个可用字体的度量中派生(忽略其他字体的字形),并使用行距调整有效的AD以使其加起来等于使用的line-height。计算LL = line-height - (A + D)。将半个半行距添加到第一个可用字体的A上方,另一半添加到第一个可用字体的D下方,得到有效的上升A′ = A + L/2,以及有效的下降D′ = D + L/2。然而,如果line-fit-edge不是leading且这不是根内联框,如果半行距为正,则将其视为零。布局边界恰好包含此有效的A′D′

注意:L可能是负数。

此外,当line-fit-edge不是leading时,布局边界被每侧的边距边框填充之和膨胀。为了允许负的边距值产生实际效果,负的边距也累积到参与相同内联格式化上下文的任何后代内联框布局边界上。

在怪癖模式[QUIRKS]中,任何具有零边框和填充且不直接包含文本或保留的空白[CSS-TEXT-3]内联框片段在调整行盒大小时被忽略。

6. 修剪文本上下的前导空白

为了确保运行文本的基本情况下的一致间距,CSS行布局在每行文本内容的上下引入前导空白,以确保其line-height。此外,字体的上升和下降度量本身通常在最典型字形的上下包含额外空间,以适应超出典型边界的偶尔字符和附加符号。这防止了相邻行文本相互重叠。然而,所有这些额外的间距干扰了视觉对齐和对有效(视觉上明显的)间距的控制。

text-box属性允许修剪块第一行和最后一行上下的额外空间,从而可以更精确地控制字形周围的间距。通过依赖于字体度量而不是硬编码的长度,此功能可以在调整大小、重新包装以及使用各种字体渲染内容时保持精确的间距。

一个常见的问题是垂直居中。将文本容器垂直居中对齐到一个图标很容易,但由于拉丁文本的视觉边界是大写高度和字母基线,而不是上升和下降,因此这通常无法产生预期的视觉效果。

考虑一些放置在图像右侧的拉丁文本,要在图像的顶部和底部之间居中。测量从图像顶部到文本框顶部的距离为13px;同样测量从图像底部到文本框底部的距离也是13px,理论上可以完美居中文本。然而,从图像顶部到大写高度的距离为21px;从底部到字母基线的距离为19px,显示文本在视觉上实际上并没有居中。
测量到文本的顶部/底部可能得出相等的结果,但测量到视觉边界表明它实际上并未视觉居中。

要在视觉上居中文本,必须假设大写高度和字母基线分别为文本的顶部和底部边缘。

如果文本是视觉居中的,则图像顶部与大写高度之间的距离为20px,图像底部与字母基线之间的距离也是20px。
测量到大写高度/字母基线而不是上升/下降,并使这些距离相等可以使文本在视觉上居中。

通过使用text-box-trim去除大写高度之上和字母基线之下的空白,居中框实际上就是居中文本;并且无论使用何种字体来渲染它,都能可靠地实现。

即使不同的字体具有不同的大写高度,使用字体的度量而不是固定的数字,布局意图在字体更改时也得以实现。

6.1. 文本框修剪的速记:text-box属性

名称: text-box
值: normal | <'text-box-trim'> || <'text-box-edge'>
初始值: normal
适用于: 块容器内联框
是否继承:
百分比: N/A
计算值: 指定的关键字
规范顺序: 按语法
动画类型: 离散

此属性是为简写,用于在单个声明中设置text-box-trimtext-box-edge属性。

如果指定了单个关键字 normal,则它会将 text-box-trim 设置为 none,并将 text-box-edge 设置为 auto。否则,如果省略 text-box-trim 值,则会将其设置为 both(而不是初始值),而如果省略 text-box-edge 值,则会将其设置为 auto(初始值)。

添加示例。

6.2. 修剪文本上方/下方:text-box-trim属性

名称: text-box-trim
值: none | trim-start | trim-end | trim-both
初始值: none
适用于: 块容器和内联框
是否继承:
百分比: N/A
计算值: 指定的关键字
规范顺序: 按语法
动画类型: 离散

行内框上,指定是否修剪内容框以匹配指定的 text-box-edge 度量标准。有关详细信息,请参见 § 5.3 计算行内框的逻辑高度贡献(“布局边界”)

块容器上,以及多列容器的每一列上,指定是否在框内容的开始/结束处修剪半行距,以使其内容边缘更好地匹配其文本内容。在这种情况下,修剪边缘由受影响的行框包含块的开始/结束 text-box-edge 值指定。

值的含义如下:

none
当应用于块容器时,不对第一个/最后一个行框进行特殊处理。

当应用于行内框时,指定上/下内容边缘text-over/text-under 基线重合,而不管 text-box-edge 如何。

trim-start
对于块容器列框:将第一个格式化行块起始侧修剪到其根行内框的指定度量标准。如果没有这样的行,或者如果存在非零的内边距或边框,则无效。

对于行内框:修剪框的块起始侧,以使其内容边缘匹配 text-box-edge 指定的度量标准。

trim-end
对于块容器列框:将最后一个格式化行的块结束侧修剪到其根行内框的指定度量标准。如果没有这样的行,或者如果存在非零的内边距或边框,则无效。

对于行内框:修剪框的块结束侧,以使其内容边缘匹配 text-box-edge 指定的度量标准。

trim-both
同时指定 trim-starttrim-end 的行为。

注意:::first-line 类似,此属性不适用于或不通过 flex、grid 或 table 格式化上下文传播。

注意:writing-modevertical-lr 时,块结束侧与线下侧不重合。

如果多个祖先在同一个行框上指定修剪,则使用的度量标准是请求在该行框侧进行修剪的最内层块容器的度量标准。

注意:由于 text-box-trim 的非初始值而导致内容和墨水溢出框的处理方式与内容以其他方式溢出框或行框的处理方式相同。

::first-line 不同,当应用于多列容器的第一个(或最后一个)格式化行时,此属性适用于多列容器每一列的第一个(或最后一个)格式化行。

如果列被跨栏符分割会发生什么?[问题 #11363]

当应用了 text-box-trim 的框被分片 [CSS-BREAK-3] 分割时,是按片段应用修剪还是仅对其第一个/最后一个片段的开始/结束边缘应用修剪,由 box-decoration-break 确定。

如果在打印时,修剪行框会导致其内容被剪裁,则 UA 可以在该行框的该边缘忽略 text-box-trim

6.3. 文本修剪度量:text-box-edge属性

名称: text-box-edge
值: auto | <text-edge>
初始值: auto
适用于: 块容器行内框
继承性:
百分比: N/A
计算值: 指定的关键字
规范顺序: per grammar
动画类型: 离散

此属性指定用于 text-box-trim 效果的度量标准。值的含义与 line-fit-edge 相同;auto 关键字使用 line-fit-edge 的值,将 leading初始值)解释为 text

注意:此属性可以与 text-box-trim 一起在 text-box 简写属性中设置。与 line-fit-edge 不同,它不继承;但是它的初始值line-fit-edge 复制而来,而 line-fit-edge 是继承的。

6.4. 内联框绘制高度:inline-sizing属性

名称: inline-sizing
值: normal | stretch
初始值: normal
适用于: 行内框,但不包括ruby 容器框内部 ruby 框
继承性:
百分比: 不适用
计算值: 指定关键字
规范顺序: per grammar
动画类型: 离散

这个名称令人困惑。我们需要一个新的名称。或者,将其合并到 text-box-trim 中?[问题 #5189]

此属性指定如何根据行内框的内容来衡量其内容区域逻辑高度。它对框内容、行盒或任何其他内容的大小或位置没有影响。

值的含义如下:

normal
行内框内容区域的大小和位置应适合其第一个可用字体中的(可能是假设的)文本。如果 text-box-trim 指示修剪,则必须使用指定的度量标准。否则,本规范未指定如何操作。用户代理可以使用例如字体的最大升部和降部。(这将确保 em 框上方或下方的字形部分仍落在内容区域内,但会导致不同字体的框大小不同。)

注意:如果使用多种字体(当在不同字体中找到字形时会发生这种情况),则内容区域逻辑高度不受后备字体中字形的影响,仅取决于第一个可用字体。但是,当 line-heightnormal 时,这些后备字形仍会影响行盒大小;请参见§ 5.3 计算行内框的逻辑高度贡献(“布局边界”)

stretch
行盒已调整大小并且其内容已按 normal 定位后,行内框框边缘会移动,使其上方/下方外边距边缘与相应的行盒边缘重合,从而拉伸行内框内部逻辑高度,使其块轴外部大小填充行盒。(其流内内容的大小和位置不受影响。)

注意:height 属性不适用于行内框

注意:line-height行内框的大小没有影响,它仅影响其对行盒逻辑高度的贡献。

7. 首字母

编辑们希望能得到使用非西方文字(特别是印度文字)中的首字下沉的示例。

7.1. 首字母简介

本节为非规范性内容。

自印刷术发明前,使用大而装饰性的字母来开始新段落的做法已存在。事实上,它们的使用甚至早于小写字母的出现。

7.1.1. 首字下沉

首字下沉(或称为“首字大写”)是段落开头比正常大得多的字母,其基线至少比段落的第一条基线低一个行距。首字下沉的大小通常通过其占据的行数来表示。两行和三行的首字下沉非常常见。

占三行的带重音符的E字首字下沉
占三行的带重音符的E字首字下沉。由于首字下沉的字母顶部与正文的字母顶部对齐,其重音符超出了段落顶部。

首字下沉的具体大小和位置取决于其字符的对齐方式。首字大写的参考点必须与正文中的参考点精确对齐。首字下沉的对齐约束取决于书写系统。

在西方书写系统中,顶部参考点是首字母的顶线和正文第一行的顶线。底部参考点是首字母的字母基线以及第 N 行的基线。下图显示了一个简单的两行首字下沉,其中标示了相关的参考线。

显示对齐的首字大写
两行首字下沉,显示了基线(绿色线)、顶线(红线)和升部(青色线)。

在汉字衍生的书写系统中,首字母从第一行字形的块起始边缘延伸到第 N 行字形的块结束边缘。

日文垂直书写的首字下沉
垂直书写模式中的两行首字下沉

在某些印度文字中,顶部对齐点是悬挂基线,而底部对齐点是文本的边后缘。

天城文的首字母
天城文的首字母与悬挂基线对齐。对齐点以红色显示。

7.1.2. 沉底首字母

某些首字下沉样式并不与第一行文本对齐。沉底首字母(或称为“沉底大写”)既低于第一条基线,同时又超出了第一行文本的高度。

沉底首字下沉
沉底首字母。该字母占据两行,但其大小相当于三行首字母。

7.1.3. 上升首字母

上升首字母(通常称为“上升大写”或“突出大写”)“沉降”至第一条文本基线。

注意:相较于简单地增加首字母的字体大小,真正的上升首字母有几个优点。段落其余部分的行距不会改变,但文本仍会避开较大的下降部分。而且如果上升首字母的大小定义为行的整数倍,可以保持隐式基线网格。

上升大写字母
上升大写字母。首字母大小相当于三行首字母,但并不下沉。

7.2. 选择首字母

本节为非规范性内容。

首字母通常是一个字母,尽管它们也可以包括标点符号或用户认为是单个排版单元的字符序列。::first-letter伪元素,定义于[SELECT][CSS-PSEUDO-4],可以用来选择需要格式化为首字母的字符。

需要对首字母包含哪些字符进行更多控制的作者,或者希望对替换元素或多个单词应用首字母格式的作者,可以将initial-letter属性应用于块容器的第一个内联级子元素。

<p>此段落有一个下沉的“T”。
<p><img alt="H" src="illuminated-h.svg">此处我们有一个装饰性的“H”。
<p><span>短语也可以在段落开头</span>应用首字母样式。
::first-letter, /* 样式应用于第一个段落的 T */
img, /* 样式应用于装饰性的 H */
span /* 样式应用于 span 内的短语 */
{ initial-letter: 2; }

注意,由于::first-letter选择了第一个字母前后的标点符号,因此使用::first-letter时,这些字符也会包含在首字母中。

段落中引号和首字母均设置为三行首字下沉
::first-letter伪元素选择了引号以及“M”。

是否应该有办法退出这种行为?请参见GitHub Issue 310

7.3. 创建首字母:initial-letter属性

名称: initial-letter
值: normal | <number [1,∞]> <integer [1,∞]> | <number [1,∞]> && [ drop | raise ]?
初始值: normal
适用对象: 特定的内联级盒子以及::first-letter和在::marker盒子内的元素(参见正文
是否继承:
百分比: 不适用
计算值: 关键字normal或与整数配对的数字
规范顺序: 根据语法
动画类型: 根据计算值类型

此属性指定下沉、上升和沉底首字母的大小下沉深度,以其跨越的行数来定义。

例如,以下代码将在每个紧跟二级标题后的段落开头创建一个2行下沉首字母:
h2 + p::first-letter { initial-letter: 2; }

它取以下值:

normal
无特殊的初始字母效果。文本的行为正常。
<number [1,∞]>
第一个参数定义初始字母的 大小, 以其占据的行数为单位。 小于一的值无效。
<integer [1,∞]>
第二个可选参数 定义初始字母应 下沉 的行数。 值为 1 表示 提升的首字母; 大于 1 的值表示 下沉的首字母。 小于一的值无效。
raise
计算为 初始字母下沉1
drop
计算为 初始字母下沉 等于 初始字母大小 向下取整到最近的正整数。

如果省略了初始字母的下沉深度值,则假定为drop

normal 之外的值会使受影响的框变为 初始字母框, 这是一个具有特殊布局行为的 流内 内联级框

以下是一些initial-letter的使用示例:
initial-letter: 3
initial-letter: 3 3
initial-letter: 3 drop
initial-letter: drop 3
表示一个3行高,3行深的下沉首字母

3行高,3行深

initial-letter: 3 2
表示一个3行高,2行深的沉底首字母

3行高,2行深

initial-letter: 3 1
initial-letter: 3 raise
initial-letter: raise 3
表示一个3行高,1行深的上升首字母

3行高,1行深

initial-letter: 2.51 3
首字母的大小不必为整数行数。在这种情况下,只有顶部对齐。

仅顶部对齐的非整数首字母

结合其他CSS属性,initial-letter可以用来创建“相邻首字母”,即首字母与文本相邻:
p::first-letter {
  initial-letter: 3;
  color: red;
  width: 5em;
  text-align: right;
  margin-left: -5em;
}

p {
  margin-left: 5em;
}
与文本相邻的首字母

7.3.1. 适用性

为了让作者更好地控制哪些字符可以设置首字母样式,并允许多字符首字母(例如首词或首短语样式),initial-letter 属性不仅适用于 CSS 定义的 ::first-letter 伪元素,也适用于内部定位的 ::marker 伪元素以及放置在第一行开头的行内级盒子。具体来说,initial-letter 适用于任何行内级盒子——包括任何此类 ::first-letter::marker 盒子——该盒子是其父盒子的第一个子元素,并且其(如果有)作为其包含块后代的祖先元素都是第一个子行内盒子,且其计算的 initial-letter 值为 normal

例如,以下示例中的<span><em><b>元素 是<p>的“最前的内联级子代”,但<strong>元素则不是:
<p><span><em><b>这是</b>一个短语</em>的样式化<strong>特别的样式化</strong>.</span> …

如果我们应用以下规则:

em { initial-letter: 2; }
b, strong { initial-letter: 3; }

initial-letter属性只会在<em>元素上生效。 <b>上的样式将被忽略,因为它具有已被样式化为首字母的祖先; 而<strong>上的样式也被忽略,因为它是第二个兄弟元素。

结果可能呈现为:

“这是”作为下沉文本跨越两行,剩余的文本环绕在其旁边。

如果将 initial-letter 应用于由于 bidi 重新排序而未定位在行首的行内级盒子,或者其前面有其他行内级内容,则其使用值normal,并且不会将其格式化为首字母

ruby 基础容器盒子的子元素和ruby 容器盒子initial-letter 属性的效果未定义。

注意:initial-letter 属性不能应用于任何 float 不为 noneposition 不为 static 的元素,因为这些值会导致其 display 计算为 block

7.4. 首字母对齐:initial-letter-align属性

如前所述,首字母的对齐取决于所使用的书写系统。 initial-letter-align属性可以用来指定正确的对齐方式。

名称: initial-letter-align
值: [ border-box? [ alphabetic | ideographic | hanging | leading ]? ]!
初始值: alphabetic
适用于: 某些内联级盒子以及::first-letter和内部的::marker盒子(详见正文
是否继承:
百分比: N/A
计算值: 指定的关键字
规范顺序: 按语法
动画类型: 离散

此属性指定用于确定首字母大小和位置的对齐点。需要两组对齐点:首字母对齐点与根行内框的相应点匹配。

值有以下含义:

alphabetic
使用周围文本的大写字母高度字母基线对齐首字母
ideographic
使用周围文本的表意上墨表意下墨基线 对齐首字母
hanging
使用周围文本的悬挂基线字母基线 对齐首字母
leading
使用周围文本的上/下半字距边缘(即上升/下降 + 半字距) 对齐首字母

注意: 这将基本上匹配 首字母的边缘与首/末受影响行 上方/下方中间的行间距,这在某些印度排版中有时使用这种效果 [ILREQ]

border-box
使用首字母盒子下方行上方行边框边缘 分别作为上方和下方对齐点。
之前的竖排写作模式示例(在§ 7.1 首字母简介中) 可以编写如下代码:
span.initial {
  initial-letter: 2;
  initial-letter-align: ideographic;
}

除非指定了border-box, 否则首字母的对齐点会自动从其内容中确定:

  1. 如果首字母是一个原子内联, 则使用其上方下方内容框边缘。
  2. 如果首字母包含任何具有汉字、朝鲜文、假名或彝文Unicode 脚本属性的字符, 使用表意上墨表意下墨基线。
  3. 如果首字母包含任何具有汉字、朝鲜文、假名或彝文Unicode 脚本属性的字符, 使用悬挂基线字母基线
  4. 否则使用大写字母高度字母基线
目前由于OpenType缺乏相应的度量标准,在如希伯来文和泰文等脚本中无法正确对齐首字母 (Issue 5244)。
希伯来文两行下沉首字母的对齐,使用hebrew-top和字母基线

注意:该属性中关键字的顺序是固定的,以防border-box被扩展为[ border-box | alphabetic | ideographic | hanging ],以显式指定 首字母的对齐点。

7.4.1. UA 默认样式表中的 initial-letter-align

为了提供更好的默认行为,UA 必须在其默认的 UA 样式表中包含以下规则:

[lang]:lang(zh, ja, ko, ii) {
  initial-letter-align: ideographic;
}
[lang]:lang(hi, mr, ne, pi, kok, brx, mai, sd, sa) {
  initial-letter-align: hanging;
}
/* 脚本标签覆盖语言标签 */
[lang]:lang('*-Latn', '*-Cyrl') {
  initial-letter-align: alphabetic;
}
[lang]:lang('*-Hani', '*-Hant', '*-Hans') {
  initial-letter-align: ideographic;
}

这里只涵盖了最常见的跨语言转写系统。 我们是否应该在 UA 样式表中包含其他/所有脚本标签?

7.5. 首字母布局

有两种类型的首字母盒子: 一种是来自非替换的内联盒子的, 另一种是来自原子内联元素的。

对于非原子的内联首字母, 该盒子及其内容参与它出现的行中的相同内联格式化上下文, 并且应用了许多特殊规则以提供预期的大小和对齐。

对于原子首字母, 其要么是替换元素,要么为其内容建立一个独立格式化上下文, 盒子的大小(除了其在自动尺寸块轴上)以及盒子内 内容的布局遵循常规规则:主要是盒子的定位是特殊的。

7.5.1. 应用于首字母的属性

所有应用于内联盒子的属性也适用于内联首字母,但vertical-align及其子属性font-sizeline-heightline-fit-edgeinline-sizing除外。 此外,所有尺寸属性box-sizing也适用于首字母(见[css-sizing-3])。

所有适用于原子内联元素的属性也适用于被样式化为首字母原子内联元素,但vertical-align及其子属性除外。

7.5.2. 边距、边框和内边距

首字母可以像其他盒子一样使用边距内边距边框进行样式化。 除非initial-letter-alignborder-box,否则其垂直对齐和字体大小不会受到影响。 然而,通常是首字母边距盒的有效排除区域会受到影响(参见initial-letter-wrap)。

当内边距和边框为零时,首字母可能会发生字距调整; 见下文。

7.5.3. 首字母的字体大小调整

对于行内首字母,用于确定首字母内容大小的字号,是根据其指定的大小(参见 initial-letter)并由其指定的对齐点(参见 initial-letter-align)锚定来计算的。请注意,此计算中不需要布局:它仅基于计算值和字体度量。这些使用的字号计算不会影响计算的font-size,因此不会影响 em 长度值等的计算。

对于子元素的继承情况如何?[问题 #4988]

在这些计算中使用的行高 是包含块的line-height (或者在使用基线网格的情况下, 是基线网格所需的基线到基线的间距,参见[CSS-LINE-GRID-1])。 被跨越的行的内容, 因此它们的高度和位置的任何变化, 都不被考虑在内。

文本底色展示了首字母对齐不受被跨越行内容的影响。

对于在西方书写系统中的N行下沉首字母, 字母的上缘高度需要是(N – 1)倍的行高, 加上周围文本的上缘高度。 注意,这个高度不是下沉首字母的字体大小。

实际计算这个字体大小相当复杂。 对于N行下沉首字母, 我们发现下沉首字母的字体大小为:

下沉首字母的字体大小 = ((N-1) * 行高 + [段落的上缘高度] * [段落的字体大小]) / [下沉首字母字体的上缘高度比]

更新这个计算以: a)适用于所有书写系统 / 对齐点,b)处理非整数大小。

在 Adobe Minion Pro 中的 三行下沉首字母 字体大小为 61.2pt, 给定 12pt 的文本,16pt 的行高,以及字体 OS/2 表中的上缘高度为 651/1000。

对于原子首字母, 使用的字体大小和通常情况下的计算字体大小相同。

7.5.4. 字形选择与形状调整

initial-letter不是normal时, 内联首字母会被隔离以进行字形形状调整; 但是其后的文本应当跨越 内联首字母盒子的边界进行形状调整, 假设其作为第一行文本内容的一部分出现。 (参见CSS Text 3 § 7.3 跨元素边界的形状调整。) 例如,如果“يحق”这个词的第一个字母被设置了initial-letter: 2 1, 第一个字母会以隔离形式“ي”显示为首字母, 后面的“ﺤﻖ”则以中间/最终形式显示, 假设它前面有首字母的内容作为正常文本。

两行阿拉伯语下沉字母,展示了第一个字母的隔离形式,单词的其余部分连接在一起。
两行阿拉伯语“下沉字母”

7.5.5. 首字母框的尺寸调整

对于内联首字母, 如果首字母首选宽度 / 首选高度确定的, 则使用该值 (按最小尺寸最大尺寸属性要求进行限制, 并按要求处理box-sizing) 用于框的该维度。

否则,它在该维度上被视为具有自动大小,并且其内容框的大小适合以下两者:

但是,如果其块起始内边距边框均为零,则其块起始内容边缘将精确地与其对齐点重合,并且任何溢出该点上方的内容在布局时都将被忽略。

注意:如果行内首字母的升部超出其对齐点,并且作者没有在首字母本身或其包含块上提供足够的外边距,则这些升部可能会与前面的内容冲突。

注意:可以通过将这些上升部视为可以与包含块外边距折叠的外边距来自动提供必要的间距, 这样可以在不需要额外空间的情况下保证必要的间距, 但一旦确实需要,才添加空间。 根据实现的复杂性,未来可能会探索这个选项; 但在此之前,作者需要小心明确提供所需的间距。

悬挂标点是否应该包含在框中, (以便当通过边框/背景使标点可见时,框围绕标点绘制), 但在定位框时排除 (这样首字母保持齐平,而悬挂标点正常悬挂)? 参见讨论

对于原子首字母, 大小调整遵循该原子内联类型的常规规则。 但是,如果框的自动块大小auto), 则其块大小的确定方式与具有边框盒对齐内联首字母相同, 并且是确定的

7.5.6. 首字母框内的内容对齐

默认情况下(即在自动尺寸调整下), 内联首字母的内容框恰好适应其内容, 对齐属性如text-alignalign-content不适用。 但是,如果框的尺寸不是自动调整:

7.6. 首字母的定位与间距

7.6.1. 块轴定位

块轴中, 首字母根据其在行框中的起始位置进行定位, 以满足其对齐要求(initial-letter-align)和指定的下沉值initial-letter):

注意:首字母本质上是这样定位的:如果假定其包含块仅包含首字母本身,其后是作为其根行内框直接内容的无限纯文本序列,则它将下沉 initial-letter 第二个参数指定的行数,并与必要的下方对齐点对齐。其位置不受受影响行框内容引入的行高不一致性的影响。

固定大小的文本底纹显示首字母的对齐不受所跨行内容的影响。

首字母不会增加其参与的行盒逻辑高度:它可以突出到其上方或下方。它必须被定位,使其自身的块起始外边距边缘位于其包含块块起始内容边缘下方,因此可以迫使其起始行盒(以及后续内容)进一步远离该边缘。

7.6.2. 内联字距调整

如果首字母是一个具有自动行内尺寸且内边距和边框为零的非原子行内元素,则其外边距框将根据其内容框的起始边缘到如果不是首字母则会放置在行盒起始边缘的内容点之间的距离进行字距调整(负向内缩)(即其字形边界框与其起始字怀之间的距离)。此内缩实际上是框上的一个额外的行内起始外边距

7.7. 首字母环绕:initial-letter-wrap 属性

注意:initial-letter-wrap 处于风险中。

名称: initial-letter-wrap
值: none | first | all | grid | <length-percentage>
初始值: none
应用于: 某些内联级框以及 ::first-letter 和位于 ::marker 内的框 (参见正文)
是否继承:
百分比: 相对于 (首字母最后一个片段的) 逻辑宽度
计算值: 指定的关键字或计算的 <length-percentage>
规范顺序: 按照语法
动画类型: 由计算值类型决定

此属性指定受首字母影响的行是否缩短以适应 首字母框的矩形形状或其字形轮廓的形状。

none
不进行轮廓拟合: 每个受影响的行都与 行尾边距边缘 对齐于 首字母
first
如果初始字母后的第一个 印刷字符单位 属于 Unicode General Category Zs,则行为与 none 相同。 否则在包含初始字母的块的第一行表现为 all,在其余部分表现为 none
此示例显示了为什么第一行需要轮廓拟合, 以及当首字母后面有空格时为什么会取消它:
首字母后有无空格的光学字距调整
在第一段中,首字母 "A" 后有一个单词空格: "A" 顶部与下一个字母之间的间隙提供了必要的单词分隔。 在下一段中,首字母 "A" 是第一个单词的一部分, 如果在 "A" 顶部与下一个字母之间留下空隙, 会在单词中间产生一个不和谐的视觉断裂。 在这种情况下,文本的第一行应当嵌入首字母的区域, 如底部段落所示。

我们是否需要无条件的 first? (即,我们是否应该将此值重命名为 auto 并添加一个 first 值 不检查空格?)参见 GitHub 问题 410

all
对于受 首字母影响的每行文本, 与 首字母相邻的 行框 从不与 首字母字形轮廓重叠的最左侧点开始。

如果 shape-outside 的值不是 none, 则使用 shape-outside 替代字形轮廓。

在这两种情况下,shape-margin 被应用于扩展轮廓, 并且由 首字母边距边缘进行裁剪。

注意:此值处于风险中。

grid
该值与 none 相同, 除了受影响的行的排除区域需要增加以使其结束边缘落在字符网格上, 即成为(1ic + letter-spacing) 的倍数,如在包含块上计算的。 然后可以使用 justify-self 属性来在排除区域内对齐首字母框。
竖排模式下的日文首字母示意图
竖排模式下的日文首字母示意图

注意:在此示例中,首字母的排除区域大于其字形, 以保持行内轴对齐。

注意:此值也处于风险中。

<length>
<percentage>
此值的行为与 first 相同, 只是对第一行的调整显式给出,而不是从字形形状中推断。

这真的需要字体相对长度相对于使用的大小。

注意:此值存在是因为它更易于实现。 鼓励作者使用 first 值并设置边距来控制间距, 并在必要时将其用作字形检测的后备。

在以下示例中,支持 first 的用户代理将使用字形轮廓加上指定的边距来放置第一行, 而仅支持 <length><percentage> 值的用户代理将把第一行拉入首字母宽度的 40% (然后添加边距到该点)。
h1 + p:first-letter {
  initial-letter: 3; /* 3行首字母下沉 */
  initial-letter-wrap: first;
  margin-right: 0.1em;
}
@supports (not (initial-letter-wrap: first)) {
  /* 为段落自动生成的类,以匹配首字母。 */
  p.A:first-letter {
    initial-letter-wrap: -40%; /* 假设使用正确字体,从字形轮廓开始。 */
  }
}

如果有人为 Blink 提交补丁以支持 first,则这些值和相关的烦恼可能是不必要的。

编辑图形以显示 auto 在不同上下文中的行为

p::first-letter {
  initial-letter: 3;
  initial-letter-wrap: none;
}
普通的下沉大写字母 A
没有环绕效果的普通首字母。
p::first-letter {
  initial-letter: 3;
  initial-letter-wrap: all;
}

文本围绕下沉大写字母 A

文本沿着首字母的形状排列。 每个行框应恰好触碰字母的墨迹,并带有一些偏移(由阴影框表示)。

p::first-letter {
  initial-letter: 3;
  initial-letter-wrap: first;
}

文本仅在第一行围绕下沉大写字母 A

仅第一行移动至首字母的墨迹旁。

p::first-letter {
  initial-letter: 3;
  initial-letter-wrap: all;
}

文本围绕下沉大写字母 V

文本围绕下沉大写字母 P

文本围绕下沉大写字母 W

7.8. 行布局

一个 首字母框 被视为在其 块格式化上下文 中的流内元素, 并且是它所起源的 行框的内容的一部分 (其起源行框)。 除了垂直轴 (参见 § 7.6.1 块轴定位), 它与行中其他内容的交互 与 行内级内容 的交互相同, 除了一些特定的细节外…

7.8.1. 行内流布局:对齐、对齐和空白处理

一个 首字母框 的处理方式类似于任何其他参与其 起源行框行内级内容, 包括参与对齐、对齐和空白处理。

然而,为了确保所有受影响行的一致对齐,可折叠空白下沉首字母 与其 起源行上的后续内容之间会被折叠掉, 并且通常由 下沉首字母 和行的后续内容的并置引入的任何 字母间距对齐机会 被抑制。 (请注意,这不会影响 词间距 或由 词分隔符 引入的 对齐机会, 因为该空白仅由 排版字符单位 提供,而不是通过与相邻字符的并置提供的。)

7.8.2. 边缘效果:缩进和悬挂标点

text-indenthanging-punctuation 像往常一样应用于 首字母起源行框, 并引起行内容开始位置的偏移,包括 首字母 本身。 被排除影响的后续行像往常一样缩短,具体程度可能因 首字母 的最终位置而有所不同。

带有缩进的首字母
带有缩进的首字母。

initial-letterhanging-punctuation 的交互正在 讨论中

7.8.3. 祖先行内元素

如果 首字母框行内框 祖先包含, 那些 行内框 的边界将绘制为排除 首字母框, 仿佛它位于它们的起始 边距边缘 之外。 这纯粹是几何操作: 它不影响例如属性继承或 首字母框 与后续内容之间的 字母间距 等实际效果。

7.8.4. 多行首字母

如果首字母太长而无法适应一行, 它会换行(根据通常的文本换行规则), 每行都像是第一行一样填充和格式化, 而首字母太长而无法适应后续的正常文本。 在首字母后的任何正常文本都从它的最后一行开始, 其影响与该行是第一行时完全相同。

多行下沉首字母
下沉首字母延伸至两行。

7.9. 清除首字母

7.9.1. 上升和下沉首字母

首字母的边距框会影响其包含元素的大小。 伸出文本第一行之上的首字母,称为“上升首字母”或“下沉首字母”,不会延伸到前一个元素中。 由于首字母的内容框包括所有字形的墨水, 这也意味着首字母帽高之上的重音符号或其他墨迹不会侵占前一个元素。

在普通段落之后的上升首字母段落
右侧为上升首字母(initial-letter: 3 1); 请注意两个案例中“C”的位置是相同的, 但在右侧所有文本相对于首字母向下移动。

处理帽高之上字形墨水的问题。 建议:将其作为行框和边框的排除区域。将指定在首字母上的边距作为排除区域的一部分,以便控制间距。

在这里绘制一个框模型图。首字母的边距是否与其容器合并?

7.9.2. 带有首字母的短段落

带有首字母的段落可以包含比首字母占用的行数更少的文本行。 在这种情况下,首字母的顶部对齐仍被尊重, 其排除区域会继续延伸到后续的块元素中。 这迫使后续的行内级内容围绕首字母包围——就好像该块的文本是其自己包含块的一部分一样。 (这类似于浮动元素排除后续块框中的内容。)

带有首字母的短段落
红色文本为带有首字母的短段落。 请注意后续段落围绕首字母包围, 就像带有首字母的段落中的文本一样。

如果后续块以首字母开头, 建立了独立格式化上下文, 或者在首字母的包含块的起始方向上指定了 clear, 则必须清除前一个块的首字母。

带有首字母的短段落后跟带有首字母的段落
红色文本为带有首字母的短段落。 后续段落因其也有首字母而被清除。

7.9.3. 与浮动元素的交互

首字母不是浮动元素: 它们是文档流内内联级内容, 属于一个行框。 因此:

首字母与浮动元素的交互
如果没有首字母,文本的第一行可以紧靠蓝色浮动元素。 但由于有首字母存在,文本必须向右移动。

有关浮动元素和相邻内容布局的更多信息,请参阅CSS2§9.5[CSS2]

仍在讨论中的是后续行中出现的内联结束浮动元素是否必须清除首字母(如同内联起始浮动元素一样)。 没有美学上的理由要求它这样做; 但尚不清楚底层布局模型如何区分这两种情况。 有关详细讨论,请参见链接

7.9.4. 与碎片化(分页)的交互

由于单个字形不能跨页面(或列或其他 碎片容器)被 分割, 因此,首字母 被视为块轴 碎片化(跨页、列、区域等断裂)时的 单一对象 [CSS-BREAK-3]。 此外,与 首字母框 相邻的流内行之间尽量避免断裂, 就像受 widowsorphans 影响的行框之间尽量避免断裂一样。 但是,如果在 首字母框 旁边存在 强制断裂, 那么它将优先处理;但对 首字母框 本身没有影响。

与其他 整体 对象一样, 如果 首字母框 出现在 分片容器 的顶部,而该 分片容器 太短无法容纳它, 则可能被截断或分割。 然而,邻近内容必须根据其自身规则进行 分片, 而不是与 首字母 一起被截断或分割。

附录 A: 合成对齐度量

A.1: 计算 Em-overEm-under

注意: em-overem-under 基线并未被 CSS 使用。 它们的定义包含在本模块中, 以与 Canvas TextMetrics API 中使用的其他度量保持一致。

em-overem-under 度量的计算方法如下:

注意: 此计算确保 em-overem-under 始终相距 1em, 同时尽量将字形轮廓的“重心”置于它们之间。

A.2: 为文本合成基线(及其他字体度量)

某些字体可能不包含正确对齐文本所需的度量信息, 用户代理可以在缺少所需度量时使用以下策略:

使用相关度量
某些度量通常是相关的, 可以利用这种关系至少通过启发式推导出缺失的度量。 如果字体格式本身未定义任何具体计算,则可以使用以下规则:
  1. 中心基线 被定义为 位于 表意字符上表意字符下 基线之间的一半, 因此任意两个可以确定第三个。
  2. 表意字符上表意字符下 基线通常相距 1em, 因此如果只提供了 表意字符上/表意字符下/中心 基线之一, 则可以利用此关系计算另外两个。
  3. 在 CJK 字体中,上升下降 通常与 表意字符上表意字符下 基线匹配, 因此在两者都缺失时可以作为备用。
测量字体
度量可以从字形的形状中导出。 例如:
  1. 可以将减号(U+2212)的中心作为数学基线。
  2. 小写字母 “o” 在字母基线下方的部分可以从其最高点减去,以 测量 x 高度
    测量字母 o 的 x 高度
    测量 x 高度。
  3. 大写字母 “O” 在字母基线下方的部分可以从其最高点减去,以测量大写高度。
  4. 永 (U+6C38) 的边界框可以用来找到表意字符的边缘。
  5. 希伯来字母 He (U+05D4 “ה”) 中心的顶部边缘可以作为希伯来悬挂基线。
  6. 字母 Ka 中心的顶部边缘可以作为悬挂基线。使用哪个 Ka 取决于 内容语言
    语言 脚本 字母
    天城文 क U+0915 KA
    孟加拉文 ক U+0995
    果鲁穆奇文 ਕ U+0A15
    藏文 ཀ U+0F40

    选择一个默认值。

    找到字母 ka 的悬挂基线位置
    悬挂基线位于字符墨水的顶部边缘。
  7. 问题:是否需要在此添加更多注释?

请有人检查这些启发式规则的合理性。

使用备用值
建议使用以下备用值:
  • x 高度:.5em;
  • 大写高度:.66em;
  • 悬挂基线:.6em;

A.3: 为原子内联合成基线

如果一个 原子内联(例如内联块、内联表格或 替换元素) 在其参与的 内联格式化上下文 中的 内联轴 上没有基于内容的 基线设置,则 UA 必须按照如下方式合成其 基线,以便对齐它。

这些 基线被认为位于 下方线边缘

这些 基线被认为位于 下方线上方线 之间的一半 边缘

这些 基线被认为位于 上方线边缘

注意: 作者可以使用(正或负的)边距来调整替换内容在行内的对齐方式。

在此示例中,作者使用一组图像显示不存在的字符。
img[src^="/text/"] {
  height: 1em; /* 与相邻文本大小一致 */
  margin-bottom: -0.2em; /* 基线位于底部上方 20% */
}
...
<p>这是一些包含用未编码脚本编写的单词的文本:
<img src="/text/ch3439.png" alt="...">
  <img src="/text/ch3440.png" alt="...">
  <img src="/text/ch3442.png" alt="...">

注意: CSS 的未来版本可能会包含为替换元素指定完整 基线表 的方式。 (这可能类似于接受 [<baseline-keyword> <percentage>]+baseline-table 属性。)

变更记录

2024 年 8 月 12 日工作草案以来的变更:

2024年8月8日工作草案 以来的变更:

2023 年 4 月 1 日工作草案以来的变更:

2022 年 11 月 14 日工作草案以来的变更:

2020年8月28日工作草案 以来的变更:

2020年6月18日工作草案 以来的变更:

2020年6月4日工作草案 以来的变更:

2018年8月8日工作草案 以来的变更:

另请参阅早期 自 2016年5月24日工作草案以来的更改

致谢

特别感谢初始作者 Eric A. Meyer 和 Michel Suignard。

除了作者之外,这份规范的完成还要感谢以下人士的帮助:

David Baron, Mike Bremford, David M Brown, Oriol Brufau, John Daggett, Stephen Deach, Sylvain Galineau, David Hyatt, Myles Maxfield, Shinyu Murakami, Jan Nicklas, Tess O’Connor, Sujal Parikh, Florian Rivoal, Alan Stearns, Weston Thayer, Bobby Tung, Chris Wilson, Grzegorz Zygmunt。

隐私考虑

本规范没有报告新的隐私考虑事项。

安全考虑

本规范没有报告新的安全考虑事项。

符合性

文档约定

符合性要求通过描述性声明和 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 样式表
渲染器
一种用户代理(UA),用于解释样式表的语义并渲染使用这些样式表的文档。
创作工具
一种用户代理(UA),用于编写样式表。

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

渲染器符合本规范的要求,如果在按照相关规范定义解释样式表的同时,正确解析并渲染了本规范定义的所有功能。然而,由于设备的限制,导致用户代理无法正确渲染文档,这并不使用户代理不符合规范。(例如,用户代理不要求在单色显示器上渲染颜色。)

创作工具符合本规范的要求,如果它编写的样式表在通用 CSS 语法及本模块中每个特性的单独语法方面都是正确的,并且符合本模块所描述的样式表的所有其他符合性要求。

部分实现

为了让作者能够利用向前兼容的解析规则来指定回退值,CSS 渲染器必须将任何其不支持的 at-rule、属性、属性值、关键字和其他语法结构视为无效(并适当忽略)。特别是,用户代理不得选择性地在单个多值属性声明中忽略不支持的组件值并应用支持的值:如果任何值被视为无效(因为不支持的值必须如此),CSS 要求整个声明被忽略。

不稳定和专有特性的实现

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

非实验性实现

一旦规范达到候选推荐阶段,便可进行非实验性的实现,且实现者应当发布任何符合规范、已被证明正确实现的候选推荐级别特性的无前缀实现。

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

关于提交测试用例和实现报告的详细信息,可以访问 CSS 工作组网站上的 https://www.w3.org/Style/CSS/Test/ 获取。问题可以发送至 public-css-testsuite@w3.org 邮件列表。

索引

本规范定义的术语

通过引用定义的术语

参考文献

规范性引用

[CSS-ALIGN-3]
Elika Etemad;Tab Atkins Jr.。CSS 框对齐模块第 3 级。2023 年 2 月 17 日。工作草案。链接:https://www.w3.org/TR/css-align-3/
[CSS-BACKGROUNDS-3]
Elika Etemad;Brad Kemper。CSS 背景与边框模块第 3 级。2024 年 3 月 11 日。候选推荐标准。链接:https://www.w3.org/TR/css-backgrounds-3/
[CSS-BOX-3]
Elika Etemad。CSS 盒模型模块第 3 级。2024 年 4 月 11 日。正式推荐标准。链接:https://www.w3.org/TR/css-box-3/
[CSS-BOX-4]
Elika Etemad。CSS 盒模型模块第 4 级。2024 年 8 月 4 日。工作草案。链接:https://www.w3.org/TR/css-box-4/
[CSS-BREAK-3]
Rossen Atanassov;Elika Etemad。CSS 分段模块第 3 级。2018 年 12 月 4 日。候选推荐标准。链接:https://www.w3.org/TR/css-break-3/
[CSS-BREAK-4]
Rossen Atanassov;Elika Etemad。CSS 分段模块第 4 级。2018 年 12 月 18 日。工作草案。链接:https://www.w3.org/TR/css-break-4/
[CSS-CASCADE-5]
Elika Etemad;Miriam Suzanne;Tab Atkins Jr.。CSS 层叠与继承第 5 级。2022 年 1 月 13 日。候选推荐标准。链接:https://www.w3.org/TR/css-cascade-5/
[CSS-COUNTER-STYLES-3]
Tab Atkins Jr.。CSS 计数器样式第 3 级。2021 年 7 月 27 日。候选推荐标准。链接:https://www.w3.org/TR/css-counter-styles-3/
[CSS-DISPLAY-3]
Elika Etemad;Tab Atkins Jr.。CSS 显示模块第 3 级。2023 年 3 月 30 日。候选推荐标准。链接:https://www.w3.org/TR/css-display-3/
[CSS-FONTS-4]
Chris Lilley。CSS 字体模块第 4 级。2024 年 2 月 1 日。工作草案。链接:https://www.w3.org/TR/css-fonts-4/
[CSS-LISTS-3]
Elika Etemad;Tab Atkins Jr.。CSS 列表与计数器模块第 3 级。2020 年 11 月 17 日。工作草案。链接:https://www.w3.org/TR/css-lists-3/
[CSS-MULTICOL-1]
Florian Rivoal;Rachel Andrew。CSS 多列布局模块第 1 级。2024 年 5 月 16 日。候选推荐标准。链接:https://www.w3.org/TR/css-multicol-1/
[CSS-PAGE-FLOATS-3]
Johannes Wilm。CSS 页面浮动。2015 年 9 月 15 日。工作草案。链接:https://www.w3.org/TR/css-page-floats-3/
[CSS-POSITION-3]
Elika Etemad;Tab Atkins Jr.。CSS 定位布局模块第 3 级。2024 年 8 月 10 日。工作草案。链接:https://www.w3.org/TR/css-position-3/
[CSS-PSEUDO-4]
Daniel Glazman;Elika Etemad;Alan Stearns。CSS 伪元素模块第 4 级。2022 年 12 月 30 日。工作草案。链接:https://www.w3.org/TR/css-pseudo-4/
[CSS-RUBY-1]
Elika Etemad;等。CSS Ruby 注解布局模块第 1 级。2022 年 12 月 31 日。工作草案。链接:https://www.w3.org/TR/css-ruby-1/
[CSS-SHAPES-1]
Rossen Atanassov;Alan Stearns。CSS 形状模块第 1 级。2022 年 11 月 15 日。候选推荐标准。链接:https://www.w3.org/TR/css-shapes-1/
[CSS-SIZING-3]
Tab Atkins Jr.;Elika Etemad。CSS 盒尺寸模块第 3 级。2021 年 12 月 17 日。工作草案。链接:https://www.w3.org/TR/css-sizing-3/
[CSS-TEXT-3]
Elika Etemad;Koji Ishii;Florian Rivoal。CSS 文本模块第 3 级。2024 年 9 月 30 日。候选推荐标准。链接:https://www.w3.org/TR/css-text-3/
[CSS-TEXT-4]
Elika Etemad;等。CSS 文本模块第 4 级。2024 年 5 月 29 日。工作草案。链接:https://www.w3.org/TR/css-text-4/
[CSS-VALUES-3]
Tab Atkins Jr.;Elika Etemad。CSS 值与单位模块第 3 级。2024 年 3 月 22 日。候选推荐标准。链接:https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.;Elika Etemad。CSS 值与单位模块第 4 级。2024 年 3 月 12 日。工作草案。链接:https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-4]
Elika Etemad;Koji Ishii。CSS 书写模式第 4 级。2019 年 7 月 30 日。候选推荐标准。链接:https://www.w3.org/TR/css-writing-modes-4/
[CSS2]
Bert Bos;等。层叠样式表第 2 级修订版 1 (CSS 2.1) 规范。2011 年 6 月 7 日。正式推荐标准。链接:https://www.w3.org/TR/CSS21/
[CSS22]
Bert Bos。层叠样式表第 2 级修订版 2 (CSS 2.2) 规范。2016 年 4 月 12 日。工作草案。链接:https://www.w3.org/TR/CSS22/
[QUIRKS]
Simon Pieters。Quirks 模式标准。现行标准。链接:https://quirks.spec.whatwg.org/
[RFC2119]
S. Bradner。RFC 中用于指示需求级别的关键字。1997 年 3 月。最佳当前实践。链接:https://datatracker.ietf.org/doc/html/rfc2119
[SVG2]
Amelia Bellamy-Royds;等。可缩放矢量图形 (SVG) 2。2018 年 10 月 4 日。候选推荐标准。链接:https://www.w3.org/TR/SVG2/

非规范性引用

[CSS-LINE-GRID-1]
Elika Etemad; Koji Ishii; Alan Stearns. CSS Line Grid Module Level 1。2014年9月16日。工作草案。URL: https://www.w3.org/TR/css-line-grid-1/
[CSS-WRITING-MODES-3]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 3。2019年12月10日。推荐标准。URL: https://www.w3.org/TR/css-writing-modes-3/
[ILREQ]
Swaran Lata. Indic Layout Requirements。2020年5月29日。工作草案。URL: https://www.w3.org/TR/ilreq/
[SELECT]
Tantek Çelik; 等人。Selectors Level 3。2018年11月6日。推荐标准。URL: https://www.w3.org/TR/selectors-3/

属性索引

名称 初始值 应用于 继承 %ages 动画类型 规范顺序 计算值
alignment-baseline baseline | text-bottom | alphabetic | ideographic | middle | central | mathematical | text-top baseline 内联级框、弹性项目、网格项目、表格单元格和SVG文本内容元素 N/A 离散 根据语法 指定的关键词
baseline-shift <length-percentage> | sub | super | top | center | bottom 0 内联级框和SVG文本内容元素 参考line-height的使用值 按计算值类型 根据语法 指定的关键词或计算的<length-percentage>值
baseline-source auto | first | last auto 内联级框 N/A 离散 根据语法 指定的关键词
dominant-baseline auto | text-bottom | alphabetic | ideographic | middle | central | mathematical | hanging | text-top auto 块容器、内联框、表格行、网格容器、弹性容器和SVG文本内容元素 N/A 离散 根据语法 指定的关键词
initial-letter normal | <number [1,∞]> <integer [1,∞]> | <number [1,∞]> && [ drop | raise ]? normal 某些内联级框和::first-letter及内部::marker框(参见文章) N/A 按计算值类型 根据语法 关键词normal或一个与整数配对的数字
initial-letter-align [ border-box? [ alphabetic | ideographic | hanging | leading ]? ]! alphabetic 某些内联级框和::first-letter及内部::marker框(参见文章) N/A 离散 根据语法 指定的关键词
initial-letter-wrap none | first | all | grid | <length-percentage> none 某些内联级框和::first-letter及内部::marker框(参见文章) 相对于(最后一个片段)初始字母的逻辑宽度 按计算值类型 根据语法 指定的关键词或计算的<length-percentage>值
inline-sizing normal | stretch normal 内联框,但不包括ruby容器框和内部ruby框 n/a 离散 根据语法 指定的关键词
line-fit-edge leading | <text-edge> leading 内联框 N/A 离散 根据语法 指定的关键词
line-height normal | <number [0,∞]> | <length-percentage [0,∞]> normal 非替换的内联框和SVG文本内容元素 相对于1em计算 按计算值类型 根据语法 指定的关键词、数字或计算的<length>值
text-box normal | <'text-box-trim'> || <'text-box-edge'> normal 块容器和内联框 N/A 离散 根据语法 指定的关键词
text-box-edge auto | <text-edge> auto 块容器和行内框 不适用 离散 根据语法 指定的关键字
text-box-trim none | trim-start | trim-end | trim-both none 块容器和行内框 不适用 离散 根据语法 指定的关键字
vertical-align [ first | last] || <'alignment-baseline'> || <'baseline-shift'> baseline 见各个属性 N/A 见各个属性 根据语法 见各个属性

问题索引

布局的许多方面依赖于字体度量。 虽然OpenType中存在适用于拉丁字母/西里尔字母/希腊字母和CJK的相关度量, 但对于许多其他书写系统缺少这些度量。 例如,希伯来文的视觉顶部度量在OpenType表中没有度量。 为了使本模块在全球范围内更好地工作, 我们需要字体提供所有书写系统的相关度量, 这意味着OpenType需要允许这些度量, 字体设计师也需要提供准确的数值。 参见问题联络声明
定义顶部/底部/居中对齐的框高于其他内容时的行为。
Firefox 允许幽灵行盒内的行内盒接受轮廓,这使其能够显示焦点环。 与其他浏览器一样,所有其他可能使元素可见的属性(例如 box-shadow)似乎都被忽略了。
CSSWG希望了解哪些基线值对于使用它们的每个属性是必要的 (dominant-baselinealignment-baselinetext-box-edgeline-fit-edgeinitial-letter-align): 如果有可以被删除的,或者需要添加的。 参见问题859
为混合垂直方向定义非“无意义”的行为, 当指定的基线不是中央时。
相对行移位值不完全符合对齐基线基线移位之间的二分法。 有不错的论据支持这两种选择。 目前它们在这里被起草, 但如果有强有力的论据将它们移动, 请提交问题供考虑。
我们希望删除基线值,并正在寻求SVG用户代理的反馈,看看它是否必要。
百分比计算为长度的事实令人困扰。 另见问题3118问题2165
这是一个早期提案草案, 可能会发生重大变化, 因为设计评审和用例正在注册, 并且各种细节和与其他属性的交互正在解决。 尚不可投入使用。
我们需要手写扩展,还是简写就足够了?[问题#5236]
文本是一个合理的上升/下降度量名称吗? 或者我们可以想出更好的名称? 同样适用于作为关键字的领先[问题#8067]
此插图与实际字体度量不符,它实际上说明的是大写字母高度,而不是升部。 [问题 #11364]
添加示例。
如果列被跨栏符分割会发生什么? [问题 #11363]
这个名字令人困惑。我们需要一个新名字。 或者,将其合并到text-box-trim中?[问题#5189]
编辑们希望得到关于非西方脚本,特别是印度脚本中首字下沉的任何示例。
是否应该有一种方式选择退出这种行为?请参见GitHub问题310
正确对齐如希伯来文和泰文的首字母目前是不可能的,因为OpenType缺少相应的度量。 (问题5244
希伯来文两行首字母下沉对齐,使用hebrew-top和字母基线
这仅涵盖最常见的跨语言转录系统。 我们是否应该在UA样式表中包含任何其他/所有脚本标签?
关于继承到后代的问题是什么?[问题#4988]
更新此计算以使其a)适用于所有书写系统/对齐点并b)处理非整数大小。
悬挂标点符号是否应包括在框中 (这样当通过边框/背景使框可见时,框就围绕标点符号绘制), 而不是仅在定位框时排除它 (这样首字母保持齐平, 悬挂标点符号正确悬挂)? 请参见讨论
我们需要无条件的first吗? (即,是否应该将该值重命名为auto,并添加一个first值, 该值不检查空格?)参见GitHub问题410
这确实需要字体相对长度相对于使用的大小。
如果有人为Blink提交补丁以支持first,这些值和相关的烦恼可能是不必要的。
编辑图形以显示auto在不同上下文中的行为
initial-letterhanging-punctuation的交互正在讨论中
处理字体大写字母高度之上的字形墨水。 提议:将其作为行框和边框的排除区域。将指定在首字母上的边距包含在排除区域中,以控制间距。
在此处绘制框模型图。首字母的边距是否与其容器合并?
后续行中产生的内联尾部浮动 是否必须清除首字母(如内联头部浮动)尚在讨论中。 没有美学理由要求它; 然而,底层布局模型如何区分这两种情况尚不清楚。
选择一个默认值。
请检查这些启发式方法的合理性。