CSS 文本模块 第3级

W3C 候选推荐草案,

更多关于此文档的详细信息
此版本:
https://www.w3.org/TR/2024/CRD-css-text-3-20240930/
最新发布版本:
https://www.w3.org/TR/css-text-3/
编辑草案:
https://drafts.csswg.org/css-text-3/
以前的版本:
历史记录:
https://www.w3.org/standards/history/css-text-3/
实施报告:
https://test.csswg.org/harness/results/css-text-3_dev/grouped/
测试套件:
http://test.csswg.org/suites/css3-text/nightly-unstable/
https://wpt.fyi/results/css/css-text/
反馈:
CSSWG 问题仓库
编辑者:
Elika J. Etemad / fantasai (苹果)
(受邀专家)
Florian Rivoal (受邀专家)
为此规范建议编辑:
GitHub 编辑
测试覆盖率分析:
https://drafts.csswg.org/css-text-3/test-coverage

摘要

该CSS模块定义了文本操作的属性,并指定了它们的处理模型。内容包括换行、对齐、空白字符处理和文本转换。

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

本文档的状态

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

本文档由 CSS工作组 作为候选推荐草案发布,使用推荐轨道。 发布为候选推荐草案并不意味着W3C及其成员的支持。 候选推荐草案整合了工作组打算在后续候选推荐快照中包含的来自之前候选推荐的更改。

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

请通过在GitHub中提交问题(首选)提供反馈,标题中包括规范代码“css-text”,例如:“[css-text] ...评论摘要...”。 所有问题和评论都被存档。 另外,也可以将反馈发送到(存档)公共邮件列表www-style@w3.org

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

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

以下功能处于风险之中,可能在候选推荐阶段被删除:

“处于风险”是W3C流程中的术语,并不一定意味着该功能存在被删除或延迟的危险。它表示工作组认为该功能可能难以在规定时间内实现互操作性,标记为“处于风险”允许工作组在过渡到提案推荐阶段时,如有必要删除该功能,而无需先发布不包含该功能的新候选推荐。

1. 引言

本模块描述了CSS的排版控制; 即CSS中控制从源文本到格式化、换行文本的转换功能。 各种CSS属性提供了对大小写转换空白折叠文本换行换行规则连字符对齐和两端对齐间距、 以及缩进的控制。

注意:字体选择在CSS 字体模块中描述。[CSS-FONTS-3]

用于文本装饰的功能, 例如下划线着重号、 以及阴影, (以前是本模块的一部分) 现已在CSS 文本装饰模块中描述。[CSS-TEXT-DECOR-3]

双向文本垂直文本CSS 书写模式模块中描述。[CSS-WRITING-MODES-4]

关于全球不同语言和书写系统的排版要求的更多信息, 可以在国际化工作组语言启用索引中找到。[TYPOGRAPHY]

1.1. 模块交互

本模块与CSS 文本装饰模块一起, 替代并扩展了在层叠样式表第2级第16章中定义的文本级功能。 [CSS-TEXT-DECOR-3] [CSS2]

除了下面定义的术语, 本规范中使用的其他术语和概念在 层叠样式表第2级CSS 书写模式模块中定义。[CSS2][CSS-WRITING-MODES-4]

1.2. 值定义

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

除了其定义中列出的特定属性值外, 本规范中定义的所有属性 还接受CSS-wide关键字作为属性值。 为了可读性,它们未被显式重复。

1.3. 语言与排版

作者应准确地为其内容标记语言标签,以获得最佳排版效果。

许多排版效果因语言环境而异。 语言和书写系统惯例会影响 换行、连字符、对齐、字形选择 和许多其他排版效果。在CSS中,只有在内容语言已知(已声明)的情况下,才会应用特定语言的排版调整。因此, 更高质量的排版需要作者向UA传达 文档中文本的正确语言环境。

内容语言是元素根据文档语言的规则 声明的(人类)语言。 请注意,元素的内容语言可能是未知的—例如,未标记的内容, 或位于没有语言标记功能的文档语言中的内容, 被认为具有未知的内容语言

注意:作者可以使用HTML中的全局 lang属性或XML中的通用xml:lang属性声明内容语言。 请参阅HTML元素的内容语言确定规则, 以及HTML中的确定XML元素内容语言的规则[HTML] [XML10]

元素声明的内容语言 还标识了该元素中使用的该语言的特定书写形式, 称为内容书写系统。 根据文档语言确定 该信息可以是显式或隐式的。 请参阅规范的附录F:识别内容书写系统

注意:一些语言有不止一种书写系统传统; 在其他情况下,一种语言可能被音译成外来书写系统。 作者应子标记这些情况 以便UA可以适当地进行调整。

例如,韩语(ko)可以用韩文(-Hang)、 汉字(-Hani)或两者结合(-Kore)书写。 完全用汉字书写的历史文献 不使用单词空格,排版方式更像现代中文而非现代韩文。 换句话说,就排版而言,ko-Hani更像zh-Hant而非koko-Kore)。

另一个例子是,日语(ja)通常以组合(-Japn)的平假名(-Hira)、 片假名(-Kana)和汉字(-Hani)书写。 然而,也可以为特殊目的如语言学习教科书将其“罗马化”为拉丁文(-Latn), 在这种情况下,其排版方式应更像英语而非日语。

第三个例子是,当代蒙古文有两种书写体系: 西里尔字母(-Cyrl,蒙古官方使用) 和蒙古文(-Mong,在中国的内蒙古更为常见)。 这些书写体系的格式要求差异很大, 西里尔字母的行为与拉丁文和希腊文类似, 而蒙古文则源自阿拉伯和中文书写习惯。

1.4. 字符与字母

排版的基本单位是字符。 然而,由于书写系统并不总是像基础的英文字母表那样简单, 字符的实际定义取决于该术语使用的上下文。 例如,在韩文(韩国的书写系统)中, 每个音节的方块表示 (例如=Han) 可以被认为是一个字符。 然而,方块符号实际上是由多个字母组成的,每个字母代表一个音素 (例如=h, =a, =n) 这些也可以分别被视为字符

对于任何给定的编码,计算机文本编码的基本单位也称为字符, 并且根据编码的不同, 单个编码的字符可能对应于整个预组合的音节字符(例如), 或者对应于单个音素字符(例如), 或者是更小的单位,例如 一个基本的字母形式(例如) 以及任何改变它的组合符号(例如表示送气的额外笔画)。

反过来,单个编码的字符 可以在数据流中表示为一个或多个字节; 而在编程环境中,一个字节有时也被称为字符

因此,当需要技术精确度时,字符这一术语相当模糊。

对于文本布局,我们将使用排版字符单位作为文本的基本单位。 即使在文本布局的范围内, 相关的字符单位也取决于操作。 例如,换行和字母间距将区分 包含U+0E33 ำ泰文字母SARA AM的泰文字符序列; 或者在类似天城文的脚本中,连写辅音的行为 可能取决于所使用的字体。 因此,排版字符表示书写系统的一个单位—如拉丁字母(包括其变音符号), 韩文字节, 汉字, 缅甸音节集群—对于特定的排版操作 (换行、首字母效果、字距、对齐、垂直排列等)来说是不可分割的单位。

Unicode标准附件#29:文本分割 定义了一个单位,称为书写单位集群,该单位近似于排版字符[UAX29]UA必须使用 扩展书写单位集群(而不是传统书写单位集群),如UAX29中定义, 作为其排版字符单位的基础。 然而,UA应该根据排版传统 调整这些定义 因为默认规则并不总是合适或理想的—并且预计根据需要在不同的操作中进行不同的调整。

注意:这种调整的规则超出了CSS的范围。

以下是标准排版实践要求的某些排版字符单位调整的示例:

排版字母单位(或本规范中的字母) 是属于字母或数字通用类别之一的排版字符单位。 请参阅附录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-transform来表达语义; 而应在源文档文本和标记中正确编码大小写和语义。

值的含义如下:

none
无效果。
capitalize
将每个单词的首个排版字母单位(如果是小写)转换为标题大小写; 其他字符不受影响。
uppercase
将所有字母转换为大写。
lowercase
将所有字母转换为小写。
full-width
将所有排版字符单位转换为全角形式。 如果字符没有对应的全角形式, 则保持原样。 该值通常用于将拉丁字母和数字排版为像表意字符一样的形式。
full-size-kana
将所有小假名 字符转换为等效的全角假名。 该值通常用于注音标注文本, 当作者希望所有小假名显示为大假名时, 以弥补注音中小字体尺寸通常引起的可读性问题。
以下示例将日文文本中的缩写所使用的ASCII字符转换为其全角变体, 以便它们像表意文字一样排版和换行:
abbr:lang(ja) { text-transform: full-width; }

注意: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; /* 大文本取消设置 */ }

请注意,虽然这使得这些字母在小字号下更容易看清, 但这种转换会扭曲文本: 读者需要在适当的位置 mentally 替换小假名——这与阅读拉丁铭文时 所有“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中的特定语言规则。

例如,在土耳其语中,有两个“i”, 一个带点——“İ”和“i”——另一个不带点——“I”和“ı”。 因此,通常在“I”和“i”之间的大小写映射 被替换为一组不同的映射, 映射到它们各自的不带点/带点对应项, 这在英语中是不存在的。 此映射仅当内容语言为土耳其语 且以其现代拉丁字母书写系统书写时(或使用土耳其语大小写规则的其他突厥语族语言)才生效; 在其他语言中, 需要“I”和“i”的通常映射。 因此,此规则在 Unicode 的 SpecialCasing.txt 文件中有条件地定义。

全角半角形式的定义 可以在Unicode 标准附件 #11:东亚字符宽度中找到。[UAX11]全角形式的映射是通过 在Unicode 标准附件 #44:Unicode 字符数据库中,取其 Decomposition_Mapping 中带有 <wide><narrow> 标签的代码点来定义的。[UAX44] 对于 <narrow> 标签, 映射是从代码点到分解形式 (减去 <narrow> 标签), 而对于 <wide> 标签, 映射是从分解形式 (减去 <wide> 标签) 回到原始代码点。

小假名全角假名的映射定义在附录 G: 小假名映射中。

2.1.2. 操作顺序

当指定多个值 因此需要应用多个转换时, 它们按以下顺序应用:

  1. capitalizeuppercase, 和lowercase
  2. full-width
  3. full-size-kana

文本转换发生在§ 4.1.1 阶段I:折叠和转换之后,但在§ 4.1.2 阶段II:修剪和定位之前。 这意味着full-width仅在保留的空白内将空格(U+0020)转换为U+3000表意空格。

注意:附录A:文本处理操作顺序中定义的那样, 转换文本会影响换行和其他格式化操作。

3. 空白和换行:white-space 属性

名称: white-space
值: normal | pre | nowrap | pre-wrap | break-spaces | pre-line
初始值: normal
适用对象: 文本
是否继承:
百分比: 不适用
计算值: 指定的关键字
规范顺序: 不适用
动画类型: 离散

该属性指定了两件事:

值的含义如下, 其解释必须根据 空白处理换行规则进行:

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-STARTRECORD-END标记。

对于CSS处理, 每个由文档语言定义的“段落中断”或“换行符 序列”——如果未定义,则每个换行符(U+000A)——在文本中被视为段落中断, 然后根据white-space 属性的规定进行解释并呈现。

对于HTML,换行符规范化为换行字符(U+000A) 以便在DOM中表示, 因此,当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]) 然而,当使用转义序列(&#x0d;)进行编码时,该字符被保留——并且上述规则可观察到。

4.1. 空白处理规则

除非另有规定, CSS中的空白处理仅影响 文档空白字符空格(U+0020)、制表符(U+0009)以及段落中断

注意: 被视为文档空白(文档内容的一部分) 和被视为语法空白 (CSS语法的一部分)的字符集 不一定完全相同。 然而,由于两者都包括空格(U+0020)、制表符(U+0009)和换行符(U+000A), 大多数作者不会注意到任何差异。

除了空格(U+0020) 和不换行空格(U+00A0), Unicode定义了许多其他空白分隔符字符。[UNICODE] 在本规范中, 除了空格(U+0020) 和不换行空格(U+00A0)之外, Unicode 通用类别 Zs中的所有字符 统称为其他空白分隔符

4.1.1. 第一阶段:折叠与转换

对于内联格式化上下文中的每个内联元素 (包括匿名内联元素; 参见 CSS 2.1 § 9.2.2.1 匿名内联盒 [CSS2]), 在换行双向文本重排序之前,空白字符按如下方式处理, 忽略双向格式化字符(具有 Bidi_Control 属性的字符 [UAX9]), 就好像它们不存在一样:

下面的例子展示了空白折叠和双向性的交互。 请看以下标记片段,特别注意空格(背景和边框不同以便于强调和识别):
<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属性进行布局。 当每一行布局时,

  1. 移除一行开头的一系列可折叠空格
  2. 如果制表符大小为零,保留制表符不会被渲染。 否则,每个保留制表符将被渲染为一个水平位移, 使下一个字符的起始边与下一个制表符停止位置对齐。 如果这个距离小于0.5ch, 则使用下一个制表符停止位置制表符停止位置 出现在距离起始内容边缘的多个制表符大小的点 处,该点来自最近的块容器祖先。 制表符大小tab-size 属性决定。

    注意: 请参阅Unicode 关于制表符(U+0009)与双向性交互的规则[UAX9]

  3. 移除一行末尾的一系列可折叠空格, 以及任何后置的U+1680   OGHAM空格标记, 其white-space属性为normalnowrappre-line

    注意: 根据Unicode双向算法规则L1, 在双向重排之前位于行尾的一系列可折叠空格, 在重排后仍将位于行尾。[UAX9][CSS-WRITING-MODES-4]

  4. 如果在行末(经过双向重排之后[CSS-WRITING-MODES-4])仍然存在一系列空白字符其他空白分隔符和/或保留制表符
    • 如果white-space设置为normalnowrappre-line, UA必须无条件悬挂这一系列字符。
    • 如果white-space设置为pre-wrap, UA必须无条件悬挂这一系列字符, 除非该序列后面跟有强制换行, 在这种情况下,必须有条件地悬挂该序列。 UA还可以选择性地视觉折叠任何会导致溢出的字符进度宽度。

      注意: 悬挂空白字符而不是折叠它们 允许用户在选择或编辑文本时看到这些空格。

    • 如果white-space设置为break-spaces空格制表符其他空白分隔符与其他可见字符相同处理: 它们不能悬挂,也不能折叠它们的进度宽度。

      注意: 因此这些字符将占据空间, 并根据可用空间和适用的换行控制规则,要么溢出,要么导致换行。

此示例展示了在强制换行的情况下,条件性悬挂行尾空白字符可以使行首和行尾保持对称。 添加下划线以帮助可视化空格。
p {  
  white-space: pre-wrap;  
  width: 5ch;  
  border: solid 1px;  
  font-family: monospace;  
  text-align: center;  
}
<p> 0 </p>

上述示例的渲染结果如下:

0

由于最后的空格位于强制换行之前且没有溢出,因此它不会悬挂,且居中效果如预期。

此示例展示了行末无强制换行时悬挂 空格 和有强制换行时条件性悬挂空格之间的区别。 添加下划线以帮助可视化空格。
p {  
  white-space: pre-wrap;  
  width: 3ch;  
  border: solid 1px;  
  font-family: monospace;  
}
<p> 0 0 0 0 </p>

上述示例的渲染结果如下:

0
0 0
0

如果添加了p { text-align: right; },结果如下:

0
0 0
0

由于行尾无强制换行的保留空格必须悬挂, 因此在进行文本对齐时,这些空格不会被考虑。 当向末尾对齐时,意味着这些空格会溢出,并且不会阻止行中剩余内容与行边缘对齐。 另一方面,行尾有强制换行的保留空格会条件性悬挂。 在此示例中,由于最后一行的空格没有溢出,因此它不会悬挂,因此在进行文本对齐时会被考虑。

在以下示例中,每行都没有足够的空间容纳行尾空格,因此它们在所有行上悬挂: 无强制换行的行由于必须悬挂,而有强制换行的行则因为条件性悬挂而溢出。 添加下划线以帮助可视化空格。
p {  
  white-space: pre-wrap;  
  width: 3ch;
  border: solid 1px;  
  font-family: monospace;  
}
<p>0 0 0 0 </p>
0 0
0 0

最后一行在最后一个0之前没有换行,因为条件性悬挂的字符在测量行内容是否合适时不会被考虑。

4.1.3. 段落中断转换规则

white-space 设置为 pre, pre-wrap, break-spaces, 或者 pre-line段落中断不会被视为 可折叠的,而是被转换为保留的换行符 (U+000A)。

对于其他 white-space 值,段落中断可折叠的,并按照以下规则折叠:

  1. 首先,任何紧接在另一个可折叠 段落中断之后的可折叠 段落中断都会被移除。
  2. 然后,剩余的 段落中断要么被转换为空格 (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字符大小: tab-size属性

名称: tab-size
值: <数字 [0,∞]> | <长度 [0,∞]>
初始值: 8
适用于: 文本
是否继承:
百分比: 不适用
计算值: 指定的数值或绝对长度
标准顺序: 不适用
动画类型: 按计算值类型

该属性决定渲染保留的Tab字符 (U+0009) 的tab大小<number>表示以最近的块容器祖先的空格字符 (U+0020) 的前进宽度的倍数为单位, 包括其关联的字母间距单词间距。 不允许负值。

5. 换行和单词边界

当行内级内容被布局到行中时,它会被分割成多个行框。这种断行称为换行。 当由于明确的换行控制(例如保留的换行符)或块的开始或结束导致换行时,它被称为强制换行。 当由于内容的换行(即UA在不强制换行的情况下为了使内容适应行的宽度而创建换行时)换行时, 这种换行称为软换行。 将行内级内容分割成行的过程称为换行处理

换行仅在允许的断点处进行,称为软换行机会。 当启用换行时(参见white-space),UA必须通过在软换行机会处换行(如果存在)来最小化行溢出的内容。

在大多数书写系统中,在没有连字符断字的情况下,软换行机会仅出现在单词边界处。许多此类系统使用空格或标点符号显式分隔单词, 软换行机会可以通过这些字符识别。 然而,诸如泰语、老挝语和高棉语等脚本并不使用空格或标点符号来分隔单词。虽然零宽空格(U+200B)可用作这些脚本中的显式单词分隔符,但这种做法并不常见。 因此,正确识别此类文本中的软换行机会需要词汇资源。

在其他一些书写系统中,软换行机会基于正字法音节边界,而不是单词边界。 一些此类系统,如爪哇文和巴厘文,类似于泰语和老挝语,需要分析文本以找到断行机会。 而在其他如中文(以及日文、彝文,有时也包括韩文)中,每个音节往往对应一个排版字母单元,因此换行习惯允许行在任意位置断行,除了某些字符组合之间。 此外,这些限制的严格程度随着排版风格而有所不同。

虽然CSS并未完全定义软换行机会的出现位置,但提供了一些控制以区分常见的变化:

注: Unicode标准附录#14:Unicode换行算法为所有Unicode脚本定义了换行的基准行为,预计会进一步调整。 [UAX14] 更多关于换行习惯的信息可以在日本文本布局需求 [JLREQ]日本文档排版规则[JIS4051]中找到关于日文的资料,关于中文则可以参考 中文文本布局需求 [CLREQ]标点符号用法总则 [ZHMARK]。另请参见国际化工作组语言支持索引,其中包含有关其他语言的更多信息。[TYPOGRAPHY]任何关于其他适当参考资料的建议将不胜感激。

5.1. 换行细节

在确定换行时:

5.2. 字母断行规则:word-break 属性

名称: word-break
值: normal | keep-all | break-all | break-word
初始值: normal
应用于: 文本
是否继承:
百分比: 不适用
计算值: 指定的关键词
规范顺序: 不适用
动画类型: 离散

此属性指定字母之间的软换行机会, 即允许断行的位置。 它具体控制在相邻的排版字母单元之间是否通常存在软换行机会, 并将属于NUALAIID的非字母排版字符单元视为此目的下的排版字母单元。[UAX14] 它不影响由 空白字符(以及 其他空白分隔符) 和标点符号周围的软换行机会。 (参见line-break控制标点符号和小假名的换行方式。)

例如, 在某些CJK排版风格中,允许英语单词在任意两个字母之间断行, 而不仅仅是在空格或连字符处; 这可以通过word-break: break-all启用。
在日语文本中嵌入的英语单词。单词‘caption’在两行中被断为‘capt’和‘ion’。
嵌入日语文本中的英语单词 在单词中任意点断行的示例。

另一个例子是,韩语有两种换行风格: 在任意两个韩文字节之间换行(word-break: normal), 或像英语一样,主要在空格处断行(word-break: keep-all)。

각 줄의 마지막에 한글이 올 때 줄 나눔 기
준을 “글자” 또는 “어절” 단위로 한다.
각 줄의 마지막에 한글이 올 때 줄 나눔
기준을 “글자” 또는 “어절” 단위로 한다.

类似地,埃塞俄比亚语也有两种换行风格, 或者仅在单词分隔符处断行(word-break: normal), 或允许在单词内部的字母之间断行(word-break: break-all)。

ተወልዱ፡ኵሉ፡ሰብእ፡ግዑዛን፡ወዕሩያን፡
በማዕረግ፡ወብሕግ።ቦሙ፡ኅሊና፡ወዐቅል፡
ወይትጌበሩ፡አሐዱ፡ምስለ፡አሀዱ፡
በመንፈሰ፡እኍና።
ተወልዱ፡ኵሉ፡ሰብእ፡ግዑዛን፡ወዕሩያን፡በማ
ዕረግ፡ወብሕግ።ቦሙ፡ኅሊና፡ወዐቅል፡ወይትጌ
በሩ፡አሐዱ፡ምስለ፡አሀዱ፡በመንፈሰ፡እኍና።

注: 仅在发生溢出时启用额外的断行机会, 参见overflow-wrap

这些值的含义如下:

normal
单词根据其惯用规则断行, 如上文所述。 韩语通常表现为两种不同的行为, 允许在任何两个连续的韩文字节之间断行。 对于埃塞俄比亚语,它也表现为两种不同的行为, 单词内部不允许这种断行。
break-all
允许在“单词”内断行: 具体来说, 除了正常的软换行机会之外, 任何排版字母单元(以及解析为NU(数字)、AL(字母)或SA(东南亚)换行类别的任何排版字符单元) 都被视为ID(表意字符),用于断行目的。 不适用连字符。

注: 此值不会影响标点符号周围的软换行机会。 要允许随处断行,参见line-break: anywhere

注: 此选项启用埃塞俄比亚语的另一种常见行为。 它通常在文本主要由CJK字符组成并且只有简短的非CJK摘录时使用, 以便文本更好地分布在每一行上。

keep-all
禁止在“单词”内断行: 在排版字母单元之间的隐式软换行机会被抑制, 即禁止在成对的此类字符之间断行, 除非通过基于字典的断行找到机会。 否则,该选项等同于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·و·کمی·خط·عربی·และ·ตัวอย่าง·การเขียน·ภาษาไทย·በጽሑፍ፡·ማራዘሙን፡·አንዳንድ፡

日语通常排版时允许在单词内部换行。 但有时更倾向于抑制这些换行机会,仅允许在某些句子片段的末尾换行。 这通常在非常短的文本中进行, 例如标题和表格或图表标题。

这可以通过标记允许的换行点 使用wbr 或U+200B零宽空格, 并使用word-break: keep-all来抑制其他换行点。

例如,以下标记可以生成下列两种渲染之一, 具体取决于word-break属性的值:

<h1>窓ぎわの<wbr>トットちゃん</h1>
h1 { word-break: normal } h1 { word-break: keep-all }
预期渲染
窓ぎわのトットちゃ
ん
窓ぎわの
トットちゃん
浏览器中的结果 窓ぎわのトットちゃん 窓ぎわのトットちゃん

当允许诸如阿拉伯语等形状化脚本在单词内部断行时, 字符仍然必须按未断开的方式进行形状化 (参见§ 5.6 跨单词内部断行的形状化)。

为了与旧内容兼容, word-break 属性还支持一个已弃用的 break-word 关键字。 指定后,其效果与 word-break: normaloverflow-wrap: anywhere 相同, 而不管 overflow-wrap 属性的实际值如何。

5.3. 换行严格度:line-break 属性

名称: line-break
值: auto | loose | normal | strict | anywhere
初始值: auto
应用于: 文本
是否继承:
百分比: 不适用
计算值: 指定的关键字
规范顺序: 不适用
动画类型: 离散

该属性指定元素内应用的换行规则严格度: 特别是换行与标点符号及符号的交互。 各值的含义如下:

auto
用户代理确定使用的换行规则集,并可以根据行的长度来调整换行限制;例如,在短行上使用较少限制的换行规则。
loose
使用最少限制的换行规则来换行。通常用于短行,如报纸中的文章。
normal
使用最常见的换行规则进行文本换行。
strict
使用最严格的换行规则进行文本换行。
anywhere
每个软换行机会都在每个印刷字符单元周围存在, 包括标点符号和保留空白字符, 或在单词中间, 不顾及任何禁止换行的规定, 即使是由具有GLWJZWJ换行类别的字符引入的禁止换行, 或由word-break属性强制的换行。[UAX14] 不优先考虑不同的换行机会。 不应用连字符。

注意: 该值触发的换行规则通常见于终端窗口。

注意:anywhere仅允许行尾的保留空白字符 换行至下一行 当white-space被设置为break-spaces时, 因为在其他情况下:

当对保留空白字符有效时, 使用white-space: break-spaces, 它允许在序列的第一个空格之前换行, 而break-spaces本身不允许此操作。

CSS 在文本换行规则中区分了四个严格级别。 loosenormalstrict 各自生效的精确规则集取决于用户代理 (UA) 并且应遵循语言约定。 但是,对于这三个关键字,本规范确实要求:

注意: 上述要求 仅在CJK文本中创建了区分。 在仅匹配上述规则且没有额外规则的实现中, line-break只会影响CJK代码点 除非书写系统被标记为中文日文。 未来版本可能会为其他书写系统和语言 增加其他具体规则 以满足其需求。

由于UA可以在 strictnormalloose 模式之间增加额外的区分, 这些值在其他书写系统中也可以表现出差异。 例如,拥有足够高级的泰语语言处理能力的UA 可以选择将不同的严格度映射到泰语换行, 例如在strict模式中禁止复合词内换行 (例如将ตัวอย่างการเขียนภาษาไทย 换行为ตัวอย่าง·การเขียน·ภาษาไทย) 而在loose模式中允许更多换行 (ตัวอย่าง·การ·เขียน·ภาษา·ไทย)。

注意: CSS工作组认识到在规范的未来版本中 可能需要更精细的换行控制 以满足高端出版需求。

5.4. 连字符: hyphens 属性

连字符是对单词进行受控拆分, 通常在不允许断开的地方进行拆分, 以改善段落的布局, 通常在音节或语素边界处拆分单词, 并且通常在视觉上指示拆分 (通常通过插入连字符 U+2010)。 在某些情况下,连字符也可能改变单词的拼写。 无论如何,连字符仅是一种渲染效果: 它不得影响基础文档内容 或文本选择或搜索。

不同语言的连字符用法各不相同, 可能不仅包括在换行符前插入连字符, 还可能在换行符后插入连字符(或两者兼有), 插入不同于 U+2010 的字符, 或更改单词的拼写。
语言 未断开 之前 之后
英语 Unbroken Un‐ broken
荷兰语 cafeetje café‐ tje
匈牙利语 Összeg Ösz‐ szeg
普通话 tú’àn tú‐ àn
àizēng‐fēnmíng àizēng‐ ‐fēnmíng
维吾尔语 [单独的 DAL + 单独的 ALEF + 词首的 MEEM +
                                      词中的 YEH + 词尾的 DAL +
                                      单独的 ALEF MAKSURA] [单独的 DAL + 单独的 ALEF + 词首的 MEEM +
                                      词尾的 YEH + 连字符] [单独的 DAL + 单独的 ALEF MAKSURA]
克里语 [ᑲᓯᑕᓂᐘᓂᓂᐠ]
                                      (加拿大土著音节 KA +
                                      加拿大土著音节 SI +
                                      加拿大土著音节 TA +
                                      加拿大土著音节 NI +
                                      加拿大土著音节 WEST-CREE WA +
                                      加拿大土著音节 NI +
                                      加拿大土著音节 NI +
                                      加拿大土著音节 FINAL GRAVE) [ᑲᓯᑕᓂ᐀]
                                      (加拿大土著音节 KA +
                                      加拿大土著音节 SI +
                                      加拿大土著音节 TA +
                                      加拿大土著音节 NI +
                                      加拿大土著音节 HYPHEN) [ᐘᓂᓂᐠ]
                                      (加拿大土著音节 WEST-CREE WA +
                                      加拿大土著音节 NI +
                                      加拿大土著音节 NI +
                                      加拿大土著音节 FINAL GRAVE)

当行在有效的连字符机会处断开时,就会发生连字符, 这是一种软换行机会,存在于允许连字符的单词内。 在 CSS 中,连字符机会hyphens 属性控制。 CSS 文本级别 3 没有定义连字符的确切规则; 但是强烈建议用户代理 (UA) 优化其断点选择 并选择适合语言的连字符点。

注意:由 U+002D - HYPHEN-MINUS 字符 或 U+2010 ‐ HYPHEN 字符引入的软换行机会 不是连字符机会, 因为换行时不会创建拆分的视觉指示: 无论行是否在该点换行,这些字符都是可见的。

在计算最小内容固有尺寸时,考虑连字符机会。

注意:这允许表格对其内容进行连字符处理, 而不是溢出其包含块, 这在像德语这样的长单词语言中尤其重要。

名称: hyphens
值: none | manual | auto
初始值: manual
适用于: 文本
继承:
百分比: 不适用
计算值: 指定关键字
规范顺序: 不适用
动画类型: 离散

此属性控制是否允许连字符在文本行内创建更多软换行机会。 值具有以下含义:

none
不使用连字符连接单词, 即使单词内的字符 明确定义了连字符机会

注意:这不会抑制由始终可见的字符(例如 U+002D - HYPHEN-MINUS 或 U+2010 ‐ HYPHEN)引入的现有软换行机会

manual
仅在单词内有字符明确建议连字符机会的地方才使用连字符连接单词。 用户代理 (UA) 必须使用适合语言的连字符字符, 并且应应用任何适当的拼写更改, 就像在同一点进行自动连字符一样。
在 Unicode 中,U+00AD 是一个有条件的“软连字符”, 而 U+2010 是一个无条件的连字符。Unicode 标准附件 #14 描述了软连字符在 Unicode 换行中的作用。[UAX14] 在 HTML 中, &shy; 表示软连字符, 它建议一个连字符机会。
ex&shy;ample
auto
除了由条件连字符明确指示的连字符机会之外,还可以通过适合语言的连字符资源自动确定单词的断开位置。 如果单词包含条件连字符 (&shy; 或 U+00AD SOFT HYPHEN), 则必须忽略单词内其他地方的自动连字符机会, 而优先使用条件连字符。 但是,如果即使在这些机会处断开后, 该单词的某一部分仍然太长而无法容纳在一行中, 则可以使用自动连字符机会。

正确的自动连字符需要适合被断开文本语言的连字符资源。 因此,用户代理 (UA) 必须仅对已知内容语言 并且具有适当连字符资源的文本自动进行连字符处理。

作者应正确标记其内容的语言(例如,使用 HTML lang 属性 或 XML xml:lang 属性), 以获得正确的自动连字符。

用户代理 (UA) 可以使用针对特定语言的启发式方法 将某些单词排除在自动连字符之外。 例如,UA 可能会通过排除匹配某些大写和标点符号模式的单词 来避免在专有名词中使用连字符。 本规范未定义此类启发式方法。 (请注意,此类启发式方法需要因语言而异: 例如,英语和德语的大写约定就大不相同。)

对于 hyphens 属性而言, 构成“单词”的内容取决于用户代理 (UA)。 但是,在确定单词边界时, 必须忽略内联元素边界和流外元素。

在由条件连字符字符 (例如 U+00AD SOFT HYPHEN)创建的连字符机会处,由于连字符而显示的任何字形 都由该字符表示, 并根据应用于它的属性进行样式设置。

当允许阿拉伯文等成形文字由于连字符而在单词内断开时, 字符仍必须像单词未断开一样进行成形(参见§ 5.6 跨词内断点的成形)。

例如,如果 维吾尔语单词 “داميدى” 被连字符断字,则它将显示为 [isolated DAL + isolated ALEF + initial MEEM +
      medial YEH + hyphen + line-break + final DAL +
      isolated ALEF MAKSURA],而不是 [isolated DAL + isolated ALEF + initial MEEM +
      final YEH + hyphen + line-break + isolated DAL +
      isolated ALEF MAKSURA]

5.5. 溢出换行: overflow-wrap/word-wrap 属性

名称: overflow-wrap, word-wrap
值: normal | break-word | anywhere
初始值: normal
应用于: 文本
继承属性:
百分比: 不适用
计算值: 指定的关键字
规范顺序: 不适用
动画类型: 离散的

此属性指定 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. 跨词断字的字形处理

当像阿拉伯语这样的书写系统在单词内的非强制 软换行机会处(如由于word-break: break-allline-break: anywhereoverflow-wrap: break-wordoverflow-wrap: anywhere连字符断字)断开时,字符必须保持其形状选择(连接形式)如同单词仍保持完整一样。

例如, 如果单词“نوشتن”在“ش”和“ت”之间断开, “ش”仍然采用其词首形式(“ﺷ”), 而“ت”采用其词中形式(“ﺘ”)——形成如“ﻧﻮﺷ | ﺘﻦ”所示,而不是如“نوش | تن”所示。

6. 对齐和分散

对齐和分散控制行内内容在行框中的分布。

6.1. 文本对齐: text-align 速记属性

名称: text-align
值: start | end | left | right | center | justify | match-parent | justify-all
初始值: start
应用于: 块级容器
继承属性:
百分比: 见各个属性
计算值: 见各个属性
动画类型: 离散的
规范顺序: 不适用

这个 速记属性 设置了 text-align-alltext-align-last 属性,描述了如果内容未完全填充行框时,块的行内级内容如何沿行轴对齐。除了 justify-allmatch-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 另有规定,否则强制换行或块末尾之前的最后一行与 start 对齐。
justify-all
text-align-alltext-align-last 都设置为 justify,强制最后一行也对齐。
match-parent
该值的行为与 inherit 相同(计算为其父级的计算值),但如果继承值为 startend,则根据父级的 方向 值进行解释,并得出 leftright 的计算值。指定在 start 时应用于 根元素

当在 text-align 速记属性上指定时,同时设置 text-align-alltext-align-lastmatch-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 计算如上所述
规范顺序: 不适用
动画类型: 离散的

这个 text-align 速记属性 的长写形式指定了块容器内所有行内内容的行内对齐方式, 除了被非 auto 值的 text-align-last 覆盖的最后一行。 详细描述见 text-align

作者应使用 text-align 速记属性而非此属性。

6.3. 最后一行对齐: text-align-last 属性

名称: text-align-last
值: auto | start | end | left | right | center | justify | match-parent
初始值: auto
应用于: 块级容器
继承属性:
百分比: 不适用
计算值: 指定关键字,但 match-parent 除外,其计算方式如上所述
规范顺序: 不适用
动画类型: 离散的

此属性描述块或紧接在 强制换行 前的行的最后一行如何对齐。

如果指定了 auto,受影响行的内容将根据 text-align-all 对齐,除非 text-align-all 设置为 justify,在这种情况下,行将按 start 对齐。所有其他值的解释与 text-align 相同。

6.4. 对齐方式: text-justify 属性

名称: text-justify
值: auto | none | inter-word | inter-character
初始值: auto
应用于: 文本
是否继承:
百分比: 不适用
计算值: 指定的关键词 (除了 distribute 这个遗留值)
规范顺序: 不适用
动画类型: 离散

此属性选择在行对齐方式设置为 两端对齐 时使用的对齐方法 (参见 text-align)。 该属性适用于文本,但会从块级容器继承到包含其内联级内容的根内联框。 它接受以下值:

auto
UA 确定要遵循的对齐算法,基于性能与合理的展示质量之间的平衡。 由于对齐规则因 书写系统语言 而异, UA 应在可能的情况下使用适合文本的对齐算法。
例如, 用户代理 (UA) 默认情况下可以使用一种适用于所有书写系统的简单通用对齐方法——例如主要扩展单词分隔符和中日韩表意文字单位之间的间距,其次扩展东南亚表意文字单位之间的间距。 然后,在段落的内容语言已知的情况下, 它可以选择更适合该语言的对齐行为, 例如,对于日语,遵循《日语文本布局要求》 [JLREQ], 对于阿拉伯语,使用草书伸长, 对于德语,使用 inter-word, 等等。

两行阿拉伯书法由于压缩和长尾形态的混合而齐头。

一个阿拉伯文书法对齐的示例,由 Tasmeem 渲染。 和英语一样,阿拉伯语可以通过调整词间距来对齐, 但在大多数风格中,它也可以通过书法式的拉伸或压缩字母形式来实现对齐。 在这个例子中,上面的文本通过使用拉长的(kashida)形式和长尾形态来填充整行, 而下面的行稍微压缩了,通过使用 ت 和 م 之间字符的堆叠组合。 通过采用传统的书法技巧,排版员可以在保持流动性和色彩的同时对齐文本, 提供了非常高质量的对齐效果。然而, 这是一个非常特定于某种文字的效果。
额外的空格部分用于空格,部分用于CJK和泰文字母之间。
混合脚本文本与 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. 扩展和压缩文本

在对齐文本时, 用户代理将行内容的两端与其行框边缘之间的剩余空间, 分布在其内容中,使内容完全填满行框。 用户代理也可以分配负空间, 使更多内容放入行中, 比正常间距条件下可以容纳的内容更多。

对齐机会 是对齐算法可以改变文本间距的点。 一个对齐机会可以由单个 排版字符单位 提供(例如词间隔符), 也可以由两个 排版字符单位 的并置提供。 与 软换行机会 控制类似, 一个 排版字符单位 是否提供 对齐机会 受其父级的text-justify 值控制; 同样, 两个连续的 对齐机会 之间的 排版字符单位 是否存在 由其最近的共同祖先的 text-justify 值决定。

通过对齐分布的空间是 除了letter-spacingword-spacing 属性定义的间距之外的附加空间。 当这种附加空间分布到 词间隔符 对齐机会 时, 它适用与 word-spacing 相同的规则。 类似地,当空间分布到两个 排版字符单位 之间的 对齐机会 时, 应按照 letter-spacing 的相同规则应用。

对齐算法可以将 对齐机会 分为不同的优先级别。 给定级别内的所有 对齐机会 以相同的优先级进行扩展或压缩, 无论哪个 排版字符单位 创造了这个机会。 例如, 如果两个汉字之间的 对齐机会 和两个拉丁字母之间的对齐机会被定义为相同级别 (如在 inter-character 对齐样式中), 它们不会因为源自不同的 排版字符单位 而被区别对待。 在本级别中未定义其他因素(如字体大小、字母间距、字形形状、行内位置等)是否或如何影响 在行内分配给 对齐机会 的空间分布。

UA 可以启用或断开可选连字, 或使用其他字体特性, 如备用字形或字形压缩, 来帮助通过任何方法对齐文本。 此行为不受本级别的CSS控制。 然而, UA 不得 断开必需的连字 或以其他方式禁用正确形成功能复杂脚本所需的特性。

如果行内存在 对齐机会, 并且 文本对齐 为该行指定了完全对齐 (justify), 则必须对齐该行。

6.4.2. 处理符号和标点

在确定 对齐机会 时, 来自 Unicode 符号 (S*) 和标点 (P*) 类的 排版字符单位 通常被视为相同书写系统的 排版字母单位, 或者,如果字符的脚本属性为“通用” (Common), 则视为该段落中占主导地位的书写系统的 排版字母单位

然而,根据排版传统, 可能会有额外的规则来控制符号和标点的对齐。 因此,UA 可能会重新分配特定字符 或引入额外的优先级别, 以处理涉及符号和标点的 对齐机会

例如,传统上连续的 U+2014 — EM DASH、 U+2015 ― HORIZONTAL BAR、 U+2026 … HORIZONTAL ELLIPSIS、 或 U+2025 ‥ TWO DOT LEADER 字符之间通常没有 对齐机会 [JLREQ]; 因此,UA 可能会将这些字符分配到“永不”优先级别。 另一个例子是某些全角标点符号 (如 U+301A 〚 LEFT WHITE SQUARE BRACKET), 在日语中被认为包含一个 对齐机会。 因此,UA 可能会将这些字符分配到比表意字符之间的机会更高的优先级别。

6.4.3. 不可扩展文本

如果一行的内联内容无法拉伸到行框的全宽, 那么它们必须按照 text-align-last 属性指定的方式对齐。 (如果 text-align-lastjustify, 那么它们必须像 center 那样对齐。)

6.4.4. 连笔书写系统

对齐不得在如阿拉伯语等 连笔书写系统排版字母单位 之间引入空隙。 如果可能, UA 可以将分配到这些 排版字母单位 之间的 对齐机会 转换为某种形式的连笔延长。 否则,必须假设在 连笔书写系统中的任何 排版字母单位之间不存在 对齐机会 (无论它们是否连接)。

以下是不合格的对齐示例:
在每对阿拉伯字母之间增加空隙
在每对未连接的阿拉伯字母之间增加空隙

某些字体设计允许使用 tatweel 字符进行对齐。 执行基于 tatweel 对齐的 UA 必须正确处理其使用规则。 请注意,正确插入 tatweel 字符取决于上下文, 包括相关的字母组合、单词中的位置和单词在行中的位置。

6.4.5. auto 对齐的最低要求

对于 auto 对齐, 本规范未定义所有的 对齐机会, 它们的优先级如何, 或多个 对齐机会 级别何时以及如何交互。 然而,规范要求:

有关文本对齐的更多信息可以在(或提交给)“全面对齐的方法”中找到, 按书写系统和语言编制索引, 由 W3C 国际化工作组 维护。 [JUSTIFY]

7. 间距

CSS 提供了通过 word-spacingletter-spacing 属性控制文本间距的能力, 它们分别指定了围绕 词间隔符排版字符单位 之间的额外空间。

7.1. 词间距: word-spacing 属性

名称: word-spacing
值: normal | <长度>
初始值: normal
应用于: 文本
是否继承:
百分比: 不适用
计算值: 绝对长度
规范顺序: 不适用
动画类型: 按计算值类型

此属性指定了“单词”之间的额外间距。 值按以下定义解释:

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 零宽空格), 则用户代理不得在单词之间创建额外间距。

7.2. 字距调整: letter-spacing 属性

名称: letter-spacing
值: normal | <长度>
初始值: normal
应用于: 内联框 和文本
是否继承:
百分比: 不适用
计算值: 绝对长度
规范顺序: 不适用
动画类型: 按计算值类型

该属性指定了相邻 排版字符单位 之间的额外间距 (通常称为 tracking)。 字距调整在双向重排序之后应用,并且是字距调整word-spacing 之外的额外间距。[CSS-WRITING-MODES-4] [CSS-FONTS-3] 根据生效的对齐规则,用户代理可能会进一步增加或减少 排版字符单位之间的空间,以对齐文本

值具有以下含义:

normal
不应用额外间距。计算为零。
<长度>
指定 额外的 排版字符单位之间的间距。 值可以为负,但可能会有依赖于实现的限制。

由于 遗留原因, 计算出的letter-spacing 为零时 会返回一个 解析值getComputedStyle() 返回值) 为 normal

为了letter-spacing 的目的, 每个连续的 原子内联(如图像和内联块) 被视为一个 排版字符单位

字距调整不得应用于行的开头。 本级别未定义字距调整是否应用于行的末尾。

当字距调整未应用于行的开头或末尾时, 文本始终与块的边缘齐平。
p { letter-spacing: 1em; }
<p>abc</p>

a b c

a b c

因此,UA 确实不应在行的右侧或尾部添加字距调整:[RFC6919]

a b c 

两个排版字符单位之间的字距调整实际上“属于” 包含这两个 排版字符单位 的最内层元素: 两个相邻的 排版字符单位 之间的总字距调整(双向重排序后) 由包含两者之间边界的最内层元素指定并渲染。 然而,UA 可以将字距调整附加到元素边界上的其中一个或另一个 排版字符单位,并使用其包含元素的字距调整值。

注意: 由于 Web 兼容性问题,本级别允许此二级行为。

预期内联框仅包含该元素内完全包含的字符之间的字距调整, 从而排除元素右侧或尾部的字距调整:
p { letter-spacing: 1em; }
<p>a<span>bb</span>c</p>

a b b c

a b b c

因此,指定的 letter-spacing 预期仅影响该元素中完全包含的字符之间的间距:

p    { letter-spacing: 1em; }
span { letter-spacing: 2em; }
<p>a<span>bb</span>c</p>

a b  b c

这进一步意味着,将letter-spacing 应用于仅包含单个字符的元素 对渲染结果没有影响:

p    { letter-spacing: 1em; }
<p>a<span>b</span>c</p>

a b c

由于字距调整是在 RTL 重排序之后 插入的, 因此应用于下面内联 span 的字距调整也没有效果, 因为重排序后,“c”不会与“א”相邻:

p    { letter-spacing: 1em; }
<!-- abc 后跟希伯来字母 alef (א)、bet (ב) 和 gimel (ג) --> <!-- 重排序将这些字母按逆序显示。 --> 
<p>ab<span></span>בג</p>

a b c א ב ג

字距调整忽略不可见的零宽度格式字符 (如 Unicode Cf 类中的字符)。 必须像这些字符不存在一样添加间距。

例如,letter-spacing 应用于 A&#x200B;BAB 是相同的, 无论元素边界在哪里。

当两个字符之间的有效间距不为零时 (由于 对齐letter-spacing 的非零值), 用户代理不应应用可选连字, 即那些未定义为字形正确整形所必需的连字。 然而,通过低级 font-feature-settings 属性指定的连字和其他字体功能 优先于此规则。 参见 CSS Fonts Module Level 3 § feature-precedence

例如,如果对单词“filial”应用了字距调整, 则不应使用“fi”连字, 因为它会阻止文本的均匀间距。
filial vs filial

注意: 在 OpenType 中,必需连字预期与 rlig 功能关联。 因此,所有其他连字都被视为可选。 然而,在某些情况下,UA 或平台启发式方法 应用额外的连字以处理损坏的字体; 本规范未定义或覆盖此类异常处理。

7.2.1. 连笔书写系统

如果可能, UA 可以通过将要分配到一组字母的总额外空间 转换为某种形式的连笔延长(或在负跟踪值的情况下压缩), 来对连笔书写系统应用字距调整, 从而使这组字母的总扩展(或压缩)达到相同的效果。 否则, 如果 UA 无法在不破坏其连笔连接的情况下扩展来自 连笔书写系统 的文本, 则不得在该书写系统的任何一对 排版字母单位之间应用间距 (在字距调整的目的上,实际上将每个单词视为一个单独的 排版字母单位)。 两种情况都将导致这些字母之间的有效间距为零; 然而,前者将保留文本拉伸的感觉。

以下是一些适当和不适当的阿拉伯文本间距示例。
原始文本
不好 均匀分布在每个字母之间的间距。注意这破坏了连笔连接!
通过排版适当的连笔延长分配 ∑letter-spacing生成的文本与前面均匀间隔的示例一样长。
禁止阿拉伯字母之间的 letter-spacing注意 letter-spacing 仍然应用于非阿拉伯字符(如 空格)。
不好 仅在未连接的字母之间应用 letter-spacing这会扭曲排版色彩并模糊单词边界。

注意: 文本的正确连笔延长或压缩可能因以下因素而异: 书写系统、字体、语言、单词中的位置、行中的位置、实现复杂性、字体功能和书法偏好, 在某些情况下可能根本无法实现。 它可能涉及使用缩短连字、长尾变体、上下文形式、延长字形(如 U+0640 ـ ARABIC TATWEEL)或其他微排版技术。 定义这些效果的规则超出了 CSS 的范围。 作者应避免对连笔书写系统应用 letter-spacing, 除非他们准备接受非互操作的结果。

7.3. 跨元素边界的整形

当以下任何条件为真时, 对于任何边界将两个 排版字符单位 分开的框, 必须在内联框边界处打断文本整形:

当格式没有有效变化时, 或者如果唯一的格式更改不影响字形 (如应用 文本装饰), 则不得跨内联框边界打断文本整形。

在其他情况下, 如果在字体技术的限制下是合理且可能的, 则不应跨内联框边界打断文本整形。

跨边界合理且可能的整形示例 是阿拉伯文本整形: 在许多系统中,这由字体引擎执行, 允许字体提供具有潜在复杂上下文整形的变体字形。 除非字体引擎具有提供上下文的 API,否则通常不可能依赖此系统跨越字体更改, 但引擎可以通过例如使用零宽连字符(U+200D)或零宽非连字符(U+200C) 来绕过此限制,从而正确选择 初始/中间/末尾/独立字形, 这是相当合理的。

跨边界可能但不合理的整形示例 是处理对左右各 20 个字符的上下文敏感的字体以选择其字形: 即使通过多个带有格式更改的内联边界传递字符串前后的所有文本, 也是复杂的。 UA可以处理此类情况, 但不是必须的, 因为它们不是任何现代书写系统所需的典型或基本需求。

跨边界不可能的整形示例 是在单词“and”的中途更改字体粗细, 在这种字体中,一个连字会将单词“and”的所有三个字母 替换为一个与符号(“&”)。

8. 边缘效果

边缘效果控制 线与块中其他线的缩进 (text-indent) 以及如何在行的起始和结束边缘测量内容 (hanging-punctuation)。

8.1. 第一行缩进: text-indent 属性

名称: text-indent
值: [ <length-percentage> ] && hanging? && each-line?
初始值: 0
应用于: 块级容器
是否继承:
百分比: 参考块容器的 内联轴 内尺寸
计算值: 计算出的 <length-percentage> 值,加上任何指定的关键字
规范顺序: 按语法
动画类型: 按计算值类型

该属性指定应用于块内内联内容的缩进。 缩进被视为应用于线框 起始边缘的边距。

除非另有规定 由 each-line 和/或 hanging 关键字, 否则仅影响元素的 第一行格式化行[CSS-PSEUDO-4] 例如,仅当匿名块框是其父元素的第一个子元素时,它的第一行才会受到影响。

值具有以下含义:

<长度>
以绝对长度给出缩进量。
<百分比>
以块容器自身逻辑宽度的百分比给出缩进量。

为了计算固有尺寸贡献,百分比必须视为 0,但在执行布局时始终正常解析。

注意:这可能导致元素溢出。不建议同时使用百分比缩进和固有尺寸调整。

each-line
缩进影响每个块容器的第一行以及强制换行后的每一行(但不影响软换行后的行)。
hanging
反转受影响的行。

如果 text-alignstart,并且 text-indent5em,在没有浮动的从左到右的文本中,第一行文本将从块的5em开始:

     自CSS1起,就可以通过
将块元素的第一行缩进5em,
通过将 'text-indent' 属性设置为 '5em'。

如果我们添加 hanging 关键字, 那么第一行将从头开始, 但其他行将缩进 5em:

在CSS3中,我们可以将块元素的所有其他行
缩进5em,
通过设置 'text-indent' 属性为
'hanging 5em'。
由于 text-indent 属性仅影响“第一格式化行”, 强制换行后的行将不会缩进。
   例如,在此段落的中间是一个方程,
该方程居中对齐:
             x + y = z
方程后的第一行是齐平的(否则看起来像
我们开始了一个新段落)。

然而,有时(如诗歌或代码中), 适合缩进每一行, 这些行足够长会换行。 在以下示例中,text-indent 的值为 3em hanging each-line, 使得诗歌的第三行在软换行处有一个悬挂缩进, 位于块的右边界处:

在简短的文本行中
不需要换行,
但当我们继续写下去,
   和写下去,
有时软换行
可以帮助我们保持在页面上。

注意: 由于 text-indent 属性是可继承的, 当在块元素上指定时,它会影响后代 的 inline-block 元素。 因此,通常明智的做法是为 text-indent: 0 的元素指定 display: inline-block

8.2. 悬挂字形

当行的起始或结束边缘的字形悬挂时, 它在测量行的内容以适应、对齐或对齐时不被考虑。 根据行的对齐/对齐方式,这可能会 导致标记被放置在行框之外。 计算悬挂字形时也不考虑 固有大小 (最小内容大小最大内容大小), 以及由此派生的任何大小。 (此测量与字距调整的相互作用目前由 UA 定义; CSSWG 欢迎对此提供建议)。

悬挂的悬挂字形仍然包含在其父内联框内, 并且仍然参与文本对齐: 它的字符进度不会在确定 行内内容能适应多少时被测量, 或者在对齐时需要扩展或压缩行的内容, 以及如何在行框内定位内容以进行文本对齐。 实际上,悬挂字形的字符进度 被重新解释为其父 内联框受影响边缘上的一个额外负边距; 其余行按常规布局。 溢出的 悬挂字形 通常应被视为 墨水溢出,以避免创建不必要的滚动条, 但 UA 可以在内容可编辑时 或在其他情况下将其视为 可滚动溢出,如果将其视为 可滚动溢出 对用户有用的话。[CSS-OVERFLOW-3]

在某些情况下,行尾的字形 可以有条件地悬挂: 它仅在其他情况下无法适应行时悬挂。 它在测量行的内容时不被考虑; 然而,其不适应的任何部分 都被视为 悬挂有条件悬挂的字形不被考虑 在计算 最小内容大小时, 但它们会被考虑用于 最大内容大小 及其派生的任何大小。

悬挂字形与行边缘之间的非零内联轴边框或填充 会阻止字形悬挂。 例如,内联框结束边缘有填充的句号 不会在行的结束边缘 悬挂

多个相邻字形可以一起悬挂, 然而可以指定允许悬挂的具体限制 (例如,每行的每个边缘最多允许一个标点符号 悬挂)。

8.2.1. 悬挂标点符号: hanging-punctuation 属性

名称: hanging-punctuation
值: none | [ first || [ force-end | allow-end ] || last ]
初始值: none
应用于: 文本
是否继承:
百分比: n/a
计算值: 指定的关键字
规范顺序: 按语法
动画类型: 离散的

此属性决定标点符号(如果存在)是否悬挂, 并且可以被放置在行框外(或在缩进中) 的行的起始或结束处。

注意: 如果块容器没有足够的填充, 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 表意逗号 (IDEOGRAPHIC COMMA)
U+3002 表意句号 (IDEOGRAPHIC FULL STOP)
U+FF0C 全角逗号 (FULLWIDTH COMMA)
U+FF0E 全角句号 (FULLWIDTH FULL STOP)
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 可以根据需要包含其他字符。

注意: CSS 工作组希望 UA 包含其他字符时 通知工作组这些添加内容。

allow-endforce-end 是东亚中使用的两种悬挂标点符号的变体。
hanging-punctuation: allow-end
p { 
  text-align: justify; 
  hanging-punctuation: allow-end; 
} 
hanging-punctuation: force-end
p { 
  text-align: justify; 
  hanging-punctuation: force-end; 
}

allow-end 中,第一行末尾的标点符号没有悬挂,因为它在不悬挂的情况下适合。 然而,如果使用 force-end,则标点符号被强制悬挂。 对齐测量行时,不包括悬挂标点符号。 因此,当行被扩展时,标点符号被推到行外。

8.3. 双向性和行框

行盒的开始边和结束边由行盒的内联基本方向决定。 尽管它们通常匹配, 但行盒内联基本方向包含块双向段落内联基本方向不同。 行盒内联基本方向会影响 text-align-alltext-align-lasttext-indenthanging-punctuation——即其内容相对于其边缘的位置和对齐方式。 它不影响内联内容的格式化或排序 (这由 CSS 书写模式 [UAX9] [CSS-WRITING-MODES-4] 应用的 Unicode 双向算法 控制)。

在大多数情况下,行框内联基线方向由其包含块 的计算方向决定。 然而, 如果其包含块具有unicode-bidi: plaintext [CSS-WRITING-MODES-4]

在以下示例中, 假设 <block> 是一个起始对齐的预格式化块 (display: block; white-space: pre; text-align: start), 每隔一行右对齐:
<block style="unicode-bidi: plaintext">
français
فارسی
français
فارسی
français
فارسی
</block>
由于中性字符(如标点符号)和隔离的文本块在 查找纯文本双向段落的内联基线方向时被跳过, 以下示例中的行框将是从左到右的 (因此根据text-align: start左对齐), 由第一个强字符‘h’决定:
<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!” 是从左到右排版的 (即感叹号位于右侧), 并左对齐, 忽略了包含块的 RTL 方向。 这使得其后的空行也是 LTR, 这意味着该行上的光标应出现在其左边缘。 然而,第一个空行是右对齐的: 因为没有前面的行, 它假设其包含块的 RTL 方向。

附录 A: 文本处理操作顺序

本附录为规范性内容。

以下列表定义了文本操作的顺序。 (只要生成的布局相同,实现方式不受此顺序的限制。)

  1. 空白字符处理 第一部分(换行前)
  2. 文本转换
  3. 文本合并 [CSS-WRITING-MODES-4]
  4. 文本方向 [CSS-WRITING-MODES-4]
  5. 文本换行 同时按行应用:
  6. 对齐(这可能会影响字形选择和/或文本换行,循环回到该步骤)
  7. 文本对齐

附录 B: 转换为纯文本

本附录是为了纯文本复制粘贴操作的规范性内容。

当 CSS 渲染的文档转换为纯文本格式时,预期以下内容:

附录 C: 默认用户代理样式表

本附录为信息性内容, 旨在帮助用户代理开发者实现 HTML 的默认样式表, 但用户代理开发者可以根据需要忽略或修改。

/* 使 option 元素对齐 */
option { text-align: match-parent; }

附录 D: 脚本和间距

本附录为规范性内容。

排版行为因语言有所不同,但由于书写系统的不同,差异很大。 本附录根据其对齐和间距行为,对 Unicode 6.0 中的一些常见 脚本 进行了分类。 分类描述是描述性的,而非规定性的; 决定因素是 对齐机会 的优先级。

块状脚本
CJK 以及扩展的所有宽字符 (参见 东亚宽度 [UAX11])。 以下 Unicode 脚本 包括: 注音符号、汉字、韩文、平假名、片假名和彝文。 东亚宽度属性WideFullwidth 的字符也包含在内, 但 Ambiguous 字符仅在 书写系统中文韩文日文 时包含在内。
聚合脚本
聚合脚本具有离散的单位,并且仅在单词边界处断开, 但不使用可见的单词分隔符。 它们优先拉伸空格, 但在对齐时也允许适当的字符间距。 聚合脚本包括但不限于以下 Unicode 脚本: 高棉文、老挝文、缅甸文、新傣仂文、傣勒文、傣汤文、傣越文、泰文
连笔脚本
草书脚本不允许在其字母之间出现用于对齐或字母间距的间隙。 包括以下Unicode 脚本: 阿拉伯文、 哈尼菲罗兴亚文、 曼达文、 蒙古文、 西非书面文字、 八思巴文、 叙利亚文

注意:带有基线连接符的印度文字(例如梵文和古吉拉特文)被视为草书脚本, 并且确实允许在排印字符单位之间出现此类间隙。 请参阅印度文字布局要求[ILREQ]

用户代理应随着 Unicode 支持的更新, 更新此列表, 以处理未来版本 Unicode 中尚未编码的连笔脚本, 并鼓励用户代理请求 CSSWG 相应地更新此规范。

附录 E: 字符和属性

本附录为规范性内容。

Unicode 定义了四个在 CSS 排版中引用的代码点级属性:

东亚宽度属性
Unicode 标准附录 #11 中定义 [UAX11],并作为 East_Asian_Width 属性 出现在 Unicode 字符数据库[UAX44]
一般类别
Unicode 标准附录 #44 中定义 [UAX44],并作为 General_Category 属性 出现在 Unicode 字符数据库[UAX44]
脚本属性
Unicode 标准附录 #24 中定义 [UAX24],并作为 Script 属性 出现在 Unicode 字符数据库[UAX44]。 (用户代理必须在此映射中包含 ScriptExtensions.txt 分配。)
垂直方向
Unicode 标准附录 #50 中定义 [UAX50],作为 Vertical_Orientation 属性 出现在 Unicode 字符数据库[UAX44]

Unicode 为单个代码点定义了属性, 但有时需要确定一个 排版字符单元 的属性。 对于 CSS 文本, 一个 排版字符单元 的属性由其第一个 字素簇 的基础字符给出——除了两种情况:

附录 F: 识别内容书写系统

本附录为规范性内容。

虽然大多数语言都有首选的书写系统, 但有些语言有多个, 并且大多数语言还可以转录为一种或多种外来书写系统。 作为一个常见示例,大多数语言至少有一个拉丁文转录, 因此可以用拉丁文书写系统书写。 转录文本通常采用书写系统的排版约定: 例如日语“罗马字”和中文拼音使用拉丁字母和单词空格, 并因此遵循拉丁文的换行和对齐规则。 另一个示例是历史上的表意朝鲜文 (ko-Hani), 不使用单词空格, 因此排版应该类似于中文, 而不是现代韩语。

在 HTML 或任何使用 文档语言 的系统中, 使用 BCP47 标签来标识语言, 以声明 内容语言, 作者可以通过脚本子标签来消除歧义或表示不常见的书写系统。[BCP47] 例如, 为了表示对某些不使用拉丁文的语言使用拉丁书写系统, 可以添加 -Latn 脚本子标签, 例如 ja-Latn 表示日语罗马字。 其他子标签也存在用于其他书写系统, 请参见 ISO 的 书写系统名称表示代码ISO15924 脚本标签注册表[ISO15924]

一些常见/历史上的使用 BCP47 标签和脚本子标签的例子:
zh-Latn
中文,使用拉丁文转录。
ko-Hani
韩语,使用汉字(中国表意文字)。
tr-Arab
土耳其语,使用阿拉伯文书写系统。
mn-Cyrl
蒙古语,使用西里尔字母。
mn-Mong
蒙古语,使用传统蒙古文书写系统。

然而,对于与单一书写系统紧密相关的语言, 通常不会(事实上是被建议不使用) 使用 BCP47 脚本子标签: 如果没有指定其他书写系统, 该书写系统通常被隐含。[BCP47] IANA 通过 Suppress-Script 字段维护了一个数据库, 记录了各种语言最常用的书写系统, 该数据库位于 语言子标签注册表 中, 用于此目的。

注意:更多关于语言标签的建议可以在 国际化工作组《HTML 和 XML 中的语言标签》《选择语言标签》 中找到。

当没有明确指定书写系统时, 用户代理应假设已声明的 内容语言 的最常用书写系统,用于换行或对齐等语言敏感的排版行为。 然而,用户代理不得假设书写系统, 如果作者已明确声明了另一个书写系统。 如果用户代理对某种特定语言和书写系统组合没有特定的语言知识, 它必须使用声明的书写系统的排版规则 (如果有必要,可以假设另一种语言的规则), 而不是使用假设的书写系统的声明语言的规则, 因为这对声明的书写系统是不合适的。

本文件不涉及语言与其最常见书写系统之间的完整对应关系。 然而,用户代理必须至少假设以下内容:

附录 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。

更改

最近更改

2023 年 9 月候选推荐草案以来,已进行以下规范性更改:

2023 年 2 月候选推荐草案以来,已进行以下规范性更改。

以下是自2020年12月候选推荐标准以来所做的规范性更改。

此外,还进行了若干小的编辑性修复。

较早更改

另请参阅较早的更改列表,涵盖了2020年和2019年工作草案在那之前的候选推荐版本,以及涵盖2013年至2020年之间所有评论的评论处理

一致性

文档约定

一致性要求通过描述性断言和 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"> 样式设置与其他规范性文本区分开,例如: UAs 必须提供可访问的替代方案。

一致性类别

本规范的一致性定义适用于三个一致性类别:

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

如果样式表中使用的语法符合本模块定义的通用 CSS 语法和每个功能的单独语法,并且所有语句均有效,则该样式表符合本规范。

如果渲染器不仅按照相关规范解释样式表,还正确解析本规范定义的所有功能并相应渲染文档,则渲染器符合本规范。然而,由于设备限制导致 UA 无法正确渲染文档的情况,并不会使该 UA 不符合规范。(例如,UA 在单色显示器上不需要渲染颜色。)

如果创作工具编写的样式表在语法上符合通用 CSS 语法和本模块中每个功能的单独语法,并且符合本模块中描述的所有样式表一致性要求,则该创作工具符合本规范。

部分实现

为了使作者能够利用向前兼容的解析规则分配后备值,CSS 渲染器必须将它们不支持的 at-rules、属性、属性值、关键字和其他语法结构视为无效(并适当忽略)。特别是,用户代理不得选择性地忽略不支持的组件值,同时接受一个多值属性声明中的支持值:如果任何值被视为无效(如不支持的值必须如此),CSS 要求整个声明被忽略。

不稳定和专有功能的实现

为避免与未来稳定的 CSS 功能发生冲突,CSSWG 建议遵循最佳实践,以实现不稳定功能和专有扩展的 CSS。

非实验性实现

一旦规范进入候选推荐阶段,非实验性实现是可能的,并且实现者应发布根据规范证明正确实现的任何 CR 级功能的无前缀实现。

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

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

CR 退出标准

为了让本规范提升至建议推荐阶段,每个功能必须至少有两个独立的、可互操作的实现。每个功能可以由不同的产品集实现,不要求所有功能由单一产品实现。对于此标准,我们定义了以下术语:

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

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

索引

本规范定义的术语

通过引用定义的术语

参考文献

规范性引用

[CSS-BACKGROUNDS-3]
Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3. 2024年3月11日. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-BOX-4]
Elika Etemad. CSS Box Model Module Level 4. 2024年8月4日. WD. URL: https://www.w3.org/TR/css-box-4/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 2022年1月13日. CR. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-DISPLAY-3]
Elika Etemad; Tab Atkins Jr.. CSS Display Module Level 3. 2023年3月30日. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-FONTS-3]
John Daggett; Myles Maxfield; Chris Lilley. CSS Fonts Module Level 3. 2018年9月20日. REC. URL: https://www.w3.org/TR/css-fonts-3/
[CSS-FONTS-4]
Chris Lilley. CSS Fonts Module Level 4. 2024年2月1日. WD. URL: https://www.w3.org/TR/css-fonts-4/
[CSS-INLINE-3]
Elika Etemad. CSS Inline Layout Module Level 3. 2024年8月12日. WD. URL: https://www.w3.org/TR/css-inline-3/
[CSS-OVERFLOW-3]
Elika Etemad; Florian Rivoal. CSS Overflow Module Level 3. 2023年3月29日. WD. URL: https://www.w3.org/TR/css-overflow-3/
[CSS-PSEUDO-4]
Daniel Glazman; Elika Etemad; Alan Stearns. CSS Pseudo-Elements Module Level 4. 2022年12月30日. WD. URL: https://www.w3.org/TR/css-pseudo-4/
[CSS-RUBY-1]
Elika Etemad; et al. CSS Ruby Annotation Layout Module Level 1. 2022年12月31日. WD. URL: https://www.w3.org/TR/css-ruby-1/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS Box Sizing Module Level 3. 2021年12月17日. WD. URL: https://www.w3.org/TR/css-sizing-3/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2024年3月22日. CR. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2024年3月12日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-3]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 3. 2019年12月10日. REC. URL: 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日. CR. URL: 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日. REC. URL: https://www.w3.org/TR/CSS21/
[CSSOM-1]
Daniel Glazman; Emilio Cobos Álvarez. CSS Object Model (CSSOM). 2021年8月26日. WD. URL: https://www.w3.org/TR/cssom-1/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[UAX11]
Ken Lunde 小林劍󠄁. East Asian Width. 2023年7月17日. Unicode Standard Annex #11. URL: https://www.unicode.org/reports/tr11/tr11-41.html
[UAX14]
Robin Leroy. Unicode Line Breaking Algorithm. 2023年8月15日. Unicode Standard Annex #14. URL: https://www.unicode.org/reports/tr14/tr14-51.html
[UAX24]
Ken Whistler. Unicode Script Property. 2023年8月14日. Unicode Standard Annex #24. URL: https://www.unicode.org/reports/tr24/tr24-36.html
[UAX29]
Josh Hadley. Unicode Text Segmentation. 2023年8月16日. Unicode Standard Annex #29. URL: https://www.unicode.org/reports/tr29/tr29-43.html
[UAX44]
Ken Whistler. Unicode Character Database. 2023年9月6日. Unicode Standard Annex #44. URL: https://www.unicode.org/reports/tr44/tr44-32.html
[UAX50]
Ken Lunde 小林劍󠄁; Koji Ishii 石井宏治. Unicode Vertical Text Layout. 2023年7月17日. Unicode Standard Annex #50. URL: https://www.unicode.org/reports/tr50/tr50-29.html
[UAX9]
Manish Goregaokar मनीष गोरेगांवकर; Robin Leroy. Unicode Bidirectional Algorithm. 2023年8月15日. Unicode Standard Annex #9. URL: https://www.unicode.org/reports/tr9/tr9-48.html
[UNICODE]
The Unicode Standard. URL: https://www.unicode.org/versions/latest/

参考性引用

[BCP47]
A. Phillips, Ed.; M. Davis, Ed.. Tags for Identifying Languages. 2009年9月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc5646
[CLREQ]
Fuqiao Xue; Richard Ishida. Requirements for Chinese Text Layout - 中文排版需求. 2024年7月1日. NOTE. URL: https://www.w3.org/TR/clreq/
[CSS-TEXT-DECOR-3]
Elika Etemad; Koji Ishii. CSS Text Decoration Module Level 3. 2022年5月5日. CR. URL: https://www.w3.org/TR/css-text-decor-3/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[ILREQ]
Swaran Lata. Indic Layout Requirements. 2020年5月29日. WD. URL: https://www.w3.org/TR/ilreq/
[ISO15924]
Code for the representation of names of scripts. International Organization for Standardization. 1998. ISO 15924:1998. Draft International Standard
[JIS4051]
Formatting rules for Japanese documents (『日本語文書の組版方法』). Japanese Standards Association. 2004. JIS X 4051:2004. In Japanese
[JLREQ]
Hiroyuki Chiba; et al. Requirements for Japanese Text Layout 日本語組版処理の要件(日本語版). 2020年8月11日. NOTE. URL: https://www.w3.org/TR/jlreq/
[JUSTIFY]
Elika Etemad; Richard Ishida. Approches to Full Justification. URL: https://www.w3.org/International/articles/typography/justification
[RFC6919]
R. Barnes; S. Kent; E. Rescorla. Further Key Words for Use in RFCs to Indicate Requirement Levels. 2013年4月1日. Experimental. URL: https://www.rfc-editor.org/rfc/rfc6919
[TYPOGRAPHY]
Richard Ishida. Language enablement index. 2024年8月15日. NOTE. URL: https://www.w3.org/TR/typography/
[XML10]
Tim Bray; et al. Extensible Markup Language (XML) 1.0 (Fifth Edition). 2008年11月26日. REC. URL: https://www.w3.org/TR/xml/
[ZHMARK]
General Rules for Punctuation (《标点符号用法》). 2011. GB/T 15834―2011. In Chinese.

属性索引

名称 初始值 应用于 继承 百分比 动画类型 规范顺序 计算值
hanging-punctuation none | [ first || [ force-end | allow-end ] || last ] none 文本 n/a 离散 按语法 指定的关键词
hyphens none | manual | auto manual 文本 n/a 离散 n/a 指定的关键词
letter-spacing normal | <长度> normal 内联框和文本 n/a 按计算值类型 n/a 绝对长度
line-break auto | loose | normal | strict | anywhere auto 文本 n/a 离散 n/a 指定的关键词
overflow-wrap normal | break-word | anywhere normal 文本 n/a 离散 n/a 指定的关键词
tab-size <number [0,∞]> | <length [0,∞]> 8 文本 n/a 按计算值类型 n/a 指定的数字或绝对长度
text-align start | end | left | right | center | justify | match-parent | justify-all start 块容器 见各个属性 离散 n/a 见各个属性
text-align-all start | end | left | right | center | justify | match-parent start 块容器 n/a 离散 n/a 指定的关键词,除 match-parent 根据定义计算
text-align-last auto | start | end | left | right | center | justify | match-parent auto 块容器 n/a 离散 n/a 指定关键字,但 match-parent 除外,其计算方式如上所述
text-indent [ <length-percentage> ] && hanging? && each-line? 0 块容器 参考块容器的自身内联轴内尺寸 按计算值类型 按语法 计算的 <length-percentage> 值,加上任何指定的关键词
text-justify auto | none | inter-word | inter-character auto 文本 n/a 离散 n/a 指定的关键词(除了 distribute 旧值)
text-transform none | [capitalize | uppercase | lowercase ] || full-width || full-size-kana none 文本 n/a 离散 n/a 指定的关键词
white-space normal | pre | nowrap | pre-wrap | break-spaces | pre-line normal 文本 n/a 离散 n/a 指定的关键词
word-break normal | keep-all | break-all | break-word normal 文本 n/a 离散 n/a 指定的关键词
word-spacing normal | <长度> normal 文本 n/a 按计算值类型 n/a 绝对长度
word-wrap normal | break-word | anywhere normal 文本 n/a 离散 n/a 指定的关键词