1. 简介
本模块描述了 CSS 的排版控制;即 CSS 中控制从源文本到已格式化、已换行文本转换的功能。各种 CSS 属性提供了对 大小写转换、空白符折叠、文本换行、断行规则 与 断字、对齐与两端对齐、间距 以及 缩进 的控制。
用于装饰文本的功能,例如 下划线、着重号 和 阴影(此前属于本模块)现已包含在 CSS 文本装饰模块 中。[CSS-TEXT-DECOR-3]
双向 和 垂直 文本在 CSS 书写模式模块 中处理。[CSS-WRITING-MODES-4]。
关于世界各地各种语言和书写系统的排版要求,更多信息可在 国际化工作组 的 语言支持索引 (Language Enablement Index) 中找到。[TYPOGRAPHY]
1.1. 模块交互
本模块与 CSS 文本装饰模块 一起,取代并扩展了 层叠样式表 2 级 第 16 章 中定义的文本级功能。[CSS-TEXT-DECOR-3] [CSS2]
除了下面定义的术语外,本规范中使用的其他术语和概念也在 层叠样式表 2 级 和 CSS 书写模式模块 中定义。[CSS2] 和 [CSS-WRITING-MODES-4]。
1.2. 值定义
本规范遵循 [CSS2] 中的 CSS 属性定义约定,并使用 [CSS-VALUES-3] 中的 值定义语法。本规范未定义的值类型在 CSS 值与单位 [CSS-VALUES-3] 中定义。与其他 CSS 模块组合使用可能会扩展这些值类型的定义。
除了定义中列出的属性特定值外,本规范中定义的所有属性也都接受 CSS 全局关键字 作为其属性值。为了可读性,未明确重复列出。
1.3. 语言与排版
作者应准确标记内容语言以获得最佳排版效果。
许多排版效果因语言环境而异。语言和书写系统约定会影响断行、断字、两端对齐、字形选择以及许多其他排版效果。在 CSS 中,特定于语言的排版调整仅在 内容语言 已知(声明)时应用。因此,高质量的排版要求作者向用户代理 (UA) 传达文档中文本的正确语言环境。
元素的 内容语言 是根据 文档语言 规则声明该元素所属的(人类)语言。请注意,元素的 内容语言 可能是未知的——例如,未标记的内容,或在不具备语言标记功能的 文档语言 中的内容,被视为具有未知的 内容语言。
注意:作者可以使用 HTML 中的全局 lang 属性或 XML 中的通用 xml:lang 属性来声明 内容语言。参见 HTML 中的 确定 HTML 元素内容语言的规则,以及 XML 1.0 中的 确定 XML 元素内容语言的规则。[HTML] [XML10]
元素所声明的 内容语言 同时标识了该元素中使用的该语言的具体书写形式,即 内容书写系统。根据 文档语言 标识 内容语言 的机制,此信息可以是显式的或隐式的。参见规范性 附录 F:标识内容书写系统。
注意:某些语言拥有不止一种书写系统传统;在其他情况下,语言可以被转写到外来书写系统中。作者应 标注子标签 以便 UA 进行适当的适应。
ko) 可以用谚文 (-Hang)、汉字 (-Hani) 或混合形式 (-Kore) 书写。仅用汉字书写的历史文献不使用词间空格,其格式更类似于现代中文而非现代韩语。换句话说,出于排版目的,ko-Hani 的行为更类似于 zh-Hant 而非 ko (ko-Kore)。另一个例子是日语 (ja),通常以平假名 (-Hira)、片假名 (-Kana) 和汉字 (-Hani) 的组合 (-Japn) 书写。然而,它也可以为了语言学习教材等特殊目的“罗马化”为拉丁字母 (-Latn),在这种情况下,它的格式应该更像英语而不是日语。
第三个例子是当代蒙古语,它以两种脚本书写:西里尔字母 (-Cyrl,官方在蒙古国使用) 和传统蒙古文 (-Mong,在中国内蒙古地区更为常见)。它们具有非常不同的排版要求,西里尔文的行为类似于拉丁字母和希腊字母,而传统蒙古文则同时衍生自阿拉伯和中文的书写约定。
1.4. 字符与字母
排版的基本单位是 字符。然而,由于书写系统并不总是像基础的英语字母表那样简单,什么是 字符 实际上取决于使用该术语的上下文。例如,在谚文(韩语书写系统)中,每个表示音节的方形符号(例如 한=Han)都可以被视为一个 字符。然而,这个方形符号实际上由多个表示音素的字母组成(例如 ㅎ=h, ㅏ=a, ㄴ=n),它们每一个也可以被视为一个 字符。
对于任何给定的编码,计算机文本编码的基本单位也称为 字符,并且根据编码的不同,单个编码 字符 可能对应整个预组合的音节 字符(例如 한),对应单个音素 字符(例如 ㅎ),或对应更小的单位,例如基础字形(例如 ㅇ)以及任何改变它的组合标记(例如表示送气的额外笔画)。
反过来,单个编码 字符 可以在数据流中表示为一个或多个字节;在编程环境中,一个字节有时也称为一个 字符。
因此,当需要技术精度时,字符 一词是相当模糊的。
对于文本布局,我们将 排版字符单位 称为文本的基本单位。即使在文本布局领域,相关的 字符 单位也取决于具体操作。例如,断行和字间距对于包含 U+0E33 ำ THAI CHARACTER SARA AM 的泰语字符序列的分割方式会有所不同;或者像天城体这样脚本中的结合辅音的行为可能取决于所使用的字体。因此 排版字符 代表书写系统的一个单位——例如拉丁字母(包括其变音符号)、谚文音节、中文字符、缅甸语音节簇——它在特定的排版操作(断行、首字效果、跟踪、对齐、垂直排列等)中是不可分割的。
Unicode 标准附件 #29:文本分割 定义了一个称为 字素簇 的单位,它近似于 排版字符。[UAX29] UA 必须使用 UAX29 中定义的 扩展字素簇(而非 传统字素簇)作为其 排版字符单位 的基础。然而,UA 应根据排版传统的要求定制定义,因为默认规则并不总是恰当或理想的——并且预期会根据操作的需要进行不同的定制。
注意:此类定制的规则超出了 CSS 的范围。
- 在缅甸语或天城体等某些脚本中,用于两端对齐和断行的 排版字符单位 是整个音节,其中可能包含多个 Unicode 字素簇。[UAX29]
- 在泰语或老挝语等其他脚本中,尽管对于断行而言 排版字符 与 Unicode 默认的 字素簇 匹配,但对于字间距而言,相关单位 小于 Unicode 字素簇,并且可能需要在插入间距之前进行分解或其他替换。[UAX29]
例如,为了正确设置泰语单词 คำ (U+0E04 + U+0E33) 的字间距,U+0E33 需要分解为 U+0E4D + U+0E32,然后在 U+0E32 之前插入额外的字间距:คํ า。
一个稍微复杂的例子是 น้ำ (U+0E19 + U+0E49 + U+0E33)。在这种情况下,正常的泰语成型首先会将 U+0E33 分解为 U+0E4D + U+0E32,然后将 U+0E4D 与 U+0E49 交换,得到 U+0E19 + U+0E4D + U+0E49 + U+0E32。与之前一样,额外的字间距随后被插入到 U+0E32 之前:นํ้ า。
- 垂直排版也可能需要定制。例如,在排版 直立 文本时,藏文的 tsek 和 shad 标记应与前一个字素簇保持在一起,而不是被视为独立的 排版字符单位。[CSS-WRITING-MODES-4]
排版字母单位(或本规范目的下的 字母)是属于字母或数字 通用类别 之一的 排版字符单位。参见 附录 E:字符与属性 以了解如何确定 排版字符单位 的 Unicode 属性。
被元素边界分割的 排版字符单位 的渲染特性是未定义的。理想情况下,每个组件应根据其各自元素属性的排版要求进行渲染,同时保持整个 排版字符单位 的正确成型和定位。然而,取决于其各部分格式差异的性质以及所使用字体技术的能力,这并不总是可能的。因此,这样的 排版字符单位 可能会被渲染为属于边界的任一侧,或属于两侧的某种近似。作者需注意,通过元素边界分割 字素簇 或连字可能会产生不一致或不理想的结果。
1.5. 文本处理
CSS 构建于 Unicode 之上。[UNICODE] 支持 Unicode 的 UA 必须遵守 Unicode 核心标准的所有规范性要求,除非 CSS 明确覆盖。基于非 Unicode 文本编码模型实现的 UA 仍应通过假设适当的映射和类似行为来满足相同的文本处理要求。
出于确定文本处理(如空白符处理、文本转换、断行等)中相邻性的目的,因此在本规范中,介于中间的 行内盒 边界和 流外 元素必须被忽略。然而,关于文本成型,参见 § 7.3 元素边界间的字形成型。
2. 文本转换
2.1. 大小写转换:text-transform 属性
| 名称 | text-transform |
|---|---|
| 值 | none | [capitalize | uppercase | lowercase ] || full-width || full-size-kana |
| 初始值 | none(无) |
| 应用于 | text |
| 可继承 | 是 |
| 百分比 | 不可用 |
| 计算值 | 指定关键字 |
| 规范顺序 | 不可用 |
| 动画类型 | 离散 (discrete) |
此属性为了样式目的转换文本。它对底层内容没有影响,且不得影响纯文本复制与粘贴操作的内容。
作者不得为了语义目的依赖 text-transform;正确的拼写和语义应编码在源文档的文本和标记中。
值的含义如下:
- none(无)
- 无效果。
- capitalize
- 将每个单词的第一个 排版字母单位(如果是小写)转换为标题格式;其他字符不受影响。
- 大写
- 将所有 字母 转换为大写。
- 小写
- 将所有 字母 转换为小写。
- full-width
- 将所有 排版字符单位 转换为 全角 形式。如果字符没有对应的 全角 形式,则保持原样。此值通常用于将拉丁字母和数字排版为好像它们是表意字符一样。
- full-size-kana
- 将所有 小假名 字符转换为等效的 全角假名。此值通常用于注音(ruby)文本,作者可能希望所有小假名以大假名显示,以补偿通常用于注音的小字号带来的易读性问题。
注意:text-transform 的目的是允许进行呈现性的大小写转换,而不影响文档的语义。特别要注意的是,text-transform 的大小写转换操作是有损的,并且可能扭曲文本的含义。虽然辅助功能界面可能希望将呈现文本的明显大小写传达给用户,但不能依赖转换后的文本来准确表示文档的底层含义。
section > p:first-of-type::first-line{ text-transform : uppercase; }
此效果无法写入源文档,因为换行的位置取决于布局。此外,大写并没有反映语义区别,也不打算影响段落的阅读;因此,它属于表现层。
rt{ font-size : 50 % ; text-transform : full-size-kana; } :is ( h1, h2, h3, h4) rt{ text-transform : none; /* unset for large text*/ }
请注意,虽然这使得这些字母在小字号下更容易看清,但转换扭曲了文本:读者需要在适当的地方进行心理替换 小假名——这与阅读所有“U”看起来像“V”的拉丁铭文没有什么不同。
例如,如果对以下源文本应用 text-transform: full-size-kana,注音将读作“じゆう”(jiyū),意为“自由”,而不是“じゅう”(jū),意为“十”,这是被注音文字“十”的正确读法和含义。
< ruby > 十< rt > じゅう</ ruby >
2.1.1. 映射规则
对于 capitalize,什么构成“单词”取决于 UA;建议(但不要求)使用 [UAX29] 来确定此类单词边界。流外元素和行内元素边界不得引入 text-transform 单词边界,并且在确定此类单词边界时必须忽略它们。
注意:作者不能依赖 capitalize 来遵循特定语言的标题大小写约定(例如跳过英语中的冠词)。
UA 必须使用 Unicode 字符的完整大小写映射,包括任何条件大小写规则,定义在 Unicode 标准 的 默认大小写算法 章节中。[UNICODE] 如果(且仅当)元素的 内容语言 根据 文档语言 规则是已知的,则还必须应用任何适当的特定语言规则。这些至少包括但不限于 Unicode 的 SpecialCasing.txt 中的特定语言规则。
全角 和 半角 形式的定义可在 Unicode 标准附件 #11:东亚宽度 中找到。[UAX11] 映射到 全角 形式的定义是取在 Unicode 标准附件 #44:Unicode 字符数据库 的 Decomposition_Mapping 中带有 <wide> 或 <narrow> 标签的代码点。[UAX44] 对于 <narrow> 标签,映射是从代码点到分解(减去 <narrow> 标签),对于 <wide> 标签,映射是从分解(减去 <wide> 标签)回到原始代码点。
小假名 到 全角假名 的映射定义在 附录 G:小假名映射 中。
2.1.2. 操作顺序
当指定了多个值且因此需要应用多种转换时,它们按以下顺序应用
文本转换发生在 § 4.1.1 第一阶段:折叠与转换 之后,但在 § 4.1.2 第二阶段:修剪与定位 之前。这意味着 full-width 仅在 保留的 空白符 内将空格 (U+0020) 转换为 U+3000 表意文字空格。
注意:如 附录 A:文本处理操作顺序 中所定义,转换文本会影响断行和其他排版操作。
3. 空白符与换行:white-space 属性
| 名称 | white-space |
|---|---|
| 值 | normal | pre | nowrap | pre-wrap | break-spaces | pre-line |
| 初始值 | normal |
| 应用于 | text |
| 可继承 | 是 |
| 百分比 | 不可用 |
| 计算值 | 指定关键字 |
| 规范顺序 | 不可用 |
| 动画类型 | 离散 (discrete) |
此属性指定两件事
值具有以下含义,必须根据 空白符处理 和 断行 规则进行解释
- normal
- 此值指示用户代理将 空白符 序列折叠为单个字符(或 在某些情况下,无字符)。为了最小化行内轴的溢出,行可以在由当前生效的断行规则确定的允许的 软换行机会 处换行。
- pre
- 此值防止用户代理折叠 空白符 序列。段落中断(如换行符)被保留为 强制换行符。行仅在 强制换行符 处中断;无法适应块容器的内容会溢出。
- nowrap
- 与 normal 一样,此值折叠 空白符;但与 pre 一样,它不允许换行。
- pre-wrap
- 与 pre 一样,此值保留 空白符;但与 normal 一样,它允许换行。
- break-spaces
- 行为与 pre-wrap 相同,不同之处在于
注意:此值不能保证不会因空白符而产生溢出:例如,如果行长度太短,以至于连一个空白字符都无法容纳,则溢出是不可避免的。
- pre-line
- 与 normal 一样,此值折叠连续的 空白字符 并允许换行,但它将源中的 段落中断 保留为 强制换行符。
因空白符处理而未被删除或折叠的 空白符 称为 保留的空白符。
注意:在某些情况下,保留的空白符 和 其他空格分隔符 在行尾时可以 悬挂;这可能会影响它们是否被计入 固有尺寸计算。
下表总结了各种 white-space 值的行为
| 新行 | 空格与制表符 | 文本换行 | 行尾 空格 | 行尾 其他空格分隔符 | |
|---|---|---|---|---|---|
| normal | 折叠 | 折叠 | 折行 | 移除 | 悬挂 |
| pre | 保留 | 保留 | 不换行 | 保留 | 不换行 |
| nowrap | 折叠 | 折叠 | 不换行 | 移除 | 悬挂 |
| pre-wrap | 保留 | 保留 | 折行 | 悬挂 | 悬挂 |
| break-spaces | 保留 | 保留 | 折行 | 折行 | 折行 |
| pre-line | 保留 | 折叠 | 折行 | 移除 | 悬挂 |
关于换行行为的详细信息,请参阅 断行。
4. 空白符处理与控制字符
文档的源文本通常包含与最终渲染无关的格式:例如,为了方便编辑而 将源文本拆分为片段(行),或添加诸如 制表符 和 空格 之类的 空白字符 来缩进源代码。CSS 空白符处理允许作者控制对此类格式的解释:在渲染文档时是保留还是折叠掉。CSS 中的空白符处理(通过 white-space 属性控制)仅对渲染解释 空白字符:它对底层文档数据没有影响。
注意:根据文档语言的不同,片段可以由特定的换行序列(如换行符或 CRLF 对)分隔,或由其他机制界定,如 SGML RECORD-START 和 RECORD-END 标记。
对于 CSS 处理,文本中每个文档语言定义的“段落中断”或“换行序列”——如果未定义,则每个换行符 (U+000A)——均被视为一个 段落中断,随后按 white-space 属性的规定进行渲染解释。
对于 HTML,换行符 在 DOM 中表示为被 规范化 为换行符 (U+000A),因此当 HTML 文档表现为 DOM 树时,每个换行符 (U+000A) 都被视为一个 段落中断。[HTML] [DOM]
注意:在大多数常见的 CSS 实现中,HTML 不会被直接设置样式。相反,它被处理成 DOM 树,然后对其设置样式。与 HTML 不同,DOM 不赋予回车符 (U+000D) 任何特殊含义,因此它们不被视为 段落中断。如果回车符 (U+000D) 是通过 HTML 解析以外的方式插入到 DOM 中的,则它们会按下面定义的方式进行处理。
注意:文档解析器不仅可以规范化任何 段落中断,还可以根据标记规则折叠其他空格字符或以其他方式处理空白符。由于 CSS 处理发生在 解析阶段之后,因此无法恢复这些字符以进行样式设置。因此,下面指定的某些行为可能会受到这些限制的影响,并且可能依赖于用户代理。
注意:完全由 可折叠 空白符 组成的匿名块会从渲染树中删除。因此,任何块级元素周围的此类 空白符 都会被折叠掉。参见 CSS 2.1 § 9.2.2.1 匿名行内盒。[CSS2]
控制字符(Unicode 类别 Cc)——除制表符 (U+0009)、换行符 (U+000A)、回车符 (U+000D) 以及形成 段落中断 的序列外——必须渲染为可见字形,如果字体中找到的字形不可见,UA 必须合成一个,否则必须将其视为“其他符号 (So) 通用类别”和“通用 脚本”中的任何其他字符。UA 可以使用字体专门为控制字符提供的字形,替换控制图片块中对应符号提供的字形,生成其代码点值的视觉表示,或使用其他方法提供适当的可见字形。根据 Unicode 要求,对于文本渲染,不受支持的 Default_ignorable 字符必须被忽略。[UNICODE]
回车符 (U+000D) 在所有方面均被视为与空格 (U+0020) 相同。
注意:对于 HTML 文档,存在于源代码中的回车符在解析阶段被转换为换行符(参见 HTML § 13.2.3.5 预处理输入流 以及 Infra 中对 规范化换行符 的定义,因此它们在 CSS 中不会表现为 U+000D 回车符。[HTML] [INFRA])然而,当使用转义序列()编码时,该字符 确实 被保留——并且上述规则是可观察到的。
4.1. 空白符处理规则
除非另有规定,CSS 中的空白符处理仅影响 文档空白字符:空格 (U+0020)、制表符 (U+0009) 和 段落中断。
注意:被视为 文档空白符(文档内容的一部分)的字符集与被视为语法空白符(CSS 语法的一部分)的字符集不一定完全相同。然而,由于两者都包含空格 (U+0020)、制表符 (U+0009) 和换行符 (U+000A),大多数作者不会注意到任何差异。
除了空格 (U+0020) 和不换行空格 (U+00A0) 之外,Unicode 定义了许多额外的空格分隔符字符。[UNICODE] 在本规范中,Unicode 通用类别 Zs 中除空格 (U+0020) 和不换行空格 (U+00A0) 以外的所有字符统称为 其他空格分隔符。
4.1.1. 第一阶段:折叠与转换
对于 行内格式化上下文 中的每个行内元素(包括匿名行内元素;参见 CSS 2.1 § 9.2.2.1 匿名行内盒 [CSS2]),在 断行 和 双向重排序 之前,空白字符 的处理如下,忽略 双向格式化字符(具有 Bidi_Control 属性的字符 [UAX9]),就像它们不存在一样
- 如果 white-space 设置为 normal, nowrap, 或 pre-line,空白字符 被视为 可折叠的 并通过执行以下步骤进行处理
- 如果 white-space 设置为 pre, pre-wrap, 或 break-spaces,任何空格序列均被视为不换行空格序列。然而,对于 pre-wrap,在 空格 和/或 制表符 序列之后存在一个 软换行机会,而对于 break-spaces,在每个 空格 和每个 制表符 之后都存在一个 软换行机会。
<ltr>A <rtl> B </rtl> C</ltr>
其中 <ltr> 元素表示从左到右嵌入,<rtl> 元素表示从右到左嵌入。如果 white-space 属性设置为 normal,空白符处理模型将导致以下结果
这将留下两个 空格,一个位于从左到右嵌入级别中 A 之后,另一个位于从右到左嵌入级别中 B 之后。文本将根据 Unicode 双向算法进行排序,最终结果为
A BC
注意,在 A 和 B 之间将有两个 空格,而在 B 和 C 之间没有。这最好通过将 空格 放在元素外部而非仅仅放在开始标签和结束标签内部,并且在可行的情况下,通过依赖隐式双向性而不是显式嵌入级别来避免。
4.1.2. 第二阶段:修剪与定位
然后,渲染整个块。考虑到 双向重排序 并按 white-space 属性的规定进行 换行,对行内元素进行布局。当每一行进行布局时,
- 行首的 可折叠的 空格 序列被删除。
- 如果 制表符宽度 为零,则 保留的 制表符 不会被渲染。否则,每个 保留的 制表符 将被渲染为水平移位,将下一个字形的开始边缘与下一个 制表位 对齐。如果此距离小于 0.5ch,则改用随后的 制表位。制表位 出现于距 保留的 制表符 的最近 块容器 祖先的起始内容边缘为 制表符宽度 的倍数处。制表符宽度 由 tab-size 属性给出。
注意:参见 Unicode 关于制表符 (U+0009) 如何与双向文本交互的规则。[UAX9]
- 行尾的 可折叠的 空格 序列被删除,以及任何尾部的 U+1680 欧甘字母空格标记,只要其 white-space 属性为 normal, nowrap, 或 pre-line。
注意:由于 Unicode 双向算法 规则 L1,位于 双向重排序 之前行尾的 可折叠的 空格 序列在重排序后也将位于行尾。[UAX9] [CSS-WRITING-MODES-4]
- 如果(在 双向重排序 [CSS-WRITING-MODES-4] 之后)行尾仍有任何 空白符、其他空格分隔符 和/或 保留的 制表符 序列
- 如果 white-space 设置为 normal, nowrap, 或 pre-line,UA 必须(无条件地) 悬挂 该序列。
- 如果 white-space 设置为 pre-wrap,UA 必须(无条件地) 悬挂 该序列,除非该序列后面跟着一个 强制换行符,在这种情况下,它必须 条件性悬挂 该序列。它还可以视觉上折叠任何否则会溢出的字符推进宽度。
注意:悬挂 空白符而不是折叠它,使用户在选择或编辑文本时能够看到空格。
- 如果 white-space 设置为 break-spaces,空格、制表符 和 其他空格分隔符 的处理方式与其它可见字符相同:它们既不能 悬挂,其推进宽度也不能被折叠。
注意:因此,此类字符会占用空间,并且根据可用空间和适用的断行控制,它们要么会溢出,要么会导致行换行。
p {
white-space : pre-wrap;
width : 5 ch ;
border : solid 1 px ;
font-family : monospace;
text-align : center;
}
< p > 0</ p >
上述样本将按如下方式渲染
由于最终的 空格 位于强制换行符之前且没有溢出,它不会悬挂,居中对齐也如预期般工作。
p {
white-space : pre-wrap;
width : 3 ch ;
border : solid 1 px ;
font-family : monospace;
}
< p > 0 0 0 0</ p >
上述样本将按如下方式渲染
0 0
0
如果添加了 p ,结果将如下所示
0 0
0
由于没有强制换行的行尾处的 保留的 空格 必须 悬挂,因此在文本对齐期间放置行的其余部分时不考虑它们。当向末尾对齐时,这意味着任何此类 空格 都会溢出,并且不会阻止该行其余内容与行边缘齐平。另一方面,带有 强制换行的行尾处的保留空格会 条件性悬挂。由于此示例中最后一行末尾的空格不会溢出,因此它不 悬挂,因此在文本对齐期间被考虑在内。
p {
white-space : pre-wrap;
width : 3 ch ;
border : solid 1 px ;
font-family : monospace;
}
< p > 0 0 0 0</ p >
0 0
最后一行在最后一个 0 之前没有换行,因为在测量行的内容以确定是否适应时,不考虑 条件性悬挂 的字符。
4.1.3. 段落中断转换规则
当 white-space 为 pre, pre-wrap, break-spaces, 或 pre-line 时,段落中断 不可 折叠,而是转换为保留的换行符 (U+000A)。
对于 white-space 的其他值,段落中断 是 可折叠的,并按以下方式折叠
- 首先,任何紧接在另一个可折叠的 段落中断 之后的可折叠 段落中断 均被删除。
- 然后,根据中断前后的上下文,任何剩余的 段落中断 要么转换为空格 (U+0020),要么被删除。此操作的规则在本级别中由 UA 定义。
Here is an English paragraph that is broken into multiple lines in the source code so that it can be more easily read and edited in a text editor.
这是一个在源代码中被拆分为多行的英语段落,以便可以在文本编辑器中更轻松地阅读和编辑。
在没有词分隔符的语言(例如中文)中,“取消中断”一行需要直接连接两行,中间不加空格。
這個段落是那麼長,
在一行寫不行。最好
用三行寫。
這個段落是那麼長,在一行寫不行。最好用三行寫。
段落中断转换规则可以使用相邻上下文将段落中断转换为空格或完全消除它。
注意:历史上,HTML 和 CSS 已经无条件地将 段落中断 转换为空格,这阻止了用中文等语言编写的内容能够在源代码中换行。因此,UA 启发式方法在丢弃 段落中断 时需要保持保守,即使它们在努力改善对此类语言的支持。
4.2. 制表符宽度:tab-size 属性
| 名称 | tab-size |
|---|---|
| 值 | <number [0,∞]> | <length [0,∞]> |
| 初始值 | 8 |
| 应用于 | text |
| 可继承 | 是 |
| 百分比 | 不可用 |
| 计算值 | 指定的数值或绝对长度 |
| 规范顺序 | 不可用 |
| 动画类型 | 按计算值类型 |
此属性确定用于渲染 保留的 制表符 (U+0009) 的 制表符宽度。<number> 表示该度量值作为 保留的 制表符 的最近 块容器 祖先的空格字符 (U+0020) 推进宽度的倍数,包括其关联的 letter-spacing 和 word-spacing。不允许使用负值。
5. 断行与词边界
当行内级内容被布局到行中时,它会在行盒之间断开。这种断开称为 断行。当一行由于显式的断行控制(如 保留的 换行符)或由于块的开始或结束而断开时,它是 强制换行。当一行由于内容 换行(即当 UA 为了使内容适合度量而创建非强制断行时)而断开时,它是 软换行。将行内级内容断开为行的过程称为 断行。
换行仅在允许的断点处执行,称为 软换行机会。启用换行时(参见 white-space),UA 必须通过在 软换行机会 处(如果存在)进行换行,来最小化溢出行的内容量。
在大多数书写系统中,在没有断字的情况下,软换行机会 仅出现在词边界处。许多此类系统使用 空格 或标点符号来显式分隔单词,软换行机会 可以通过这些字符来识别。然而,泰语、老挝语和高棉语等脚本不使用空格或标点符号来分隔单词。虽然零宽空格 (U+200B) 可用作这些脚本中的显式词界定符,但这种做法并不常见。因此,需要词法资源来正确识别此类文本中的 软换行机会。
在某些其他书写系统中,软换行机会 基于正字法音节边界,而非词边界。其中一些系统,如爪哇语和巴厘语,与泰语和老挝语相似,需要对文本进行分析以找到断行机会。在中文(以及日语、彝语,有时也包括韩语)等其他系统中,每个音节往往对应一个 排版字母单位,因此断行约定允许行在除某些字符组合之间的任何位置断开。此外,这些限制的严格程度随排版风格而异。
虽然 CSS 没有完全定义 软换行机会 发生的位置,但提供了一些控制来区分常见变体
- line-break 属性允许为断行限制选择不同级别的“严格性”。
- word-break 属性控制哪些类型的字母被粘在一起形成不可断的“单词”,使 CJK 字符表现得像非 CJK 文本,反之亦然。
- hyphens 属性控制是否允许自动断字以在断字脚本中进行断词。
- overflow-wrap 属性允许 UA 在原本不可断的溢出字符串中的任何位置进行断行。
注意:Unicode 标准附件 #14:Unicode 断行算法 定义了 Unicode 中所有脚本断行的基准行为,预计将进一步定制。[UAX14] 有关断行约定的更多信息,请参见 日本语排版处理要求 [JLREQ] 和日语的 日语文档格式规则 [JIS4051],中文的 中文排版需求 [CLREQ] 和 标点符号用法 [ZHMARK]。另请参见 国际化工作组 的 语言支持索引,其中包含有关其他语言的更多信息。[TYPOGRAPHY] 非常感谢有关其他适当参考资料的任何指导。
5.1. 断行细节
在确定 断行 时
- 断行 和双向文本的交互由 CSS 书写模式 4 § 2.4 应用双向重排序算法 和 Unicode 双向算法(特别是 UAX9§3.4 重排序解析级别)定义。[CSS-WRITING-MODES-4] [UAX9]
- 保留的段落中断,以及——无论 white-space 值如何——任何具有
BK和NL断行类的 Unicode 字符,必须视为强制换行。[UAX14]注:此类强制换行的双向性影响由Unicode 双向算法定义。 [UAX14]
- 除非另有明确定义(例如对于 line-break: anywhere 或 overflow-wrap: anywhere),否则必须遵守为
WJ、ZW、GL和ZWJUnicode 换行类定义的换行行为。 [UAX14] - 在书写系统中,如果用户代理(UA)允许在单词分隔符之外的标点符号处换行,则应优先考虑断点。(例如,如果斜杠后的断行优先级低于空格,那么“check /etc”序列将永远不会在“/”和“e”之间断行。)只要注意避免此类尴尬的断行,建议允许在单词分隔符之外的适当标点符号处断行,因为它能产生视觉上更均匀的页边距,特别是在较窄的版面中。UA 可以利用包含块的宽度、文本语言、line-break 值以及其他因素来分配优先级:CSS 未定义软换行机会的优先级。但是,如果指定了 word-break: break-all,则不预期对单词分隔符进行优先级排序(因为该值明确请求不基于在单词分隔符处断行的换行行为)——并且在 line-break: anywhere 下是被禁止的。
- 流外元素和行内元素边界不会在流中引入强制换行或软换行机会。
- 为了兼容 Web,在每个替换元素或其他原子行内元素之前和之后都存在一个软换行机会,即使在与通常会抑制它们的字符(包括 U+00A0 不换行空格)相邻时也是如此。然而,除 U+00A0 不换行空格外,在原子行内元素与属于 Unicode GL、WJ 或 ZWJ 换行类的相邻字符之间,不得有软换行机会。 [UAX14]
- 对于由在换行时消失的字符(例如 U+0020 空格)创建的软换行机会,直接包含该字符的框上的属性控制该机会处的换行。对于由两个字符或原子行内元素之间的边界定义的软换行机会,两个字符的最近公共祖先上的 white-space 属性控制换行;哪些元素的 line-break、word-break 和 overflow-wrap 属性控制在此类边界处确定软换行机会,在第 3 级中未定义。
- 对于框的第一个字符之前或最后一个字符之后的软换行机会,断行发生在框之前/之后(在其边距边缘处),而不是在框的内容边缘和内容之间断行。
- Ruby 内部/周围的换行定义在 CSS Ruby 注释布局 1 第 3.4 节:跨行断行 中。 [CSS-RUBY-1]
- 为了避免意外的溢出,如果用户代理无法对需要进行换行的任何内容语言执行必要的词法或拼写分析(例如由于缺乏某些语言的字典),则必须假定在该书写系统中的印刷字母单位对之间存在软换行机会。
注:此规定并不仅仅在 UA 未能在特定文本运行中找到单词边界时触发;该文本运行完全可能是一个不可断行的单个单词。例如,当文本运行由高棉语字符(U+1780 至 U+17FF)组成且用户代理不知道如何确定高棉语的单词边界时,它就会适用。
5.2. 字母的断行规则:word-break 属性
| 名称 | word-break |
|---|---|
| 值 | normal | keep-all | break-all | break-word |
| 初始值 | normal |
| 应用于 | text |
| 可继承 | 是 |
| 百分比 | 不可用 |
| 计算值 | 指定关键字 |
| 规范顺序 | 不可用 |
| 动画类型 | 离散 (discrete) |
此属性指定字母之间的软换行机会,即文本行在何处是“正常”且允许断行的。具体而言,它控制在相邻的印刷字母单位之间是否存在通常的软换行机会,将属于 NU、AL、AI 或 ID Unicode 换行类的非字母印刷字符单位(仅)为此目的视为印刷字母单位。 [UAX14] 它不影响由空白(以及其他空格分隔符)和标点符号周围所创建的软换行机会的规则。(关于影响标点符号和小假名的控件,请参阅 line-break。)
再举一例,韩语有两种断行风格:在任意两个韩语音节之间(word-break: normal)或者像英语一样主要在空格处(word-break: keep-all)。
각 줄의 마지막에 한글이 올 때 줄 나눔 기 준을 “글자” 또는 “어절” 단위로 한다.
각 줄의 마지막에 한글이 올 때 줄 나눔 기준을 “글자” 또는 “어절” 단위로 한다.
埃塞俄比亚语同样有两种断行风格,即仅在单词分隔符处断行(word-break: normal),或者也允许在单词内的字母之间断行(word-break: break-all)。
ተወልዱ፡ኵሉ፡ሰብእ፡ግዑዛን፡ወዕሩያን፡ በማዕረግ፡ወብሕግ።ቦሙ፡ኅሊና፡ወዐቅል፡ ወይትጌበሩ፡አሐዱ፡ምስለ፡አሀዱ፡ በመንፈሰ፡እኍና።
ተወልዱ፡ኵሉ፡ሰብእ፡ግዑዛን፡ወዕሩያን፡በማ ዕረግ፡ወብሕግ።ቦሙ፡ኅሊና፡ወዐቅል፡ወይትጌ በሩ፡አሐዱ፡ምስለ፡አሀዱ፡በመንፈሰ፡እኍና።
注:要仅在溢出的情况下启用额外的断行机会,请参阅 overflow-wrap。
值的含义如下:
- normal
- 单词根据其习惯规则断行,如上文所述。韩语通常表现出两种不同的行为,允许在任意两个连续的谚文/汉字之间断行。对于同样表现出两种不同行为的埃塞俄比亚语,单词内不允许此类断行。
- break-all
- 允许在“单词”内断行:具体而言,除了允许正常断行的软换行机会外,任何印刷字母单位(以及任何解析为
NU(“数字”)、AL(“字母”)或SA(“东南亚”)换行类的印刷字符单位 [UAX14])在断行方面被视为ID(“表意文字”)。不应用连字符连接。注:此值不影响标点符号周围是否存在软换行机会。要允许在任何地方断行,请参阅 line-break: anywhere。
注:此选项为埃塞俄比亚语启用了另一种常见行为。它也经常用于文本主要由 CJK 字符组成且仅有少量非 CJK 片段的上下文中,此时希望文本能更好地分布在每一行上。
- keep-all
- 禁止在“单词”内断行:印刷字母单位(或其他属于
NU、AL、AI或IDUnicode 换行类的印刷字符单位 [UAX14])之间的隐含软换行机会会被抑制,即在这些字符对之间禁止断行(无论 line-break 设置如何,anywhere 除外),除非因基于字典的断行而存在断行机会。否则,此选项等同于 normal。在此样式中,CJK 字符序列不会断行。注:这是韩语(使用空格作为单词分隔符)的另一种常见行为,对于将 CJK 片段混合到使用空格进行分隔的其他语言中的混合脚本文本也很有用。
以与特定类别字母相同方式断行的符号,受到的影响与这些字母相同。
这是一些汉字 and some Latin و کمی خط عربی และตัวอย่างการเขียนภาษาไทย በጽሑፍ፡ማራዘሙን፡አንዳንድ፡
断点确定如下(用‘·’表示)
- word-break: normal
-
这·是·一·些·汉·字·and·some·Latin·و·کمی·خط·عربی·และ·ตัวอย่าง·การเขียน·ภาษาไทย·በጽሑፍ፡·ማራዘሙን፡·አንዳንድ፡
- word-break: break-all
-
这·是·一·些·汉·字·a·n·d·s·o·m·e·L·a·t·i·n·و·ﮐ·ﻤ·ﻰ·ﺧ·ﻁ·ﻋ·ﺮ·ﺑ·ﻰ·แ·ล·ะ·ตั·ว·อ·ย่·า·ง·ก·า·ร·เ·ขี·ย·น·ภ·า·ษ·า·ไ·ท·ย·በ·ጽ·ሑ·ፍ፡·ማ·ራ·ዘ·ሙ·ን፡·አ·ን·ዳ·ን·ድ፡
- word-break: keep-all
-
这是一些汉字·and·some·Latin·و·کمی·خط·عربی·และ·ตัวอย่าง·การเขียน·ภาษาไทย·በጽሑፍ፡·ማራዘሙን፡·አንዳንድ፡
当 Arabic 等成型脚本由于 break-all 允许在单词内断行时,字符必须仍被塑造为好像单词未断开一样(参见 § 5.6 跨单词内断行的塑形)。
为了与旧内容兼容,word-break 属性还支持一个已弃用的 break-word 关键字。指定后,其效果与 word-break: normal 和 overflow-wrap: anywhere 相同,而不管 overflow-wrap 属性的实际值如何。
5.3. 换行严格性:line-break 属性
| 名称 | line-break |
|---|---|
| 值 | auto | loose | normal | strict | anywhere |
| 初始值 | auto |
| 应用于 | text |
| 可继承 | 是 |
| 百分比 | 不可用 |
| 计算值 | 指定关键字 |
| 规范顺序 | 不可用 |
| 动画类型 | 离散 (discrete) |
此属性指定应用于元素内的换行规则的严格程度:特别是换行如何与标点符号和符号交互。各值的含义如下
- auto
- UA 确定要使用的换行限制集,并可能根据行的长度改变限制;例如,为短行使用限制较少的换行规则集。
- loose
- 使用限制最少的换行规则集来断开文本。通常用于短行,例如在报纸中。
- normal
- 使用最常见的换行规则集来断开文本。
- strict
- 使用最严格的换行规则集来断开文本。
- anywhere
- 在每个印刷字符单位周围,包括在任何标点符号或保留的空白周围,或在单词中间,都存在一个软换行机会,不考虑任何对换行的禁止,即使是那些由具有
GL、WJ或ZWJ换行类的字符引入或由 word-break 属性强制要求的换行。 [UAX14] 不同的换行机会不得进行优先级排序。不应用连字符连接。注:此值会触发终端中通常可见的换行规则。
注意:anywhere 仅在 white-space 设置为 break-spaces 时,才允许将行末的保留的空白换行到下一行,因为在其他情况下当它对保留的空白产生影响时(配合 white-space: break-spaces),它允许在空格序列的第一个空格之前断行,而 break-spaces 本身并不允许这样做。
CSS 将文本换行规则区分出四个严格等级。对于 loose、normal 和 strict 中每一项所生效的具体规则集由 UA 决定,并应遵循语言惯例。然而,对于这三个关键字,本规范确实要求
- 以下断行在 strict 换行中被禁止,而在 normal 和 loose 中被允许
- 日语小假名或片假名-平假名长音符号(即来自 Unicode 换行类
CJ的字符)之前的断行。 [UAX14]
- 日语小假名或片假名-平假名长音符号(即来自 Unicode 换行类
- 如果书写系统是中文或日文,则允许以下 normal 和 loose 换行,否则禁止
- 某些类似连字符的 CJK 字符之前的断行
〜 U+301C, ゠ U+30A0
- 某些类似连字符的 CJK 字符之前的断行
- 如果前一个字符属于 Unicode 换行类
ID[UAX14](包括前一个字符由于 word-break: break-all 被视为ID的情况),则允许以下 loose 换行,否则禁止- 连字符之前的断行
‐ U+2010, – U+2013
- 连字符之前的断行
- 以下断行在 normal 和 strict 换行中被禁止,而在 loose 中被允许
- 重叠符号之前的断行
々 U+3005, 〻 U+303B, ゝ U+309D, ゞ U+309E, ヽ U+30FD, ヾ U+30FE - 不可分割字符(例如 ‥ U+2025, … U+2026,即来自 Unicode 换行类
IN的字符)之间的断行。 [UAX14]
- 重叠符号之前的断行
- 如果书写系统是中文或日文,则允许以下 loose 换行,否则禁止
注:上述要求仅在 CJK 文本中创建区别。在仅匹配上述规则且无附加规则的实现中,line-break 仅影响 CJK 码位,除非书写系统被标记为中文或日文。未来的级别可能会随着其他书写系统和语言需求变得明确,而为其添加额外的特定规则。
注:CSSWG 认识到,在规范的未来版本中,可能需要对换行进行更精细的控制,以满足高端出版要求。
5.5. 连字符连接:hyphens 属性
连字符连接(Hyphenation) 是对单词的有控制拆分,在通常不允许断行的地方进行拆分以改善段落布局,通常在音节或语素边界处拆分单词,并经常在视觉上指示拆分(通常通过插入连字符 U+2010)。在某些情况下,连字符连接也可能改变单词的拼写。无论如何,连字符连接仅是渲染效果:它对底层文档内容或文本选择或搜索不得产生任何影响。
| 语言 | 未断行 | 前 | 后 |
|---|---|---|---|
| 英语 | 未断行 | Un‐ | broken |
| 荷兰语 | cafeetje | café‐ | tje |
| 匈牙利语 | Összeg | Ösz‐ | szeg |
| 普通话 | tú’àn | tú‐ | àn |
| àizēng‐fēnmíng | àizēng‐ | ‐fēnmíng | |
| 维吾尔语 | | | |
| 克里语 | | | |
当在有效的连字符连接机会处换行时,就会发生连字符连接,这是在允许连字符连接的单词内存在的一种软换行机会。在 CSS 中,连字符连接机会由 hyphens 属性控制。CSS 文本第 3 级没有定义连字符连接的确切规则;然而,强烈鼓励 UA 优化其断点选择,并选择语言合适的连字符连接点。
注:由 U+002D - 连字符-减号字符或 U+2010 ‐ 连字符字符引入的软换行机会不是连字符连接机会,因为在换行时并没有创建拆分的视觉指示:无论行是否在该点换行,这些字符都是可见的。
在计算最小内容固有大小时,会考虑连字符连接机会。
注:这允许表格对其内容进行连字符连接而不是溢出其包含块,这在德语等长单词语言中尤为重要。
| 名称 | hyphens |
|---|---|
| 值 | none | manual | auto |
| 初始值 | manual |
| 应用于 | text |
| 可继承 | 是 |
| 百分比 | 不可用 |
| 计算值 | 指定关键字 |
| 规范顺序 | 不可用 |
| 动画类型 | 离散 (discrete) |
此属性控制是否允许连字符连接在文本行内创建更多的软换行机会。各值的含义如下
- none(无)
- 单词不会进行连字符连接,即使单词内部的字符明确定义了连字符连接机会。
注:这不会抑制由 U+002D - 连字符-减号或 U+2010 ‐ 连字符等始终可见字符引入的现有软换行机会。
- manual
- 仅在单词内部有明确建议连字符连接机会的字符时,单词才会进行连字符连接。UA 必须使用适当的特定语言连字符连接字符,并应应用任何适当的拼写更改,就像在同一点进行自动连字符连接一样。
- auto
- 除了由条件连字符明确指出的机会外,单词还可以在由语言合适的连字符连接资源自动确定的连字符连接机会处断行。如果单词包含条件连字符(­ 或 U+00AD 软连字符),则必须忽略单词内其他地方的自动连字符连接机会,优先使用条件连字符。然而,如果即使在这些机会处断行后,该单词的一部分仍然太长而无法适应一行,则可以使用自动连字符连接机会。
正确的自动连字符连接需要适合被断行文本语言的连字符连接资源。因此,UA 必须仅对已知内容语言且拥有相应连字符连接资源的文本自动进行连字符连接。
UA 可以使用语言定制的启发式方法从自动连字符连接中排除某些单词。例如,UA 可能尝试通过排除匹配特定大写和标点模式的单词来避免专有名词中的连字符连接。此类启发式方法未由本规范定义。(请注意,此类启发式方法需要随语言而异:例如,英语和德语有非常不同的大写惯例。)
就 hyphens 属性而言,构成“单词”的内容取决于 UA。但是,在确定单词边界时,必须忽略行内元素边界和流外元素。
任何由于条件连字符(如 U+00AD 软连字符)创建的连字符连接机会处因连字符连接而显示的字形,都由该字符表示,并根据应用于该字符的属性进行样式设置。
当 Arabic 等成型脚本由于连字符连接允许在单词内断行时,字符必须仍被塑造为好像单词未断开一样(参见 § 5.6 跨单词内断行的塑形)。
5.5. 溢出换行:overflow-wrap/word-wrap 属性
| 名称 | overflow-wrap, word-wrap |
|---|---|
| 值 | normal | break-word | anywhere |
| 初始值 | normal |
| 应用于 | text |
| 可继承 | 是 |
| 百分比 | 不可用 |
| 计算值 | 指定关键字 |
| 规范顺序 | 不可用 |
| 动画类型 | 离散 (discrete) |
此属性指定当一个本来不可断行的字符串太长而无法适应行盒时,UA 是否可以在行内本来不允许断行的地方断行,以防止溢出。它仅在 white-space 允许换行时才有效。各值含义如下
- normal
- 行仅在允许的断行点处断行。但是,如果行中没有其他可接受的断行点,则可以放宽 word-break: keep-all 引入的限制以匹配 word-break: normal。
- anywhere
- 如果行中没有其他可接受的断行点,一个本来不可断行的字符序列可以在任意点断开。成型字符仍被塑造为好像单词未断开一样,且字素簇必须作为一个单位保持在一起。断行点处不会插入任何连字符连接字符。由 anywhere 引入的软换行机会在计算最小内容固有大小时会被考虑。
- break-word
- 与 anywhere 相同,但由 break-word 引入的软换行机会在计算最小内容固有大小时不会被考虑。
出于旧版兼容性考虑,UA 必须将 word-wrap 视为 overflow-wrap 属性的旧名称别名。
5.6. 跨单词内断行的塑形
当 Arabic 等成型脚本在单词内非强制的软换行机会处换行时(例如由于 word-break: break-all、line-break: anywhere、overflow-wrap: break-word、overflow-wrap: anywhere 或进行连字符连接而断行时),字符必须仍被塑造(选择其连接形式)为好像单词仍然完整一样。
6. 对齐与两端对齐
对齐与两端对齐控制行内内容如何在行盒内分布。
6.1. 文本对齐:text-align 速记属性
| 名称 | text-align |
|---|---|
| 值 | start | end | left | right | center | justify | match-parent | justify-all |
| 初始值 | start |
| 应用于 | 块容器 |
| 可继承 | 是 |
| 百分比 | 见各个属性 |
| 计算值 | 见各个属性 |
| 动画类型 | 离散 (discrete) |
| 规范顺序 | 不可用 |
此速记属性设置 text-align-all 和 text-align-last 属性,并描述如果行内内容没有完全填满行盒,块的行内级内容如何沿行内轴对齐。除 justify-all 或 match-parent 之外的值被分配给 text-align-all 并将 text-align-last 重置为 auto。
值的含义如下:
- start
- 行内级内容与行盒的起始边缘对齐。
- end
- 行内级内容与行盒的结束边缘对齐。
- left
- 行内级内容与行盒的行左边缘对齐。(在垂直书写模式下,这取决于 writing-mode,可能是物理上的顶部或底部。) [CSS-WRITING-MODES-4]
- right
- 行内级内容与行盒的行右边缘对齐。(在垂直书写模式下,这取决于 writing-mode,可能是物理上的顶部或底部。) [CSS-WRITING-MODES-4]
- center
- 行内级内容在行盒内居中。
- justify (两端对齐)
- 文本根据 text-justify 属性指定的方法进行两端对齐,以精确填充行盒。除非 text-align-last 另有规定,否则强制换行符之前的最后一行或块的末尾是起始对齐的。
- justify-all
- 将 text-align-all 和 text-align-last 都设置为 justify,同时也强制最后一行进行两端对齐。
- match-parent
- 此值表现得与 inherit 相同(计算为其父级的计算值),区别在于 继承的值 start 或 end 根据父级的 direction 值进行解释,并得出 left 或 right 的计算值。在根元素上指定时,计算为 start。
当在 text-align 速记属性上指定时,将 text-align-all 和 text-align-last 都设置为 match-parent。
文本块是一叠行盒。此属性指定每个行盒内的行内级盒如何相对于行盒的起始和结束侧对齐。对齐方式不是相对于视口或包含块的。
在 justify 的情况下,UA 可以通过调整其文本来拉伸或收缩任何行内盒。(参见 text-justify。)如果一个元素的空白不是可折叠的,则不需要 UA 为了两端对齐的目的而调整其文本,而是可以将其视为没有两端对齐机会。如果 UA 选择调整文本,则必须确保制表位继续按照空白处理规则的要求对齐。
如果(在可能进行的任何两端对齐后)行盒内的行内内容太长而无法适应,则内容为起始对齐:任何放不下的内容将溢出行盒的结束边缘。
有关如何确定行盒起始和结束边缘的详细信息,请参阅 § 8.3 双向性与行盒。
6.2. 默认文本对齐:text-align-all 属性
| 名称 | text-align-all |
|---|---|
| 值 | start | end | left | right | center | justify | match-parent |
| 初始值 | start |
| 应用于 | 块容器 |
| 可继承 | 是 |
| 百分比 | 不可用 |
| 计算值 | 按指定的关键字,除了 match-parent 按上述方式计算外 |
| 规范顺序 | 不可用 |
| 动画类型 | 离散 (discrete) |
此 text-align 速记属性的长手属性指定块容器中所有行内内容行的行内对齐方式,但被 text-align-last 的非 auto 值覆盖的最后一行除外。有关值的完整描述,请参阅 text-align。
作者应使用 text-align 速记属性,而不是此属性。
6.3. 最后一行对齐:text-align-last 属性
| 名称 | text-align-last |
|---|---|
| 值 | auto | start | end | left | right | center | justify | match-parent |
| 初始值 | auto |
| 应用于 | 块容器 |
| 可继承 | 是 |
| 百分比 | 不可用 |
| 计算值 | 按指定的关键字,除了 match-parent 按上述方式计算外 |
| 规范顺序 | 不可用 |
| 动画类型 | 离散 (discrete) |
此属性描述块的最后一行或强制换行符之前的一行如何对齐。
如果指定了 auto,则受影响行上的内容根据 text-align-all 对齐,除非 text-align-all 设置为 justify,在这种情况下它是起始对齐的。所有其他值按 text-align 的说明进行解释。
6.4. 两端对齐方法:text-justify 属性
| 名称 | text-justify |
|---|---|
| 值 | auto | none | inter-word | inter-character |
| 初始值 | auto |
| 应用于 | text |
| 可继承 | 是 |
| 百分比 | 不可用 |
| 计算值 | 指定的关键字(distribute 旧值除外) |
| 规范顺序 | 不可用 |
| 动画类型 | 离散 (discrete) |
此属性选择当行的对齐方式设置为 justify 时使用的两端对齐方法(参见 text-align)。该属性适用于文本,但会从块容器继承到包含其行内级内容的根行内盒。它采用以下值
- auto
- UA 确定遵循的两端对齐算法,基于性能和足够演示质量之间的平衡。由于两端对齐规则随书写系统和语言而异,UA 应尽可能使用适合文本的两端对齐算法。例如,UA 默认可以使用一种对所有书写系统来说都是简单通用折衷方案的两端对齐方法——例如主要沿单词分隔符和 CJK 印刷字母单位之间进行扩展,次要在东南亚印刷字母单位之间进行扩展。然后,在已知段落的内容语言的情况下,它可以选择更具语言针对性的两端对齐行为,例如遵循 日语排版要求 处理日文 [JLREQ],对阿拉伯语使用草书拉伸,对德语使用 inter-word 等。

由 Tasmeem 渲染的草书两端对齐阿拉伯语文本示例。像英语一样,阿拉伯语可以通过调整单词之间的间距进行两端对齐,但在大多数样式中,它也可以通过书写上的拉伸或压缩字符形式本身来进行两端对齐。在此示例中,上部的文本通过使用拉伸(kashida)形式和花体形式进行扩展以填充行,而底部的行则通过使用字符之间的堆叠组合略微压缩。通过采用传统的书写技巧,排版者可以对齐行并保持流动性和色彩,提供非常高质量的两端对齐效果。然而,这本质上是一种非常针对脚本的效果。
使用 text-justify: auto 的混合脚本文本:此解释使用一种通用折衷的两端对齐方法,在空格处以及 CJK 和东南亚字母之间进行扩展。对于具有单词分隔符和/或 CJK 字符的行,这有效地使用了单词间 + 表意文字间的间距,并对没有这些内容或空格拉伸过大的行退回到字符簇间距行为。 - none(无)
- 禁用两端对齐:文本内没有两端对齐机会。
使用 text-justify: none 的混合脚本文本 注:此值旨在用于用户样式表,以提高可读性或用于辅助功能目的。
- inter-word
- 两端对齐仅调整单词分隔符处的间距(实际上改变了行上使用的 word-spacing)。这种行为是英语或韩语等使用空格分隔单词的语言的典型表现。
使用 text-justify: inter-word 的混合脚本文本 - inter-character
- 两端对齐调整每对相邻印刷字符单位之间的间距(实际上改变了行上使用的 letter-spacing)。此值有时用于日语等东亚系统。
使用 text-justify: inter-character 的混合脚本文本 出于旧版兼容性考虑,UA 还必须支持替代关键字 distribute,它必须计算为 inter-character,从而具有完全相同的含义和行为。UA 可以将其视为 旧值别名。
由于最佳的两端对齐对语言敏感,作者应正确对其内容进行语言标记以获得最佳结果。
注:本级 CSS 中的指南并未描述完整的两端对齐算法。它们仅是一个完整算法应满足的最低限度要求。限制要求集给了 UA 一定的余地,可以选择满足其需求并达到所需的质量、速度和复杂性平衡的两端对齐算法。
6.4.1. 扩展与压缩文本
当对齐文本时,UA 获取行内容末尾与行盒边缘之间的剩余空间,并将其分布在内容中,以便内容精确填满行盒。UA 也可以选择分配负空间,使行上容纳的内容多于正常间距条件下所能容纳的内容。
一个 两端对齐机会(justification opportunity) 是两端对齐算法可以更改文本内间距的点。两端对齐机会可以由单个印刷字符单位(例如单词分隔符)提供,也可以由两个印刷字符单位的并置提供。与软换行机会的控件一样,一个印刷字符单位是否提供两端对齐机会由其父级的 text-justify 值控制;同样,两个连续印刷字符单位之间是否存在两端对齐机会,由其最近公共祖先的 text-justify 值决定。
通过两端对齐分布的空格是在 letter-spacing 或 word-spacing 属性定义的间距之外的。当此类额外空间分布到单词分隔符两端对齐机会时,它将按照与 word-spacing 相同的规则应用。同样,当空间分布到两个印刷字符单位之间的两端对齐机会时,应按照与 letter-spacing 相同的规则应用。
两端对齐算法可以将两端对齐机会分为不同的优先级级别。给定级别内的所有两端对齐机会以相同的优先级进行扩展或压缩,无论是由哪个印刷字符单位创建了该机会。例如,如果将两个汉字之间和两个拉丁字母之间的两端对齐机会定义为处于同一级别(正如在 inter-character 两端对齐样式中那样),则不会因为它们源自不同的印刷字符单位而受到不同的对待。在本级别中未定义其他因素(例如字号、字母间距、字形形状、行内位置等)是否或如何影响行内两端对齐机会的空间分布。
UA 可以启用或断开可选连字,或使用其他字体特性(如替代字形或字形压缩)来帮助根据任何方法对齐文本。这种行为不受本级 CSS 的控制。然而,UA 不得断开所需的连字或以其他方式禁用正确塑造复杂脚本所需的特性。
如果行内存在两端对齐机会,且文本对齐指定了完全两端对齐(justify),则该行必须进行两端对齐。
6.4.2. 处理符号与标点符号
在确定两端对齐机会时,来自 Unicode 符号(S*)和标点(P*)类的印刷字符单位通常被视为与同一脚本的印刷字母单位相同(或者,如果字符的脚本属性为 Common,则被视为占主导地位脚本的印刷字母单位)。
然而,根据排版传统,可能存在控制符号和标点符号两端对齐的其他规则。因此,UA 可以重新分配特定字符或引入额外的优先级级别来处理涉及符号和标点符号的两端对齐机会。
6.4.3. 不可扩展文本
如果行的行内内容无法拉伸到行盒的全宽,则必须根据 text-align-last 属性进行对齐。(如果 text-align-last 为 justify,则必须按照 center 对齐。)
6.4.4. 草书脚本
两端对齐不得在阿拉伯语等草书脚本连接的印刷字母单位之间引入间隙。如果能够,UA 可以将分布到此类印刷字母单位运行内两端对齐机会的空间转化为该运行的一种草书拉伸。否则,它必须假定草书脚本中任何一对印刷字母单位之间都不存在两端对齐机会(无论它们是否连接)。
一些字体设计允许使用 tatweel 字符进行两端对齐。执行基于 tatweel 的两端对齐的 UA 必须正确处理其使用规则。请注意,tatweel 字符的正确插入取决于上下文,包括所涉及的字母组合、单词内的位置以及单词在行内的位置。
6.4.5. auto 两端对齐的最低要求
对于 auto 两端对齐,本规范并未定义所有的两端对齐机会是什么、它们如何优先级排序,或多级两端对齐机会何时以及如何交互。然而,它确实要求
- 除非内容语言的排版传统或相邻符号/标点符号另有相反规定,否则以下每一项都提供一个两端对齐机会
- 所有属于块脚本的字母都被同等对待,所有属于簇状脚本的字母也被同等对待。例如,汉字后面跟着汉字与汉字后面跟着谚文之间的两端对齐机会没有任何区别。
有关文本两端对齐的更多信息,可以在 “完全两端对齐的方法” 中找到(或提交给它),该文档按书写系统和语言索引,由 W3C 国际化工作组维护。 [JUSTIFY]
7. 间距
CSS 通过 word-spacing 和 letter-spacing 属性提供对文本间距的控制,这些属性分别指定单词分隔符周围或印刷字符单位之间的额外空间。
7.1. 单词间距:word-spacing 属性
| 名称 | word-spacing |
|---|---|
| 值 | normal | <length> |
| 初始值 | normal |
| 应用于 | text |
| 可继承 | 是 |
| 百分比 | 不适用 |
| 计算值 | 绝对长度 |
| 规范顺序 | 不可用 |
| 动画类型 | 按计算值类型 |
此属性指定“单词”之间的额外间距。值按以下定义进行解释
- normal
- 不应用额外间距。计算为零。
- <length>(长度)
- 指定在字体定义的固有单词间距之外的额外间距。
额外间距应用于空白处理规则应用后文本中留下的每个单词分隔符,除非排版传统另有规定,否则应在字符的两侧各应用一半。值可以是负数,但可能存在与实现相关的限制。
单词分隔符 是主要目的和一般用法是分隔单词的印刷字符单位。在 Unicode 中,这包括(但不详尽地定义为)空格(U+0020)、不换行空格(U+00A0)、埃塞俄比亚语单词空间(U+1361)、爱琴海单词分隔符(U+10100,U+10101)、乌加里特语单词分隔符(U+1039F)和腓尼基语单词分隔符(U+1091F)。 [UNICODE]
注:一般标点符号和固定宽度空格(如 U+3000 和 U+2000 到 U+200A)都不被视为单词分隔符,因为尽管它们经常恰好分隔单词,但它们的主要目的不是分隔单词。
如果没有单词分隔符,或者如果单词分隔字符具有零进位宽度(例如 U+200B 零宽空格),则 UA 不得在单词之间创建额外的间距。
7.2. 字间距调整(Tracking):letter-spacing 属性
| 名称 | letter-spacing |
|---|---|
| 值 | normal | <length> |
| 初始值 | normal |
| 应用于 | 行内盒和文本 |
| 可继承 | 是 |
| 百分比 | 不可用 |
| 计算值 | 绝对长度 |
| 规范顺序 | 不可用 |
| 动画类型 | 按计算值类型 |
此属性用于指定相邻印刷字符单元之间的额外间距(通常称为字距调整 (tracking))。Letter-spacing 应用于双向重排序 (bidi reordering) 之后,且是字距微调 (kerning) 和 word-spacing 的补充。 [CSS-WRITING-MODES-4] [CSS-FONTS-3] 根据生效的对齐规则,用户代理可能会进一步增加或减少印刷字符单元之间的空间,以实现文本对齐 (justify text)。
值的含义如下:
- normal
- 不应用额外间距。计算为零。
- <length>(长度)
- 指定印刷字符单元之间的额外间距。值可以是负数,但可能存在与实现相关的限制。
出于兼容旧版本的原因,计算值为零的 letter-spacing 会产生一个解析值(即 getComputedStyle() 的返回值),该值为 normal。
就 letter-spacing 而言,每一串连续的原子内联元素(例如图像和内联块)均被视为单个印刷字符单元。
Letter-spacing 不得应用于行首。在当前版本中,Letter-spacing 是否应用于行尾未做定义。
p{ letter-spacing : 1 em ; }
< p > abc</ p >
a b c
a b c
因此,用户代理确实不应该 [RFC6919] 在一行的右端或末尾添加字距间距
a b c
两个印刷字符单元之间的字距实际上“属于”包含这两个印刷字符单元的最内层元素:两个相邻印刷字符单元(在双向重排序后)之间的总字距由包含这两个印刷字符单元边界的最内层元素指定并渲染。然而,用户代理也可以根据其包含元素的 letter-spacing 值,将元素边界处的 letter-spacing 附加到其中一个印刷字符单元上。
注意:出于 Web 兼容性的考虑,本版本允许这种次要行为。
p{ letter-spacing : 1 em ; }
< p > a< span > bb</ span > c</ p >
a b b c
a b b c
因此,给定的 letter-spacing 值应仅影响完全包含在该指定元素内的字符之间的间距
p{ letter-spacing : 1 em ; } span{ letter-spacing : 2 em ; }
< p > a< span > bb</ span > c</ p >
a b b c
这进一步意味着对仅包含单个字符的元素应用 letter-spacing 对渲染结果没有影响
p{ letter-spacing : 1 em ; } span{ letter-spacing : 2 em ; }
< p > a< span > b</ span > c</ p >
a b c
由于字距是在 RTL 重排序之后插入的,因此应用于下方内部 span 的字距同样无效,因为重排序后 "c" 并未与 "א" 相邻
p{ letter-spacing : 1 em ; } span{ letter-spacing : 2 em ; }
<!-- abc followed by Hebrew letters alef (א), bet (ב) and gimel (ג) --> <!-- Reordering will display these in reverse order. --> < p > ab< span > cא</ span > בג</ p >
a b c א ב ג
字距调整会忽略不可见的零宽格式字符(例如 Unicode Cf 类别中的字符)。添加间距时必须表现得如同这些字符在文档中不存在一样。
当两个字符之间的有效间距不为零时(无论是由于对齐 (justification) 还是非零的 letter-spacing 值),用户代理不应应用可选连字(即那些未定义为基本正确字形塑造所必需的连字)。但是,通过底层的 font-feature-settings 属性指定的连字和其他字体特性优先于此规则。参见 CSS Fonts Module Level 3 § feature-precedence。
注意:在 OpenType 中,所需的连字应与 rlig 特性相关联。因此,所有其他连字都被视为可选。但在某些情况下,UA 或平台的启发式算法会应用额外的连字以处理损坏的字体;本规范不定义或覆盖此类特殊处理。
7.2.1. 连笔脚本 (Cursive Scripts)
如果可能,UA 可以通过将要分配给此类字母串的总额外空间转化为某种形式的连笔伸展(或对于负值进行压缩)来对连笔脚本应用字距调整,从而使该串产生等效的总扩展(或压缩)。否则,如果 UA 无法在不破坏连笔连接的情况下扩展连笔脚本的文本,则它绝对不能在该脚本的任何印刷字母单元对之间应用间距(就字距调整而言,实际上将每个单词视为单个印刷字母单元)。这两种情况都会导致此类字母之间的有效间距为零;但前者会保持文本被拉伸的感觉。
| — | 原始文本 | |
| 错误 | 在每个字母之间均匀分布空间。注意这会破坏连笔连接! | |
|---|---|---|
| 正确 | 通过印刷上适当的连笔伸展来分配 ∑letter-spacing。产生的文本长度与之前均匀间距的示例相同。 | |
| 正确 | 抑制阿拉伯字母之间的 letter-spacing。注意,letter-spacing 仍然应用于非阿拉伯字符(如空格)。 | |
| 错误 | 仅在非连接字母之间应用 letter-spacing。这会破坏印刷色彩并混淆单词边界。 |
注意:文本的适当连笔伸展或压缩可能会根据脚本、字体、语言、单词内的位置、行内的位置、实现复杂性、字体功能和书法偏好而有所不同,在某些情况下可能根本无法实现。它可能涉及使用缩写连字、花体变体、上下文形式、伸展字形(如 U+0640 ـ ARABIC TATWEEL)或其他微型印刷术。定义这些效果的规则不在 CSS 的范围内。除非作者准备好接受非互操作的结果,否则应避免对连笔脚本应用 letter-spacing。
7.3. 跨元素边界的字符塑造 (Shaping Across Element Boundaries)
当任何分隔两个印刷字符单元的框满足以下任意条件时,文本塑造必须在内联框边界处中断
- 分隔内联轴上两个印刷字符单元的任意margin/border/padding 不为零。
- vertical-align 不是 baseline。
- 边界是一个双向隔离边界 (bidi isolation boundary)。
当格式没有有效改变,或者唯一的格式改变不影响字形(例如应用文本装饰)时,文本塑造不得在内联框边界处中断。
否则,如果考虑到字体技术的局限性,在合理且可能的情况下,文本塑造不应在内联框边界处中断。
跨边界可能但不合理塑造的一个例子是处理一种对两侧 20 个字符上下文敏感以选择其字形的字体:将所有文本在字符串之前和之后传递,甚至通过具有格式更改的多个内联边界,是复杂的。UA 可以处理此类情况,但并非必须,因为它们不是现代书写系统的典型或根本要求。
跨边界塑造不可能的一个例子是:在一个连字会将单词“and”的所有三个字母替换为“&”字形的情况下,在单词“and”中间改变字体权重。
8. 边缘效果 (Edge Effects)
边缘效果控制行相对于块中其他行的缩进(text-indent),以及如何在行的起始和结束边缘测量内容(hanging-punctuation)。
8.1. 首行缩进:text-indent 属性
| 名称 | text-indent |
|---|---|
| 值 | [ <length-percentage> ] && hanging? && each-line? |
| 初始值 | 0 |
| 应用于 | 块容器 |
| 可继承 | 是 |
| 百分比 | 指块容器自身的内联轴 (inline-axis) 内部尺寸 |
| 计算值 | 计算出的 <length-percentage> 值,加上任何指定的关键字 |
| 规范顺序 | 按语法 |
| 动画类型 | 按计算值类型 |
此属性指定应用于块中内联内容行的缩进。缩进被视为应用于行框起始边缘的 margin。
除非 each-line 和/或 hanging 关键字另有规定,否则仅影响元素的第一格式化行。 [CSS-PSEUDO-4] 例如,匿名块框的第一行仅在其为父元素的第一个子元素时受影响。
值的含义如下:
- <length>(长度)
- 以绝对长度给出缩进量。
- <percentage>(百分比)
- 以块容器自身逻辑宽度的百分比给出缩进量。
出于计算固有尺寸贡献的目的,百分比必须视为 0,但在执行布局时总是按正常方式解析。
注意:这可能导致元素溢出。不建议同时使用百分比缩进和固有尺寸计算。
- each-line
- 缩进会影响每个块容器的第一行以及强制换行符之后的每一行(但不影响软换行符之后的行)。
- hanging
- 反转受影响的行。
如果 text-align 为 start,且 text-indent 为 5em,在从左到右且没有浮动元素的文本中,第一行文本将从块内 5em 处开始。
Since CSS1 it has been possible to indent the first line of a block element 5em by setting the 'text-indent' property to '5em'.
如果我们添加 hanging 关键字,则第一行将紧贴边缘,但其他行将缩进 5em。
In CSS3 we can instead indent all other
lines of the block element by 5em
by setting the 'text-indent' property
to 'hanging 5em'.
For example, in the middle of
this paragraph is an equation,
which is centered:
x + y = z
The first line after the equation
is flush (else it would look like
we started a new paragraph).
然而,有时(如诗歌或代码),缩进每一行足够长的换行文本是合适的。在以下示例中,text-indent 被赋予 3em hanging each-line 的值,这使得诗歌的第三行在其于块右边界处软换行时出现悬挂缩进。
In a short line of text There need be no wrapping, But when we go on and on and on and on, Sometimes a soft break Can help us stay on the page.
注意:由于 text-indent 属性具有继承性,当在块元素上指定时,它会影响后代内联块元素。因此,在指定了 display: inline-block 的元素上指定 text-indent: 0 通常是明智的。
8.2. 悬挂字形 (Hanging Glyphs)
当行起始或结束边缘处的字形悬挂 (hangs)时,在测量该行的内容以进行匹配、对齐或对齐 (justification) 时,不考虑该字形。根据行的对齐方式,这可能导致标记被放置在行框之外。在计算固有尺寸(最小内容尺寸和最大内容尺寸)及其衍生的尺寸时,悬挂字形也不计入其中。(这种测量与字距微调的交互目前由 UA 定义;CSSWG 欢迎对此提出建议。)
悬挂字形 仍然包含在其父内联框内,并且仍然参与文本对齐:只是在确定行内适合多少内容、需要多少内容进行对齐以进行拉伸或压缩,或者如何为文本对齐在行框内定位内容时,不测量其字符进度。实际上,悬挂字形的字符进度被重新解释为在其父内联框受影响边缘上的额外负 margin;行在其他方面按常规布局。溢出的悬挂字形通常应视为墨迹溢出 (ink overflow),以避免产生不必要的滚动条,但当内容可编辑或在其他用户需要将其视为可滚动溢出 (scrollable overflow) 的情况下,UA 可以将其视为可滚动溢出。 [CSS-OVERFLOW-3]
在某些情况下,行尾的字形可以条件悬挂 (conditionally hang):仅当它在对齐前不适合行内时才悬挂。在测量行内容是否匹配时,不考虑它;然而,任何不适合的部分被视为悬挂。在计算最小内容尺寸及其衍生的尺寸时,条件悬挂的字形不计入,但在最大内容尺寸及其衍生的尺寸计算时,它们被计入。
可悬挂字形与行边缘之间的非零内联轴边框或内边距会阻止字形悬挂。例如,在带有末尾内边距的内联框末尾的句点不会在行的末端边缘悬挂。
多个相邻的字形可以一起悬挂,但是可以指定允许悬挂数量的具体限制(例如,在行的每个边缘最多可以悬挂一个标点符号)。
8.2.1. 悬挂标点:hanging-punctuation 属性
| 名称 | hanging-punctuation |
|---|---|
| 值 | none | [ first || [ force-end | allow-end ] || last ] |
| 初始值 | none(无) |
| 应用于 | text |
| 可继承 | 是 |
| 百分比 | 不可用 |
| 计算值 | 指定的关键字 |
| 规范顺序 | 按语法 |
| 动画类型 | 离散 (discrete) |
此属性决定标点符号(如果存在)是否悬挂并可能被放置在行框外部(或缩进中),位于文本行的起始或结束处。
注意:如果块容器上没有足够的内边距,hanging-punctuation 可能会引发溢出。
值的含义如下:
- none(无)
- 没有任何标点符号被设为悬挂。
- first
- 元素第一格式化行开头的开括号、引号或表意空格悬挂。这适用于所有属于 Unicode 类别 Ps、Pf、Pi 的字符,外加 ASCII 引号 U+0027 ' APOSTROPHE 和 U+0022 " QUOTATION MARK 以及表意空格 U+3000。
- last
- 元素最后格式化行末尾的闭括号或引号悬挂。这适用于所有属于 Unicode 类别 Pe、Pf、Pi 的字符,外加 ASCII 引号 U+0027 ' APOSTROPHE 和 U+0022 " QUOTATION MARK。
- force-end
- 行末尾的句号或逗号悬挂。
- allow-end
- 行末尾的句号或逗号条件悬挂。
在行的每个边缘最多可以悬挂一个标点符号。
允许悬挂的句号和逗号包括
| U+002C | , | 逗号(COMMA) |
| U+002E | . | 句点(FULL STOP) |
| U+060C | ، | 阿拉伯逗号 (ARABIC COMMA) |
| U+06D4 | ۔ | 阿拉伯句号 (ARABIC FULL STOP) |
| U+3001 | 、 | 表意文字逗号 |
| U+3002 | 。 | 表意文字句号 |
| U+FF0C | , | 全角逗号 |
| U+FF0E | . | 全角句号 |
| U+FE50 | ﹐ | 小逗号 (SMALL COMMA) |
| U+FE51 | ﹑ | 小表意逗号 (SMALL IDEOGRAPHIC COMMA) |
| U+FE52 | ﹒ | 小句号 (SMALL FULL STOP) |
| U+FF61 | 。 | 半宽表意句号 (HALFWIDTH IDEOGRAPHIC FULL STOP) |
| U+FF64 | 、 | 半宽表意逗号 (HALFWIDTH IDEOGRAPHIC COMMA) |
UA 可以酌情包含其他字符。
注意:如果 UA 包含其他字符,CSS 工作组将不胜感激其能通知工作组。
p{ text-align : justify; hanging-punctuation : allow-end; }
p{ text-align : justify; hanging-punctuation : force-end; }
对于 allow-end,第一行末尾的标点符号不会悬挂,因为它不悬挂也能放入。但是,如果使用 force-end,它会被强制悬挂。对齐计算的是不带悬挂标点的行。因此,当行被拉伸时,标点符号会被推到行外。
8.3. 双向性与行框 (Bidirectionality and Line Boxes)
行框的起始 (start) 和结束 (end) 侧由行框的内联基准方向 (inline base direction) 决定。尽管它们通常一致,但行框的内联基准方向与包含块或双向段落的内联基准方向是不同的。行框的内联基准方向会影响 text-align-all、text-align-last、text-indent 和 hanging-punctuation——即其内容相对于边缘的位置和对齐方式。它不影响内联内容的格式或顺序(这由 CSS Writing Modes [UAX9] [CSS-WRITING-MODES-4] 应用的 Unicode 双向算法 控制)。
在大多数情况下,行框的内联基准方向由其包含块的计算 direction 给出。但是,如果其包含块具有 unicode-bidi: plaintext [CSS-WRITING-MODES-4]
- 如果行框所属的双向段落(即行框所承载内容的双向段落)具有强方向性,则行框的内联基准方向即为该方向。
- 如果行框为空(即不包含原子内联元素或除换行符之外的字符)或没有强方向性(仅包含弱或中性字符),其内联基准方向取自前一个行框(如果有),或者如果这是包含块中的第一个行框,则取自包含块的 direction 属性。(这可能导致一个内容具有 LTR 基准方向的 RTL 行框。)
<block> 是一个起始对齐的预格式化块(display: block; white-space: pre; text-align: start),每隔一行即为右对齐< block style = "unicode-bidi: plaintext" > français فارسی français فارسی français فارسی</ block >
< para style = "display: block; direction: rtl; unicode-bidi:plaintext" > “< quote style = "unicode-bidi:plaintext" > שלום!</ quote > ”, they said.</ para >
< textarea style = "direction: rtl; unicode-bidi:plaintext" > Hello!</ textarea >
由于 unicode-bidi: plaintext,“Hello!” 被排版为 LTR(即感叹号在右侧)并左对齐,忽略了包含块的 RTL direction。这使得随后的空行也为 LTR,这意味着该行上的插入符号应出现在其左边缘。然而,空的第一个行是右对齐的:由于没有前一行,它假设为其包含块的 RTL 方向。
附录 A:文本处理操作顺序
本附录是规范性的。
以下列表定义了文本操作的顺序。(只要产生的布局相同,实现不必遵循此顺序。)
- 空白处理 第一部分(预换行)
- 文本转换
- 文本组合 (text combination) [CSS-WRITING-MODES-4]
- 文本方向 (text orientation) [CSS-WRITING-MODES-4]
- 自动换行 (text wrapping),同时应用每行规则
- 对齐 (justification)(这可能会影响字形选择和/或自动换行,并循环回到该步骤)
- 文本对齐
附录 B:转换为纯文本
本附录对于纯文本复制粘贴操作是规范性的。
当 CSS 渲染的文档转换为纯文本格式时,预期
- text-transform 属性无效。
- 应用 § 4.1.1 第一阶段:折叠与转换,并移除块开头或强制换行符之后紧随的任何可折叠 空白序列。
附录 C:默认 UA 样式表
本附录是参考性的,旨在帮助 UA 开发人员为 HTML 实现默认样式表,但 UA 开发人员可自由忽略或适当地修改它。
附录 D:脚本与间距
本附录是规范性的。
印刷行为在语言上略有不同,但在书写系统上却有很大差异。本附录根据其对齐和间距行为对 Unicode 6.0 中的一些常见脚本进行了分类。类别描述是描述性的,而非规范性的;决定性因素是对对齐机会的优先级排序。
- 块脚本
- CJK 以及由此延伸的所有宽字符(参见 East Asian Width [UAX11])。包含以下 Unicode 脚本:注音 (Bopomofo)、汉字 (Han)、谚文 (Hangul)、平假名 (Hiragana)、片假名 (Katakana) 和彝文 (Yi)。东亚宽度属性
Wide和Fullwidth的字符也包括在内,但Ambiguous字符仅在书写系统为中文、韩文或日文时才包括在内。 - 簇状脚本
- 聚类脚本 (Clustered scripts) 具有离散单元,仅在单词边界处换行,但不使用可见的单词分隔符。它们优先考虑拉伸空格,但也乐于接受字符间距以进行对齐。聚类脚本包括但不限于以下 Unicode 脚本:高棉语 (Khmer)、老挝语 (Lao)、缅甸语 (Myanmar)、新傣仂语 (New Tai Lue)、傣勒语 (Tai Le)、傣担语 (Tai Tham)、越南傣语 (Tai Viet)、泰语 (Thai)
- 连笔脚本 (Cursive scripts)
- 连笔脚本不允许在字母之间留有间隙,无论是为了对齐还是为了 letter-spacing。包含以下 Unicode 脚本:阿拉伯语 (Arabic)、哈尼菲罗兴亚语 (Hanifi Rohingya)、曼达语 (Mandaic)、蒙古语 (Mongolian)、西非书面语 (N’Ko)、八思巴文 (Phags Pa)、叙利亚语 (Syriac)
注意:具有基线连接符的印度脚本(如天城体 Devanagari 和古吉拉特语 Gujarati)不被视为连笔脚本,并且确实允许在印刷字符单元之间存在此类间隙。参见 Indic Layout Requirements。 [ILREQ]
用户代理应在更新 Unicode 支持时更新此列表,以处理未来 Unicode 版本中尚未编码的连笔脚本,并鼓励要求 CSSWG 相应地更新此规范。
附录 E:字符与属性
本附录是规范性的。
Unicode 定义了四个在 CSS 排版中引用的代码点级属性
- 东亚宽度属性 (East Asian width property)
- 定义于 Unicode Standard Annex #11 [UAX11] 中,并作为 Unicode 字符数据库 [UAX44] 中的
East_Asian_Width属性给出。 - 通用类别
- 定义于 Unicode Standard Annex #44 [UAX44] 中,并作为 Unicode 字符数据库 [UAX44] 中的
General_Category属性给出。 - 脚本属性
- 定义于 Unicode Standard Annex #24 [UAX24] 中,并作为 Unicode 字符数据库 [UAX44] 中的
Script属性给出。(UA 必须在此映射中包含任何 ScriptExtensions.txt 分配。) - 垂直方向 (Vertical Orientation)
- 定义于 Unicode Standard Annex #50 [UAX50] 中,作为 Unicode 字符数据库 [UAX44] 中的 Vertical_Orientation 属性。
Unicode 定义了单个代码点的属性,但有时有必要确定印刷字符单元的属性。就 CSS 文本而言,印刷字符单元的属性由其第一个字形簇 (grapheme cluster) 的基字符给出——两种情况除外
- 由通用脚本的封闭标记 (
Me) 形成的字形簇被视为通用脚本中的其他符号 (So)。它们被假定具有与替换字符 (U+FFFD) 相同的 Unicode 属性。 - 以空格分隔符 (
Zs) 为基准形成的字形簇被视为修饰符符号 (Sk)。它们被假定具有与基字符相同的东亚宽度属性,但从序列中的第一个组合字符获取其其他属性。
附录 F:识别内容书写系统
本附录是规范性的。
虽然大多数语言有首选的书写系统,但有些语言有多种书写系统,大多数语言也可以转写为一种或多种外来书写系统。作为一个常见的例子,大多数语言至少有一种拉丁语转写,因此可以用拉丁书写系统书写。转写文本通常采用书写系统的印刷惯例:例如,日语 “romaji” 和中文拼音使用拉丁字母和单词空格,并相应地遵循拉丁换行和对齐做法。再如,历史上的意译韩文 (ko-Hani) 不使用单词空格,因此应类似于中文而不是现代韩文进行排版。
在 HTML 或任何其他使用 BCP47 标签标识语言以声明内容语言的文档语言中,作者可以使用脚本子标签消除歧义或指示使用非典型书写系统。 [BCP47] 例如,要指示对原生不使用拉丁书写系统的语言使用拉丁书写系统,可以添加 -Latn 脚本子标签,例如日语罗马字的 ja-Latn。其他书写系统存在其他子标签,请参阅 ISO 的 书写系统名称代码 和 ISO15924 脚本标签注册表。 [ISO15924]
zh-Latn- 中文,用拉丁字母转写。
ko-Hani- 韩文,用汉字(中文意表字符)书写。
tr-Arab- 土耳其语,用阿拉伯脚本书写。
mn-Cyrl- 蒙古语,用西里尔字母书写。
mn-Mong- 蒙古语,用传统蒙古脚本书写。
然而,BCP47 脚本子标签通常不用于(实际上是不鼓励用于)与单一书写系统强烈关联的语言:相反,当没有指定其他系统时,预期该书写系统是隐含的。 [BCP47] IANA 为此在其 语言子标签注册表 中通过 Suppress-Script 字段维护了一个各种语言最常用书写系统的数据库。
注意:关于语言标签的更多建议可以在 国际化工作组 的 “HTML 和 XML 中的语言标签” 和 “选择语言标签” 中找到。
当未明确指定书写系统时,对于语言敏感的排版行为(如换行或对齐),UA 应假定为声明的内容语言的最常见书写系统。但是,如果作者明确声明了不同的书写系统,UA 不得假定该书写系统。如果 UA 没有关于特定语言和书写系统组合的特定语言知识,则必须使用已声明书写系统的排版惯例(必要时假设不同语言的惯例),而不是假设书写系统中已声明语言的惯例,因为这对于已声明的书写系统是不合适的。
语言与其最常见书写系统之间的全部对应关系超出了本文档的范围。但是,用户代理至少必须假定以下情况
- 如果内容语言为中文且书写系统未指定,或者对于任何内容语言,如果书写系统被指定为 Hant、Hans、Hani、Hanb 或 Bopo ISO 脚本代码之一,则该书写系统即为中文。
- 如果内容语言为日文且书写系统未指定,或者对于任何内容语言,如果书写系统被指定为 Jpan、Hrkt、Hira 或 Kana ISO 脚本代码之一,则该书写系统即为日文。
- 如果内容语言为韩文且书写系统未指定,或者对于任何内容语言,如果书写系统被指定为 Kore、Hang 或 Jamo ISO 脚本代码之一,则该书写系统即为韩文。
- 只有在内容语言本身未知,或者明确指示了未知的书写系统时,该书写系统才被视为未知。
附录 G:小假名映射
本附录是规范性的。
| 小假名 | 全尺寸假名 |
|---|---|
| ぁ U+3041 | あ U+3042 |
| ぃ U+3043 | い U+3044 |
| ぅ U+3045 | う U+3046 |
| ぇ U+3047 | え U+3048 |
| ぉ U+3049 | お U+304A |
| ゕ U+3095 | か U+304B |
| ゖ U+3096 | け U+3051 |
| 𛄲 U+1B132 | こ U+3053 |
| っ U+3063 | つ U+3064 |
| ゃ U+3083 | や U+3084 |
| ゅ U+3085 | ゆ U+3086 |
| ょ U+3087 | よ U+3088 |
| ゎ U+308E | わ U+308F |
| 𛅐 U+1B150 | ゐ U+3090 |
| 𛅑 U+1B151 | ゑ U+3091 |
| 𛅒 U+1B152 | を U+3092 |
| ァ U+30A1 | ア U+30A2 |
| ィ U+30A3 | イ U+30A4 |
| ゥ U+30A5 | ウ U+30A6 |
| ェ U+30A7 | エ U+30A8 |
| ォ U+30A9 | オ U+30AA |
| ヵ U+30F5 | カ U+30AB |
| ㇰ U+31F0 | ク U+30AF |
| ヶ U+30F6 | ケ U+30B1 |
| 𛅕 U+1B155 | コ U+30B3 |
| ㇱ U+31F1 | シ U+30B7 |
| ㇲ U+31F2 | ス U+30B9 |
| ッ U+30C3 | ツ U+30C4 |
| ㇳ U+31F3 | ト U+30C8 |
| ㇴ U+31F4 | ヌ U+30CC |
| ㇵ U+31F5 | ハ U+30CF |
| ㇶ U+31F6 | ヒ U+30D2 |
| ㇷ U+31F7 | フ U+30D5 |
| ㇸ U+31F8 | ヘ U+30D8 |
| ㇹ U+31F9 | ホ U+30DB |
| ㇺ U+31FA | ム U+30E0 |
| ャ U+30E3 | ヤ U+30E4 |
| ュ U+30E5 | ユ U+30E6 |
| ョ U+30E7 | ヨ U+30E8 |
| ㇻ U+31FB | ラ U+30E9 |
| ㇼ U+31FC | リ U+30EA |
| ㇽ U+31FD | ル U+30EB |
| ㇾ U+31FE | レ U+30EC |
| ㇿ U+31FF | ロ U+30ED |
| ヮ U+30EE | ワ U+30EF |
| 𛅤 U+1B164 | ヰ U+30F0 |
| 𛅥 U+1B165 | ヱ U+30F1 |
| 𛅦 U+1B166 | ヲ U+30F2 |
| 𛅧 U+1B167 | ン U+30F3 |
| ァ U+FF67 | ア U+FF71 |
| ィ U+FF68 | イ U+FF72 |
| ゥ U+FF69 | ウ U+FF73 |
| ェ U+FF6A | エ U+FF74 |
| ォ U+FF6B | オ U+FF75 |
| ッ U+FF6F | ツ U+FF82 |
| ャ U+FF6C | ヤ U+FF94 |
| ュ U+FF6D | ユ U+FF95 |
| ョ U+FF6E | ヨ U+FF96 |
隐私考虑
本规范会泄漏用户安装的断字和换行字典。
安全考虑
本规范未引入任何新的安全考量。
致谢
若无以下人士的帮助,本规范将无法完成:Addison Phillips, Aharon Lanin, Alan Stearns, Ambrose Li, Arnold Schrijver, Arye Gittelman, Ayman Aldahleh, Ben Errez, Bert Bos, Chris Lilley, Chris Pratley, Chris Thrasher, Chris Wilson, Dave Hyatt, David Baron, Emilio Cobos Álvarez, Eric LeVine, Etan Wexler, Frank Tang, Håkon Wium Lie, IM Mincheol, Ian Hickson, James Clark, Javier Fernandez, John Daggett, Jonathan Kew, Ken Lunde, Laurie Anna Edlund, Marcin Sawicki, Martin Dürst, Martin Heijdra, Masafumi Yabe, Masayasu Ishikawa, Michael Jochimsen, Michel Suignard, Mike Bemford, Myles Maxfield, Nat McCully, Paul Nelson, Rahul Sonnad, Richard Ishida, Shinyu Murakami, Stephen Deach, Steve Zilles, Takao Suzuki, Tantek Çelik, Xidorn Quan, Yaniv Feinberg。
变更 (Changes)
最近的变更
自 2023 年 9 月候选推荐标准草案 以来,已进行了以下规范性更改
-
更正了 text-align-last 的“计算值”行。(问题 7331)
-
消除围绕替换元素的软换行机会的歧义。(问题 9964)
对于由两个字符或原子内联元素之间的边界定义的软换行机会,两个字符的最接近公共祖先上的 white-space 属性控制换行;
自 2023 年 2 月候选推荐标准草案 以来,已进行了以下规范性更改。
-
将 附录 G:小假名映射 更新至 Unicode 15.0。(问题 8442)
-
除 NBSP 外的不可定制的 Unicode 换行控制符优先于我们关于原子内联元素的规则。(问题 8972)
出于 Web 兼容性考虑,在每个替换元素或其他原子内联元素前后都有一个软换行机会,即使在通常会抑制它们的字符旁边,
例如包括 U+00A0 不换行空格 (NO-BREAK SPACE)。但是,除了 U+00A0 不换行空格外,在原子内联元素与属于 Unicode GL、WJ 或 ZWJ 换行类的相邻字符之间,不得有软换行机会。 [UAX14]
自 2020 年 12 月候选推荐标准 以来,已进行了以下规范性更改。
-
允许 hanging-punctuation: first 悬挂 U+3000 表意空格,以适应纯文本缩进习惯。(问题 2462)
-
定义 distribute 计算为 inter-character,而不是仅仅表现相同;允许 distribute 作为 旧版值别名 实现,因为这对于某些引擎更容易,且对兼容性没有影响。(问题 6156,问题 7322)
-
明确语言特定的断字规则也适用于显式的断字机会。(问题 5973)
单词仅在单词内部明确暗示断字机会的字符处断字。UA 必须使用适当的语言特定断字字符,并应像在同一位置进行自动断字一样应用任何适当的拼写更改。
-
定义 match-parent 在 根元素 上计算为 start,而不是根据主要书写模式计算。(问题 6542)
-
将关于 text-transform 的创作建议作为规范性建议。(问题 8279)
注意:text-transform 属性仅影响表现层;语义上的正确大小写应在源文档中表示。建议:作者不得依赖 text-transform 进行语义目的;相反,正确的大小写和语义应在源文档文本和标记中编码。
此外,还有一些小的编辑修复。
旧版本更改
另请参见涵盖 2020 年和 2019 年候选推荐标准之前的早期工作草案的先前更改列表,以及涵盖 2013 年至 2020 年间所有评论的意见处理结果。