CSS 文本模块第 3 级

W3C 候选推荐草案,

关于本文档的更多详情
此版本:
https://www.w3.org/TR/2026/CRD-css-text-3-20260608/
最新发布版本:
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 (Apple)
(受邀 专家)
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] …comment 摘要…”。 所有议题和评论都会被归档。 或者,也可以将反馈发送到(已归档的)公共邮件列表 www-style@w3.org

本文档受 2025 年 8 月 18 日 W3C 流程 文档约束。

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

以下特性处于风险状态,可能会在 CR 阶段被移除:

“At-risk” 是 W3C 流程中的术语,并不一定意味着该特性有被 删除或延迟的危险。它表示 WG 认为该特性可能难以及时实现可互操作的 实现,将其标记为此状态,使 WG 在必要时可在 转入拟议推荐阶段时移除该特性,而无需先发布一份不含该特性的新的候选推荐。

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. 值定义

本规范遵循来自 [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, 而不是 koko-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 的范围。

以下是标准排版实践所要求的一些排版字符单元定制示例:

排版字母 单元 (或就本规范而言的字母) 是属于 Letter 或 Number 通用 类别之一的排版字符单元。 关于如何确定排版 字符单元的 Unicode 属性, 参见附录 E: 字符与属性

被元素边界分割的排版字符单元的渲染特征 是未定义的。 理想情况下,每个组成部分都应根据其各自元素属性的格式化要求 进行渲染, 同时保持整个排版字符单元 正确的塑形和定位。 然而,根据其各部分之间格式差异的性质 以及所用字体技术的能力, 这并不总是可能。 因此,这样的排版字符单元 可能会被渲染为属于边界的一侧, 或者以某种近似方式同时属于两侧。 作者需要预先注意,通过元素边界分割字素簇 或连字 可能会产生不一致或不希望的结果。

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
适用于: 文本
继承: yes
百分比: n/a
计算值: 指定的关键字
规范顺序: n/a
动画类型: 离散

此属性出于样式目的对文本进行转换。 它不会影响底层内容, 并且不得影响纯文本复制与粘贴操作的内容。

作者不得依赖 text-transform 来表达语义 目的; 相反,正确的大小写和语义应编码在 源文档文本和标记中。

各值含义如下:

none
无效果。
capitalize
将每个单词的第一个排版字母单元(如果为小写)变为 标题大小写; 其他字符不受影响。
uppercase
将所有字母变为大写。
lowercase
将所有字母变为小写。
full-width
将所有排版字符单元变为全角形式。 如果某个字符没有对应的全角形式, 则保持原样。 此值通常用于将拉丁字母和数字 按照如同表意字符一样的方式进行排版。
full-size-kana
将所有小假名 字符转换为等价的全尺寸假名。 此值通常用于 ruby 注音文本, 作者可能希望所有小假名都绘制为大假名, 以弥补 ruby 中通常使用的小字号带来的易读性问题。
以下示例将日语文本缩写中使用的 ASCII 字符 转换为其全角变体, 使其像表意字符一样布局和断行:
abbr:lang(ja) { text-transform: full-width; }

注: text-transform 的目的 是允许进行呈现性的大小写转换, 而不影响文档的语义。 特别需要注意的是,text-transform 的大小写操作是有损的, 并且可能扭曲文本含义。 虽然无障碍接口可能希望向用户传达 渲染文本的表观大小写, 但不能依赖转换后的文本准确表示 文档的底层含义。

在此示例中, 第一行文本被大写化作为视觉效果。
section > p:first-of-type::first-line {
  text-transform: uppercase;
}

这种效果不能写入源文档, 因为换行位置取决于布局。 另外,大写化并不反映语义区别, 也不意图影响段落的阅读; 因此它属于呈现层。

在此示例中, ruby 注音, 其大小为主段落文本的一半, 被转换为使用常规尺寸假名 来替代小假名
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 标准Default Case Algorithms 一节所定义。 [UNICODE] 当且仅当元素的内容 语言 根据文档 语言规则 是已知的, 则也必须应用任何适当的特定语言规则。 这些规则至少包括但不限于 Unicode 的 SpecialCasing.txt 中的特定语言规则。

例如,在土耳其语中有两个 “i”, 一个带点——“İ” 和 “i”——另一个不带点——“I” 和 “ı”。 因此,“I” 与 “i” 之间通常的大小写映射 会被一组不同的映射取代, 映射到它们各自的无点/有点对应形式, 这些对应形式在英语中并不存在。 这种映射只有在内容语言 是土耳其语 且使用其现代基于拉丁文字的书写系统 (或另一种使用土耳其语大小写规则的突厥语) 时才必须生效; 在其他语言中, 必须使用 “I” 与 “i” 的通常映射。 因此,此规则在 Unicode 的 SpecialCasing.txt 文件中被条件性地定义。

全角半角形式的定义 可在 Unicode 标准附录 #11: 东亚宽度中找到。 [UAX11]全角形式的映射 是通过选取其 Decomposition_Mapping 中带有 <wide><narrow> 标签的码位来定义的, 这些码位位于 Unicode 标准附录 #44:Unicode 字符数据库中。 [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 IDEOGRAPHIC SPACE。

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

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

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

此属性指定两件事:

各值含义如下, 其解释必须符合 空白处理断行规则:

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 § 9.2.2.1 匿名 内联框[CSS2]

控制字符(Unicode 类别 Cc)——除制表符(U+0009)、 换行符(U+000A)、 回车符(U+000D) 以及构成分段 换行的序列之外——必须渲染为可见字形; 如果字体中的字形不可见,UA 必须合成该字形, 并且在其他方面必须将其当作 Other Symbols(So通用类别 和 Common 文字 中的任何其他字符处理。 UA 可以使用字体专门为该控制字符提供的字形, 替换为 Control Pictures 区块中对应符号的字形, 生成其码位值的视觉表示, 或使用其他方法提供适当的可见字形。 按 Unicode 的要求, 不支持的 Default_ignorable 字符 必须在文本渲染中忽略。 [UNICODE]

回车符(U+000D)在所有方面都按与空格(U+0020)完全相同的方式处理。

注: 对于 HTML 文档, 源代码中存在的回车符 会在解析阶段转换为换行符 (参见 HTML § 13.2.3.5 预处理输入流 以及 normalize newlinesInfra 中的定义), 因此不会以 U+000D CARRIAGE RETURN 的形式出现在 CSS 中。 [HTML] [INFRA]) 但是,当使用转义序列(&#x0d;)编码时, 该字符被保留——并且上述规则可被观察到。

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. 阶段 I:折叠和转换

对于每个内联 (包括匿名内联; 参见 CSS 2 § 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. 阶段 II:修剪和定位

然后,整个块会被渲染。 内联内容会进行布局, 同时考虑双向重排序, 并按照 white-space 属性的规定进行换行。 在布局每一行时,

  1. 位于一行开头的一串可折叠空格 会被移除。
  2. 如果制表符尺寸为零, 保留的 制表符不会被渲染。 否则,每个保留的制表符都会渲染为 一个水平位移,使下一个字形的起始边 与下一个制表位对齐。 如果此距离小于 0.5ch, 则改用后续制表位制表 位出现在 从保留的制表符最近的 块容器祖先的起始内容边开始, 按制表符尺寸的倍数计算的位置。 制表符尺寸tab-size 属性给出。

    注: 参见 Unicode 中关于制表(U+0009)如何与双向性相互作用的规则[UAX9]

  3. 位于一行末尾的一串可折叠空格 会被移除, 任何行尾的 U+1680   OGHAM SPACE MARK 也会被移除, 只要其 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 必须(无条件地)让该序列悬挂, 除非该序列后跟一个强制换行, 在这种情况下,它必须改为使该序列有条件地悬挂。 它还可以在视觉上折叠任何本会溢出的字符前进宽度。

      注: 让空白悬挂而不是折叠它, 允许用户在选择或编辑文本时看到该空格。

    • 如果 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-spaceprepre-wrapbreak-spacespre-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.

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
适用于: 文本
继承: yes
百分比: n/a
计算值: 指定的数字或绝对长度
规范顺序: n/a
动画类型: 按计算值类型

此属性确定用于渲染保留的制表符字符(U+0009)的 制表符 尺寸<number> 表示一个度量值, 它是该保留的制表符最近的块容器祖先的空格字符(U+0020)前进宽度的倍数, 包括其关联的 letter-spacingword-spacing。 不允许负值。

5. 断行与词边界

当内联级内容被布局到行中时,它会跨行框断开。 这样的断开称为换行。 当一行由于显式断行控制 (例如保留的换行字符) 或由于块的起始或结束而断开时, 它是强制 换行。 当一行由于内容换行 而断开 (即 UA 为了使内容适合度量范围而创建非强制换行时), 它是软换行 断点。 将内联级内容分成行的过程称为断行

换行只会在允许的断点处执行, 该断点称为软换行 机会。 当启用换行时(见 white-space), 如果存在软换行机会, UA 必须通过在该软换行机会处换行, 尽量减少行中内容溢出的量。 有效的软换行机会取决于 内容语言 和书写系统, 以及控制它们的 CSS 属性。

在大多数书写系统中, 在没有连字符断词的情况下,软换行机会只出现在词边界。 许多此类系统(例如使用拉丁字母书写的英语) 使用空格或标点明确地 分隔单词, 并且可以通过这些字符识别软换行机会

然而,泰文、老挝文和高棉文等文字 不使用空格或标点来分隔单词。 尽管零宽空格(U+200B)可以在这些文字中 用作显式词分隔符, 但这种做法并不常见。 因此,需要词汇资源 来正确识别此类文本中的软换行机会

在某些其他书写系统中, 尤其是爪哇文和巴厘文等婆罗米系文字, 软换行 机会基于正字法音节边界, 而不是词边界。 尽管正字法音节断开 不依赖于内容语言 也不需要词汇资源, 但它仍然需要分析文本 以找到断开机会。

在另一些文字中,例如中文(以及日文、彝文,有时还有韩文), 每个音节往往对应一个单独的排版字母单元, 因而断行约定允许在任何位置断行, 除了某些字符组合之间。 此外,这些限制的严格程度 会随排版风格而变化。

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

注: Unicode 标准附录 #14:Unicode 断行 算法 为 Unicode 中所有文字的断行 定义了基线行为, 并预期会进一步定制。 [UAX14] 关于断行约定的更多信息, 可参见面向日文的 日文文本 布局需求 [JLREQ]日本文档格式化规则 [JIS4051], 以及面向中文的 中文排版需求 [CLREQ]标点符号用法 [ZHMARK]。 另请参见 国际化工作组语言支持索引, 其中包含更多关于其他语言的信息。 [TYPOGRAPHY] 对额外适当参考文献的任何指导 都将非常感谢。

5.1. 字母的断开规则:word-break 属性

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

此属性指定字母之间的软换行机会, 即在何处“正常”且允许断开文本行。 具体而言,它控制 相邻排版字母单元之间 通常是否存在软换行机会, 并且出于此目的(仅此目的),将属于 NUALAIID Unicode 断行类别的非字母排版字符 单元 当作排版字母单元[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
允许在“单词”内部断开: 具体而言, 除了 normal 所允许的软换行机会之外, 任何排版字母单元 (以及任何解析为 NU(“numeric”)、 AL(“alphabetic”) 或 SA(“Southeast Asian”) 断行类别的排版字符单元 [UAX14]) 都会改为按 ID (“ideographic characters”) 处理,以用于断行。 不应用连字符断词。

注: 此值不会影响 标点字符周围是否存在软换行机会。 若要允许在任意位置断开,见 line-break: anywhere

注: 此选项启用了埃塞俄比亚文的另一种常见 行为。 它也常用于以下上下文: 文本主要由 CJK 字符组成, 其中只有短小的非 CJK 摘录, 并且希望文本在每一行上分布得更均匀。

keep-all
禁止在“单词”内部断开: 抑制排版字母单元 (或其他属于 NUALAIID Unicode 断行类别的排版字符单元 [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·و·کمی·خط·عربی·และ·ตัวอย่าง·การเขียน·ภาษาไทย·በጽሑፍ፡·ማራዘሙን፡·አንዳንድ፡

日语通常排版为允许在单词内部的音节之间断行。 然而,有时更倾向于抑制这些换行机会, 只允许在某些句子片段末尾换行。 这种做法最常用于非常短的文本, 例如标题以及表格或图题。

这可以通过在允许的换行点处标记 wbr 或 U+200B ZERO WIDTH SPACE, 并使用 word-break: keep-all 抑制其他换行点来实现。

例如,以下标记可以产生下面任一渲染结果, 具体取决于 word-break 属性的值:

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

为了兼容旧内容, word-break 属性还支持 一个已弃用的 break-word 关键字。 指定时,它与 word-break: normaloverflow-wrap: anywhere 具有相同效果, 无论 overflow-wrap 属性的实际值为何。

word-break 的效果会在计算内在 尺寸时被考虑。

5.2. 断行严格度:line-break 属性

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

此属性指定在元素内应用的断行规则的严格程度: 特别是换行如何与 标点和符号相互作用。 各值含义如下:

auto
UA 确定要使用的断行限制集合, 并且可以根据行的长度改变这些限制; 例如,对短行使用限制较少的断行规则集合。
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 可以在 strict/normal/loose 模式之间添加额外区别, 这些值在其他书写系统中也可能表现出差异。 例如,具有足够高级泰语处理能力的 UA 可以选择将泰语断行的不同严格度级别 映射到这些关键字, 例如在 strict 模式下 不允许在复合词内部断开 (例如将 ตัวอย่างการเขียนภาษาไทย 断为 ตัวอย่าง·การเขียน·ภาษาไทย), 而在 loose 中允许更多断开 (ตัวอย่าง·การ·เขียน·ภาษา·ไทย)。

注: CSSWG 认识到,在本规范的未来版本中, 可能需要对断行进行更精细的控制, 以满足高端出版需求。

注:虽然用户代理可以将 [UAX14] 作为其断行实现的起点, 但为了与现有实现最大程度互操作, 以下偏离可能是可取的:

5.3. 连字符断词: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]
克里语 [ᑲᓯᑕᓂᐘᓂᓂᐠ]
					          (CANADIAN SYLLABICS KA +
					          CANADIAN SYLLABICS SI +
					          CANADIAN SYLLABICS TA +
					          CANADIAN SYLLABICS NI +
					          CANADIAN SYLLABICS WEST-CREE WA +
					          CANADIAN SYLLABICS NI +
					          CANADIAN SYLLABICS NI +
					          CANADIAN SYLLABICS FINAL GRAVE) [ᑲᓯᑕᓂ᐀]
					          (CANADIAN SYLLABICS KA +
					          CANADIAN SYLLABICS SI +
					          CANADIAN SYLLABICS TA +
					          CANADIAN SYLLABICS NI +
					          CANADIAN SYLLABICS HYPHEN) [ᐘᓂᓂᐠ]
					          (CANADIAN SYLLABICS WEST-CREE WA +
					          CANADIAN SYLLABICS NI +
					          CANADIAN SYLLABICS NI +
					          CANADIAN SYLLABICS FINAL GRAVE)

连字符断词发生于 行在有效的连字符断词机会处断开时, 它是一种软换行机会, 存在于单词内部允许连字符断词的位置。 在 CSS 中,连字符断词机会hyphens 属性控制。 CSS Text Level 3 没有定义连字符断词的确切规则; 然而强烈鼓励 UA 优化其断点选择, 并选择适合语言的连字符断词点。

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

在计算 min-content 内在尺寸时, 考虑连字符断词机会。

注: 这允许表格对其内容进行连字符断词, 而不是溢出其包含块, 这在德语等长词语言中特别重要。

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

此属性控制是否允许连字符断词 在一行文本内部创建更多软换行 机会。 各值含义如下:

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) 创建的连字符断词机会处进行连字符断词 而显示的任何字形 都由该字符表示, 并根据应用于它的属性进行样式化。

注: 当阿拉伯文等塑形文字 因连字符断词而允许在单词内部断开时, 字符仍会像该单词未断开一样进行塑形。

例如,如果维吾尔语单词 “داميدى” 进行连字符断词,它将显示为 [孤立 DAL + 孤立 ALEF + 词首 MEEM +
		          词中 YEH + 连字符 + 换行 + 词尾 DAL +
		          孤立 ALEF MAKSURA] 而不是 [孤立 DAL + 孤立 ALEF + 词首 MEEM +
		          词尾 YEH + 连字符 + 换行 + 孤立 DAL +
		          孤立 ALEF MAKSURA]

5.4. 溢出换行:overflow-wrapword-wrap)属性

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

此属性指定当原本不可断开的字符串太长, 无法放入行框内时, UA 是否可以在一行内原本不允许断开的点处断开 以防止溢出。 它只有在 white-space 允许换行时才有效。可能的值:

normal
行只能在允许的断点处断开。 但是, word-break: keep-all 引入的限制 可以放宽为匹配 word-break: normal, 如果该行中没有其他可接受的断点。
anywhere
如果一行中没有其他可接受的断点, 原本不可断开的字符序列 可以在任意点断开。 塑形字符仍会像单词未断开那样进行塑形, 并且字素簇必须作为一个单元保持在一起。 不会在断点处插入连字符断词字符。 由 anywhere 引入的软换行 机会 在计算 min-content 内在尺寸会被考虑
break-word
anywhere 相同, 但由 break-word 引入的软换行 机会 在计算 min-content 内在尺寸不会被考虑。

出于遗留原因,UA 必须将 word-wrap 视为 遗留名称别名,对应 overflow-wrap 属性。

5.5. 断行细节

确定换行时:

6. 对齐与两端对齐

对齐与两端对齐控制 内联内容如何在行框内分布。

6.1. 文本对齐:text-align 简写属性

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

简写属性 设置 text-align-alltext-align-last 属性, 并描述当内容没有完全填满行框时, 块的内联级内容 如何沿内联轴对齐。 除 justify-allmatch-parent 外的值 会被赋给 text-align-all, 并将 text-align-last 重置为 auto

各值含义如下:

start
内联级内容对齐到 行框的起始边。
end
内联级内容对齐到 行框的结束边。
left
内联级内容对齐到 行框的 line-left 边。 (在竖排书写模式中, 这可以是物理上的顶部或底部, 具体取决于 writing-mode。) [CSS-WRITING-MODES-4]
right
内联级内容对齐到 行框的 line-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 会根据父元素的 direction 值解释, 并得到 leftright 的计算值。 当指定在根元素上时, 计算为 start

当指定在 text-align 简写属性上时, 会将 text-align-alltext-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
适用于: 块容器
继承: yes
百分比: n/a
计算值: 指定的关键字,但 match-parent 例外,它按上文定义计算
规范顺序: n/a
动画类型: 离散

这是 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
适用于: 块容器
继承: yes
百分比: n/a
计算值: 指定的关键字,但 match-parent 例外,它按上文定义计算
规范顺序: n/a
动画类型: 离散

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

如果指定了 auto, 受影响行上的内容会按照 text-align-all 对齐, 除非 text-align-all 设置为 justify, 在这种情况下,它会按 start 对齐。 所有其他值均按 text-align 中的描述解释。

6.4. 两端对齐方法:text-justify 属性

名称: text-justify
值: auto | none | inter-word | inter-character
初始值: auto
适用于: 文本
继承: yes
百分比: n/a
计算值: 指定的关键字(distribute 遗留值除外)
规范顺序: n/a
动画类型: 离散

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

auto
UA 根据性能与足够的呈现质量之间的平衡, 确定要遵循的两端对齐算法。 由于两端对齐规则会随书写系统语言而变化, UA 应在可能时 使用适合文本的两端对齐算法。
例如, UA 可以默认使用一种两端对齐方法, 作为适用于所有书写系统的简单通用折衷方案——例如主要扩展词分隔符 以及 CJK 排版字母单元之间的间距, 同时次要地扩展 东南亚排版字母单元之间的间距。 然后,在段落的内容语言已知的情况下, 它可以选择更按语言定制的两端对齐行为, 例如对日语遵循日文文本 布局需求 [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 Symbols(S*)和 Punctuation(P*)类别的 排版字符单元 通常会按与同一文字体系中的排版字母单元相同的方式处理 (或者,如果该字符的文字属性为 Common, 则按主导文字体系的排版字母单元处理)。

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

例如,传统上在连续的 U+2014 — EM DASH、 U+2015 ― HORIZONTAL BAR、 U+2026 … HORIZONTAL ELLIPSIS 或 U+2025 ‥ TWO DOT LEADER 字符之间没有两端对齐机会 [JLREQ]; 因而 UA 可能会将这些字符分配到“never”优先级。 又如,某些全角标点字符 (例如 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 | <length>
初始值: normal
适用于: 文本
继承: yes
百分比: N/A
计算值: 绝对长度
规范顺序: n/a
动画类型: 按计算值类型

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

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

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

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

此属性指定相邻排版字符单元之间的额外间距 (通常称为字距调整)。 字距调整在 双向重排序 之后应用, 并且是在字偶距调整word-spacing 之外的额外间距。 [CSS-WRITING-MODES-4] [CSS-FONTS-3] 取决于生效的两端对齐规则, 用户代理还可以进一步增加或减少 排版字符单元之间的空间, 以便对文本进行两端对齐

各值含义如下:

normal
不应用额外间距。计算为零。
<length>
指定排版字符单元之间的 额外间距。 值可以为负, 但实现可能有相关限制。

出于遗留原因, 计算值为零的 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 可以改为在元素边界处将字距 附着到某一个排版字符单元上, 使用与其包含元素相关的 letter-spacing 值。

注: 由于 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; }
span { letter-spacing: 2em; }
<p>a<span>b</span>c</p>

a b c

由于字距是在 RTL 重排序之后插入的, 下面应用于内部 span 的字距同样没有效果, 因为重排序之后,“c” 最终并不会挨着 “א”:

p    { letter-spacing: 1em; }
span { letter-spacing: 2em; }
<!-- abc followed by Hebrew letters alef (א), bet (ב) and gimel (ג) -->
<!-- Reordering will display these in reverse order. -->
<p>ab<span></span>בג</p>

a b c א ב ג

字距会忽略不可见的零宽格式化字符 (例如 Unicode Cf 类别中的字符)。 间距必须像这些字符在文档中不存在一样添加。

例如,应用于 A&#x200B;Bletter-spacing 与应用于 AB 完全相同, 无论任何元素边界可能落在何处。

当两个字符之间的有效间距不为零时 (无论是由于两端对齐 还是由于 letter-spacing 的非零值), 用户代理不应应用可选连字, 即那些未被定义为基本正确字形塑形所必需的连字。 但是,通过底层 font-feature-settings 属性指定的连字和其他字体特性 优先于此规则。 参见 CSS 字体模块第 3 级 § feature-precedence

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

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

7.2.1. 草书体文字

如果能够做到, UA 可以通过将要分配给此类字母序列的总额外空间 转换为该序列某种形式的草书延展 (或对于负的字距调整值,转换为压缩) 来将字距应用于草书体文字, 从而产生该序列等效的总扩展(或压缩)。 否则, 如果 UA 无法在不断开草书连接的情况下 扩展草书体文字中的文本, 则它不得在该文字的任意一对排版字母单元之间 应用任何间距 (实际上将每个单词视为单个排版字母 单元, 以用于 letter-spacing)。 这两种情况都会导致此类字母之间的有效间距为零; 不过前者会保留文本被拉长的感觉。

下面是一些对阿拉伯文文本加间距的适当和不适当示例。
原始文本
不佳 在每个字母之间均匀分配空间。 注意这会断开草书连接!
通过排版上适当的草书延展来分配 ∑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
适用于: 块容器
继承: yes
百分比: 指块容器自身内联轴上的内尺寸
计算值: 计算后的 <length-percentage> 值,加上任何指定的关键字
规范顺序: 按语法
动画类型: 按计算值类型

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

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

各值含义如下:

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

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

注: 这可能导致元素溢出。 不建议同时使用百分比缩进和内在尺寸。

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

如果在没有浮动存在的从左到右文本中, text-alignstarttext-indent5em, 则文本第一行 将在块内缩进 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'.
由于 text-indent 属性只影响“第一格式化行”, 强制断开之后的一行不会被缩进。
   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 属性会继承, 当在块元素上指定时,它会影响后代 inline-block 元素。 因此,通常明智的做法是在指定为 display: inline-block 的元素上指定 text-indent: 0

8.2. 悬挂字形

当一行起始边或结束边处的字形悬挂时, 在测量该行内容以确定适配、对齐或两端对齐时, 不会考虑它。 取决于该行的对齐/两端对齐, 这可能导致该标记被放置在行框之外。 在计算内在尺寸min-content 尺寸max-content 尺寸) 以及由此派生的任何尺寸时, 也不会考虑这个悬挂字形。 (这种测量与字偶距调整之间的相互作用目前由 UA 定义; CSSWG 欢迎就此提出建议。)

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

在某些情况下,一行末尾的字形 可以有条件地 悬挂: 它只有在两端对齐之前原本无法放入行中时才悬挂。 在测量该行内容以确定适配时不会考虑它; 然而,它无法放入的任何部分 都被视为悬挂有条件地悬挂的字形 在计算min-content 尺寸 以及由此派生的任何尺寸时不被考虑, 但在计算max-content 尺寸 以及由此派生的任何尺寸时会被考虑。

在可悬挂的字形 与行边缘之间的非零内联轴边框或内边距 会阻止该字形悬挂。 例如,带有结束侧内边距的内联框末尾的句点 不会在一行的结束边缘处悬挂

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

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

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

此属性确定标点符号(如果存在) 是否悬挂, 并可放置在行框之外 (或缩进中), 位于文本行的起始处或结束处。

注: 如果块容器没有足够的内边距, hanging-punctuation 可能触发溢出。

各值含义如下:

none
不使任何标点字符悬挂
first
元素第一格式化行开头的 开括号、引号或表意空格会悬挂。 这适用于 Unicode 类别 Ps、Pf、Pi 中的所有字符, 加上 ASCII 引号 U+0027 ' APOSTROPHE 和 U+0022 " QUOTATION MARK 以及 IDEOGRAPHIC SPACE 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——也就是其内容相对于其边缘的位置和对齐。 它不影响内联内容的格式化或排序 (后者由 Unicode 双向 算法 控制,并由 CSS 书写模式应用 [UAX9] [CSS-WRITING-MODES-4])。

在大多数情况下,行框内联基准方向 由其包含块的计算后 direction 给出。 然而, 如果其包含块具有 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!” 会按 LTR 排版 (即感叹号在右侧) 并左对齐, 忽略包含块的 RTL direction。 这会使其后面的空行也成为 LTR, 这意味着该行上的光标应出现在其左边缘。 但是,空的第一行会右对齐: 因为没有前一行, 它采用其包含块的 RTL 方向。

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

本附录是规范性的。

以下列表定义文本操作的顺序。 (只要得到的布局相同,实现不受此顺序约束。)

  1. 空白处理第 I 部分(换行前)
  2. 文本转换
  3. 文本组合 [CSS-WRITING-MODES-4]
  4. 文本方向 [CSS-WRITING-MODES-4]
  5. 在逐行应用以下内容的同时进行文本换行
  6. 两端对齐 (这可能影响字形选择和/或文本换行,并循环回该步骤)
  7. 文本对齐

附录 B: 转换为纯文本

就纯文本复制粘贴操作而言,本附录是规范性的

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

附录 C: 默认 UA 样式表

本附录是信息性的, 旨在帮助 UA 开发者为 HTML 实现默认样式表, 但 UA 开发者可以视情况自由忽略或修改。

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

/* 避免悬挂标点继承到预格式化块中 */
pre { hanging-punctuation: none; }

附录 D: 文字体系与间距

本附录是规范性的。

排版行为会因语言而有所不同, 但会因书写系统而有很大差异。 本附录按照两端对齐和间距行为, 对 Unicode 6.0 中的一些常见文字进行分类。 类别描述是描述性的,而非规定性的; 决定因素是两端对齐机会的优先级排序。

块状文字
CJK 以及扩展意义上的所有 Wide 字符 (见 东亚宽度 [UAX11])。 包括以下 Unicode 文字: Bopomofo、Han、Hangul、Hiragana、Katakana 和 Yi。 具有东亚宽度属性 WideFullwidth 的字符也包括在内, 但 Ambiguous 字符只有在书写系统中文韩文日文时 才包括在内。
聚簇 文字
聚簇文字具有离散单元, 并且只在词边界处断开, 但不使用可见词分隔符。 它们优先拉伸空格, 但也可以自然地接受字符间间距用于两端对齐。 聚簇文字包括但不限于 以下 Unicode 文字: Khmer、 Lao、 Myanmar、 New Tai Lue、 Tai Le、 Tai Tham、 Tai Viet、 Thai
草书体文字
草书体文字不允许 在其字母之间为两端对齐或 letter-spacing 引入间隙。 包括以下 Unicode 文字: Arabic、 Hanifi Rohingya、 Mandaic、 Mongolian、 N’Ko、 Phags Pa、 Syriac

注: 具有基线连接线的印度系文字 (例如 Devanagari 和 Gujarati) 被视为草书体文字, 并且允许排版字符单元之间 存在此类间隙。 见 印度文字布局需求[ILREQ]

用户代理在更新其 Unicode 支持时, 应更新此列表, 以处理未来 Unicode 版本中尚未编码的草书体文字, 并鼓励它们请求 CSSWG 相应更新本规范。

附录 E: 字符与属性

本附录是规范性的。

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

东亚 宽度属性
定义于 Unicode 标准附录 #11 [UAX11],并在 Unicode 字符数据库 中以 East_Asian_Width 属性给出。 [UAX44]
通用类别
定义于 Unicode 标准附录 #44 [UAX44],并在 Unicode 字符数据库 中以 General_Category 属性给出。 [UAX44]
文字属性
定义于 Unicode 标准附录 #24 [UAX24],并在 Unicode 字符数据库 中以 Script 属性给出。 [UAX44]。 (UA 必须在此映射中包含任何 ScriptExtensions.txt 分配。)
竖排方向
定义于 Unicode 标准附录 #50 [UAX50], 作为 Unicode 字符数据库 中的 Vertical_Orientation 属性。 [UAX44]

Unicode 为各个码位定义属性, 但有时需要确定 排版字符单元的属性。 就 CSS Text 而言, 排版字符单元的属性 由其第一个字素簇的基础字符给出——但有两种例外:

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

本附录是规范性的。

虽然大多数语言都有首选的书写系统, 但有些语言有多个书写系统, 并且大多数语言也可以被转写为一种或多种外来书写系统。 一个常见例子是,大多数语言至少有一种拉丁转写, 因而可以用拉丁书写系统书写。 转写文本通常采用该书写系统的排版约定: 例如日语“romaji”和中文拼音使用拉丁字母和词间空格, 并相应遵循拉丁文字的断行和两端对齐实践。 另一个例子是历史上的表意文字韩语 (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 中的语言标签” 以及 “选择语言 标签”

当没有显式指明书写系统时, UA 应假定所声明内容 语言 最常见的书写系统, 以用于断行或两端对齐等语言敏感的排版行为。 然而,如果作者已显式声明不同的书写系统, UA 不得假定该书写系统。 如果 UA 对某种特定语言与书写系统组合 没有特定语言知识, 则它必须使用所声明书写系统的排版约定 (必要时可假定另一种语言的约定), 而不是使用所声明语言在假定书写系统中的约定, 后者对于所声明的书写系统是不合适的。

语言及其最常见书写系统之间的完整对应关系 超出本文档范围。 然而,用户代理必须至少做出以下假定:

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

变更

最近变更

2024 年 9 月候选推荐 草案以来, 已作出以下变更:

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"> 与其他规范性文本分开, 如下所示: UA 必须提供可访问的替代方案。

一致性类别

对本规范的一致性 定义为三个一致性类别:

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

如果一个样式表中所有使用本模块定义语法的语句, 都符合通用 CSS 语法 以及本模块中定义的每个特性的各自语法, 则该样式表符合本规范。

如果渲染器除了按照相应规范定义解释样式表之外, 还通过正确解析本规范定义的所有特性 并相应地渲染文档来支持这些特性, 则该渲染器符合本规范。 但是,UA 因设备限制而无法正确渲染文档, 并不会使该 UA 不符合规范。 (例如,并不要求 UA 在单色显示器上渲染颜色。)

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

部分实现

为了让作者能够利用向前兼容的解析规则 来分配回退值,CSS 渲染器必须 将任何其没有可用支持级别的 at 规则、属性、属性值、关键字 和其他语法结构视为无效(并按适当方式忽略)。 特别是,用户代理不得在单个多值属性声明中 选择性地忽略不支持的组件值并采用受支持的值: 如果任何值被认为无效 (不支持的值必须如此),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. 向公众开放。该实现可以是已发布产品 或其他公开可用版本 (即 beta 版本、预览版本或“nightly build”)。 非发布产品版本必须已实现该特性至少一个月, 以证明其稳定性。
  3. 不是实验性的 (即,不是专门设计用于通过测试套件、 且不打算供正常使用的版本)。

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

索引

本规范定义的术语

由引用定义的术语

参考文献

规范性参考文献

[CSS-BACKGROUNDS-3]
Elika Etemad; Brad Kemper. CSS 背景与边框模块第 3 级. 2024 年 3 月 11 日. CRD. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-BOX-4]
Elika Etemad. CSS 盒模型模块第 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 层叠与继承第 5 级. 2022 年 1 月 13 日. CR. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-DISPLAY-3]
Elika Etemad; Tab Atkins Jr.. CSS 显示模块第 3 级. 2023 年 3 月 30 日. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-DISPLAY-4]
Elika Etemad; Tab Atkins Jr.. CSS 显示模块第 4 级. 2025 年 11 月 6 日. WD. URL: https://www.w3.org/TR/css-display-4/
[CSS-FONTS-3]
John Daggett; Myles Maxfield; Chris Lilley. CSS 字体 模块第 3 级. 2018 年 9 月 20 日. REC. URL: https://www.w3.org/TR/css-fonts-3/
[CSS-FONTS-4]
Chris Lilley. CSS 字体模块第 4 级. 2026 年 4 月 22 日. WD. URL: https://www.w3.org/TR/css-fonts-4/
[CSS-INLINE-3]
Elika Etemad. CSS 内联布局模块第 3 级. 2024 年 12 月 18 日. WD. URL: https://www.w3.org/TR/css-inline-3/
[CSS-OVERFLOW-3]
Elika Etemad; Florian Rivoal. CSS 溢出模块 第 3 级. 2025 年 10 月 7 日. WD. URL: https://www.w3.org/TR/css-overflow-3/
[CSS-PSEUDO-4]
Elika Etemad; Alan Stearns. CSS 伪元素模块 第 4 级. 2025 年 6 月 27 日. WD. URL: https://www.w3.org/TR/css-pseudo-4/
[CSS-RUBY-1]
Elika Etemad; et al. CSS Ruby 注音布局模块 第 1 级. 2022 年 12 月 31 日. WD. URL: https://www.w3.org/TR/css-ruby-1/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS 盒尺寸模块 第 3 级. 2021 年 12 月 17 日. WD. URL: https://www.w3.org/TR/css-sizing-3/
[CSS-TEXT-4]
Elika Etemad; et al. CSS 文本模块第 4 级. 2024 年 5 月 29 日. WD. URL: https://www.w3.org/TR/css-text-4/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS 值与单位 模块第 3 级. 2024 年 3 月 22 日. CRD. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 值与单位 模块第 4 级. 2024 年 3 月 12 日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-3]
Elika Etemad; Koji Ishii. CSS 书写模式第 3 级. 2019 年 12 月 10 日. REC. URL: https://www.w3.org/TR/css-writing-modes-3/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS 书写模式第 4 级. 2019 年 7 月 30 日. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS2]
Bert Bos; et al. 层叠样式表第 2 级修订版 1(CSS 2.1)规范. 2011 年 6 月 7 日. REC. URL: https://www.w3.org/TR/CSS2/
[CSSOM-1]
Daniel Glazman; Emilio Cobos Álvarez. CSS 对象模型 (CSSOM). 2021 年 8 月 26 日. WD. URL: https://www.w3.org/TR/cssom-1/
[HTML]
Anne van Kesteren; et al. HTML 标准. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 标准. Living Standard. URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner. RFC 中用于表示要求级别的关键词. 1997 年 3 月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[UAX11]
Ken Lunde 小林剣. 东亚 宽度. 2025 年 7 月 24 日. Unicode 标准附录 #11. URL: https://www.unicode.org/reports/tr11/tr11-44.html
[UAX14]
Robin Leroy. Unicode 断行 算法. 2025 年 9 月 5 日. Unicode 标准附录 #14. URL: https://www.unicode.org/reports/tr14/tr14-55.html
[UAX24]
Ken Whistler. Unicode 文字 属性. 2025 年 7 月 31 日. Unicode 标准附录 #24. URL: https://www.unicode.org/reports/tr24/tr24-39.html
[UAX29]
Josh Hadley. Unicode 文本 分段. 2025 年 8 月 17 日. Unicode 标准附录 #29. URL: https://www.unicode.org/reports/tr29/tr29-47.html
[UAX44]
Ken Whistler. Unicode 字符 数据库. 2025 年 8 月 27 日. Unicode 标准附录 #44. URL: https://www.unicode.org/reports/tr44/tr44-36.html
[UAX50]
Ken Lunde 小林剣; Koji Ishii 石井宏治. Unicode 竖排文本布局. 2025 年 7 月 24 日. Unicode 标准附录 #50. URL: https://www.unicode.org/reports/tr50/tr50-33.html
[UAX9]
Manish Goregaokar मनीष गोरेगांवकर; Robin Leroy. Unicode 双向算法. 2025 年 8 月 13 日. Unicode 标准附录 #9. URL: https://www.unicode.org/reports/tr9/tr9-51.html
[UNICODE]
Unicode 标准. URL: https://www.unicode.org/versions/latest/

非规范性参考文献

[BCP47]
A. Phillips, Ed.; M. Davis, Ed.. 用于识别语言的标签. 2009 年 9 月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc5646
[CLREQ]
Fuqiao Xue; Richard Ishida. 中文文本 布局需求 - 中文排版需求. 2026 年 5 月 3 日. DNOTE. URL: https://www.w3.org/TR/clreq/
[CSS-TEXT-DECOR-3]
Elika Etemad; Koji Ishii. CSS 文本装饰模块 第 3 级. 2022 年 5 月 5 日. CRD. URL: https://www.w3.org/TR/css-text-decor-3/
[DOM]
Anne van Kesteren. DOM 标准. Living Standard. URL: https://dom.spec.whatwg.org/
[ILREQ]
Swaran Lata. 印度文字布局需求. 2020 年 5 月 29 日. WD. URL: https://www.w3.org/TR/ilreq/
[ISO15924]
文字名称表示代码。. 1998. ISO 15924:1998. Draft International Standard.
[JIS4051]
日本文档格式化规则(日本語文書の組版方法)。. 2004. JIS X 4051:2004. 日文。
[JLREQ]
Hiroyuki Chiba; et al. 日文文本布局需求 日本語組版処理の要件(日本語版). 2020 年 8 月 11 日. NOTE. URL: https://www.w3.org/TR/jlreq/
[JUSTIFY]
Elika Etemad; Richard Ishida. 全两端对齐的方法. URL: https://www.w3.org/International/articles/typography/justification
[RFC6919]
R. Barnes; S. Kent; E. Rescorla. RFC 中用于表示要求级别的更多关键词. 2013 年 4 月 1 日. Experimental. URL: https://www.rfc-editor.org/rfc/rfc6919
[TYPOGRAPHY]
Richard Ishida. 语言支持索引. 2024 年 11 月 15 日. DNOTE. URL: https://www.w3.org/TR/typography/
[XML10]
Tim Bray; et al. 可扩展标记语言(XML)1.0(第五 版). 2008 年 11 月 26 日. REC. URL: https://www.w3.org/TR/xml/
[ZHMARK]
标点符号用法(《标点符号用法》)。. 2011. GB/T 15834―2011. 中文。

属性索引

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