1. 引言
本模块描述了CSS的排版控制; 即CSS中控制从源文本到格式化、换行文本的转换功能。 各种CSS属性提供了对大小写转换、空白折叠、文本换行、换行规则和连字符、对齐和两端对齐、间距、 以及缩进的控制。
用于文本装饰的功能, 例如下划线、着重号、 以及阴影, (以前是本模块的一部分) 现已在CSS 文本装饰模块中描述。[CSS-TEXT-DECOR-3]
关于全球不同语言和书写系统的排版要求的更多信息, 可以在国际化工作组的语言启用索引中找到。[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
而非ko
(ko-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的范围。
- 在一些书写系统中,如缅甸文或天城文, 用于对齐和换行的排版字符单位是整个音节, 它可以包括多个Unicode书写单位集群。[UAX29]
-
在其他书写系统中,如泰文或老挝文,
尽管对于换行来说,排版字符符合Unicode的默认书写单位集群,
但对于字母间距,相关单位
小于Unicode 书写单位集群,
可能需要分解或其他替换
以插入字母间距。[UAX29]
例如, 为了正确地为泰文字词 คำ (U+0E04 + U+0E33) 插入字母间距, U+0E33需要分解为U+0E4D + U+0E32, 然后在U+0E32前插入额外的字母间距:คํ า。
一个稍微复杂的例子是 น้ำ (U+0E19 + U+0E49 + U+0E33)。 在这种情况下,正常的泰文成形首先将U+0E33分解为U+0E4D + U+0E32, 然后将U+0E4D与U+0E49交换,得到U+0E19 + U+0E4D + U+0E49 + U+0E32。 同样地,额外的字母间距将在U+0E32前插入:นํ้ า。
- 垂直排版也可能需要调整。 例如,在排版直排文本时, 藏文的tsek和shad符号与前面的书写单位集群保持在一起, 而不是作为独立的排版字符单位处理。[CSS-WRITING-MODES-4]
排版字母单位(或本规范中的字母) 是属于字母或数字通用类别之一的排版字符单位。 请参阅附录E: 字符与属性了解如何确定Unicode的排版字符单位的属性。
跨元素边界分割的排版字符单位的渲染特性是未定义的。 理想情况下,每个组件应根据其各自元素的属性要求进行渲染 同时保持整体上排版字符单位的正确成形和定位。 然而,根据其部分之间格式差异的性质 以及所使用字体技术的能力, 这并不总是可行的。 因此,这样的排版字符单位可能被渲染为属于边界的任一侧, 或者被近似为同时属于两者。 在此警告作者,将书写单位集群或连字分割到元素边界可能会产生不一致或不理想的结果。
1.5. 文本处理
CSS建立在Unicode之上。[UNICODE]支持Unicode的UA必须遵守Unicode核心标准的所有规范要求, 除非CSS明确覆盖。 基于非Unicode文本编码模型实现的UA仍然需要 通过假设适当的映射和类似的行为来满足相同的文本处理要求。
为了确定文本处理中的邻接性 (例如空白处理、文本转换、换行等), 因此在本规范中一般情况下, 必须忽略中间的行内框边界和脱离文档流 元素。 但就文本成形而言,请参阅§ 7.3 跨元素边界的成形。
2. 文本转换
2.1. 大小写转换:text-transform 属性
名称: | text-transform |
---|---|
值: | none | [capitalize | uppercase | lowercase ] || full-width || full-size-kana |
初始值: | none |
适用对象: | 文本 |
是否继承: | 是 |
百分比: | 不适用 |
计算值: | 指定的关键字 |
规范顺序: | 不适用 |
动画类型: | 离散 |
此属性用于样式化目的转换文本。 它不会影响基础内容, 也不得影响纯文本复制和粘贴操作的内容。
作者不得依赖text-transform来表达语义; 而应在源文档文本和标记中正确编码大小写和语义。
值的含义如下:
- none
- 无效果。
- capitalize
- 将每个单词的首个排版字母单位(如果是小写)转换为标题大小写; 其他字符不受影响。
- uppercase
- 将所有字母转换为大写。
- lowercase
- 将所有字母转换为小写。
- full-width
- 将所有排版字符单位转换为全角形式。 如果字符没有对应的全角形式, 则保持原样。 该值通常用于将拉丁字母和数字排版为像表意字符一样的形式。
- full-size-kana
- 将所有小假名 字符转换为等效的全角假名。 该值通常用于注音标注文本, 当作者希望所有小假名显示为大假名时, 以弥补注音中小字体尺寸通常引起的可读性问题。
注意: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中的特定语言规则。
全角和半角形式的定义
可以在Unicode 标准附件 #11:东亚字符宽度中找到。[UAX11] 到全角形式的映射是通过
在Unicode 标准附件 #44:Unicode 字符数据库中,取其
Decomposition_Mapping
中带有 <wide>
或 <narrow>
标签的代码点来定义的。[UAX44] 对于
<narrow>
标签,
映射是从代码点到分解形式
(减去 <narrow>
标签),
而对于 <wide>
标签,
映射是从分解形式
(减去 <wide>
标签)
回到原始代码点。
小假名到全角假名的映射定义在附录 G: 小假名映射中。
2.1.2. 操作顺序
当指定多个值 因此需要应用多个转换时, 它们按以下顺序应用:
文本转换发生在§ 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-START
和RECORD-END
标记。
对于CSS处理,
每个由文档语言定义的“段落中断”或“换行符
序列”——如果未定义,则每个换行符(U+000A)——
对于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])
然而,当使用转义序列(
)进行编码时,该字符会被保留——并且上述规则可观察到。
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]),
就好像它们不存在一样:
- 如果white-space设置为normal、nowrap或pre-line,空白字符被视为可折叠,并按照以下步骤处理:
- 如果white-space设置为pre、pre-wrap或break-spaces, 则任何空格序列都被视为非换行空格序列。 然而,对于pre-wrap, 在一系列空格和/或制表符之后存在软换行机会, 而对于break-spaces, 每个空格和每个制表符之后存在 软换行机会。
<ltr>A <rtl> B </rtl> C</ltr>
其中<ltr>
元素表示从左到右的嵌入,
而<rtl>
元素表示从右到左的嵌入。
如果white-space属性设置为normal,
空白处理模型将产生以下结果:
这将留下两个空格, 一个在从左到右嵌入级别的A之后, 另一个在从右到左嵌入级别的B之后。 文本将根据Unicode双向算法进行排序, 最终结果是:
A BC
请注意,A和B之间将有两个空格, 而B和C之间没有空格。 最好将空格放在元素外部而不是只放在起始和结束标签内, 并且在可行的情况下, 依靠隐式的双向性而不是显式的嵌入级别。
4.1.2. 第二阶段:修剪与定位
然后,整个块被渲染。 行内元素根据双向重排的要求进行布局, 并根据换行规则和white-space属性进行布局。 当每一行布局时,
- 移除一行开头的一系列可折叠空格。
-
如果制表符大小为零,保留
的制表符不会被渲染。
否则,每个保留的制表符将被渲染为一个水平位移,
使下一个字符的起始边与下一个制表符停止位置对齐。
如果这个距离小于0.5ch,
则使用下一个制表符停止位置。制表符停止位置
出现在距离起始内容边缘的多个制表符大小的点
处,该点来自最近的块容器祖先。
制表符大小由tab-size
属性决定。
注意: 请参阅Unicode 关于制表符(U+0009)与双向性交互的规则。[UAX9]
-
移除一行末尾的一系列可折叠空格,
以及任何后置的U+1680 OGHAM空格标记,
其white-space属性为normal,nowrap或pre-line。
注意: 根据Unicode双向算法规则L1, 在双向重排之前位于行尾的一系列可折叠空格, 在重排后仍将位于行尾。[UAX9][CSS-WRITING-MODES-4]
-
如果在行末(经过双向重排之后[CSS-WRITING-MODES-4])仍然存在一系列空白字符、其他空白分隔符和/或保留的制表符:
- 如果white-space设置为normal、nowrap 或pre-line, UA必须无条件悬挂这一系列字符。
-
如果white-space设置为pre-wrap,
UA必须无条件悬挂这一系列字符,
除非该序列后面跟有强制换行,
在这种情况下,必须有条件地悬挂该序列。
UA还可以选择性地视觉折叠任何会导致溢出的字符进度宽度。
注意: 悬挂空白字符而不是折叠它们 允许用户在选择或编辑文本时看到这些空格。
-
如果white-space设置为break-spaces,空格、制表符和其他空白分隔符与其他可见字符相同处理:
它们不能悬挂,也不能折叠它们的进度宽度。
注意: 因此这些字符将占据空间, 并根据可用空间和适用的换行控制规则,要么溢出,要么导致换行。
p {
white-space : pre-wrap;
width : 5 ch ;
border : solid 1 px ;
font-family : monospace;
text-align : center;
}
< p > 0</ p >
上述示例的渲染结果如下:
由于最后的空格位于强制换行之前且没有溢出,因此它不会悬挂,且居中效果如预期。
p {
white-space : pre-wrap;
width : 3 ch ;
border : solid 1 px ;
font-family : monospace;
}
< p > 0 0 0 0</ p >
上述示例的渲染结果如下:
0 0
0
如果添加了p
,结果如下:
0 0
0
由于行尾无强制换行的保留空格必须悬挂, 因此在进行文本对齐时,这些空格不会被考虑。 当向末尾对齐时,意味着这些空格会溢出,并且不会阻止行中剩余内容与行边缘对齐。 另一方面,行尾有强制换行的保留空格会条件性悬挂。 在此示例中,由于最后一行的空格没有溢出,因此它不会悬挂,因此在进行文本对齐时会被考虑。
p {
white-space : pre-wrap;
width : 3 ch ;
border : solid 1 px ;
font-family : monospace;
}
< p > 0 0 0 0</ p >
0 0
最后一行在最后一个0
之前没有换行,因为条件性悬挂的字符在测量行内容是否合适时不会被考虑。
4.1.3. 段落中断转换规则
当 white-space 设置为 pre, pre-wrap, break-spaces, 或者 pre-line,段落中断不会被视为 可折叠的,而是被转换为保留的换行符 (U+000A)。
对于其他 white-space 值,段落中断是 可折叠的,并按照以下规则折叠:
- 首先,任何紧接在另一个可折叠 段落中断之后的可折叠 段落中断都会被移除。
- 然后,剩余的 段落中断要么被转换为空格 (U+0020), 要么被移除,具体取决于段落中断前后的上下文。 此操作的规则在此级别中由 UA 定义。
Here is an English paragraph that is broken into multiple lines in the source code so that it can be more easily read and edited in a text editor.
这是一个英文段落,在源代码中被分成了多行以便在文本编辑器中更易于阅读和编辑。
在没有单词分隔符的语言中,比如中文,“消除”换行符需要直接将两行文本连接起来,中间不加空格。
這個段落是那麼長,
在一行寫不行。最好
用三行寫。
這個段落是那麼長,在一行寫不行。最好用三行寫。
段落中断转换规则可以使用相邻上下文来将段落中断转换为空格或完全消除它。
注意: 历史上,HTML 和 CSS 无条件地将段落中断转换为空格, 这导致在像中文这样的语言中,无法在源代码中进行分段。因此 UA 需要在删除段落中断时谨慎行事,即便他们试图改善对这类语言的支持。
4.2. Tab字符大小: tab-size属性
名称: | tab-size |
---|---|
值: | <数字 [0,∞]> | <长度 [0,∞]> |
初始值: | 8 |
适用于: | 文本 |
是否继承: | 是 |
百分比: | 不适用 |
计算值: | 指定的数值或绝对长度 |
标准顺序: | 不适用 |
动画类型: | 按计算值类型 |
该属性决定渲染保留的Tab字符 (U+0009) 的tab大小。 <number>表示以最近的块容器祖先的空格字符 (U+0020) 的前进宽度的倍数为单位, 包括其关联的字母间距和单词间距。 不允许负值。
5. 换行和单词边界
当行内级内容被布局到行中时,它会被分割成多个行框。这种断行称为换行。 当由于明确的换行控制(例如保留的换行符)或块的开始或结束导致换行时,它被称为强制换行。 当由于内容的换行(即UA在不强制换行的情况下为了使内容适应行的宽度而创建换行时)换行时, 这种换行称为软换行。 将行内级内容分割成行的过程称为换行处理。
换行仅在允许的断点处进行,称为软换行机会。 当启用换行时(参见white-space),UA必须通过在软换行机会处换行(如果存在)来最小化行溢出的内容。
在大多数书写系统中,在没有连字符断字的情况下,软换行机会仅出现在单词边界处。许多此类系统使用空格或标点符号显式分隔单词, 软换行机会可以通过这些字符识别。 然而,诸如泰语、老挝语和高棉语等脚本并不使用空格或标点符号来分隔单词。虽然零宽空格(U+200B)可用作这些脚本中的显式单词分隔符,但这种做法并不常见。 因此,正确识别此类文本中的软换行机会需要词汇资源。
在其他一些书写系统中,软换行机会基于正字法音节边界,而不是单词边界。 一些此类系统,如爪哇文和巴厘文,类似于泰语和老挝语,需要分析文本以找到断行机会。 而在其他如中文(以及日文、彝文,有时也包括韩文)中,每个音节往往对应一个排版字母单元,因此换行习惯允许行在任意位置断行,除了某些字符组合之间。 此外,这些限制的严格程度随着排版风格而有所不同。
虽然CSS并未完全定义软换行机会的出现位置,但提供了一些控制以区分常见的变化:
- line-break属性允许选择不同程度的“严格性”来限制换行。
- word-break属性控制哪些类型的字母组合在一起形成不可分割的“单词”, 使CJK字符的行为像非CJK文本或反之亦然。
- hyphens属性控制是否允许自动连字符断字来打断使用连字符的脚本中的单词。
- overflow-wrap属性允许UA在否则会溢出的不可断开字符串中进行断行。
注: Unicode标准附录#14:Unicode换行算法为所有Unicode脚本定义了换行的基准行为,预计会进一步调整。 [UAX14] 更多关于换行习惯的信息可以在日本文本布局需求 [JLREQ]和 日本文档排版规则[JIS4051]中找到关于日文的资料,关于中文则可以参考 中文文本布局需求 [CLREQ]和 标点符号用法总则 [ZHMARK]。另请参见国际化工作组的语言支持索引,其中包含有关其他语言的更多信息。[TYPOGRAPHY]任何关于其他适当参考资料的建议将不胜感激。
5.1. 换行细节
在确定换行时:
- 换行和双向文本的交互由CSS书写模式4§ 2.4应用双向重排算法和Unicode双向算法(特别是UAX9§3.4已解析级别的重排)定义。 [CSS-WRITING-MODES-4] [UAX9]
- 保留的段落分隔符以及—无论white-space值如何—具有
BK
和NL
换行类的任何Unicode字符,必须被视为强制换行。 [UAX14]注: 这种强制换行的双向影响由Unicode双向算法定义。 [UAX9]
- 除非明确定义了其他情况
(例如line-break: anywhere或overflow-wrap: anywhere),
必须遵守Unicode换行类
WJ
、ZW
、GL
和ZWJ
的换行行为。 [UAX14] - 允许在标点符号处换行的用户代理,除了在使用它们的书写系统中作为单词分隔符的标点符号之外,应当优先考虑断点。 (例如,如果斜杠后的断点优先级低于空格,那么“check /etc”将永远不会在“/”和“e”之间断行。) 只要小心避免这种尴尬的断行,建议在适当的标点符号处允许断行,因为这会使边距看起来更加均匀,尤其是在窄幅度中。 用户代理可以使用包含块的宽度、文本的语言、line-break值等因素来确定优先级: CSS并未定义软换行机会的优先级。 然而,如果指定了word-break: break-all,则不期望优先考虑单词分隔符,因为此值明确要求换行行为不基于在单词分隔符处断行—并且在line-break: anywhere下是禁止的。
- 脱离文档流的元素和内联元素边界不会在流中引入强制换行或软换行机会。
- 为了Web兼容性,每个替换元素或其他原子内联前后都有软换行机会,即使在与通常抑制它们的字符相邻时,包括U+00A0不换行空格。 然而,除了U+00A0不换行空格之外,软换行机会不能出现在原子内联与相邻属于Unicode GL、WJ或ZWJ换行类的字符之间。 [UAX14]
- 对于由换行时消失的字符(例如 U+0020 空格)创建的软换行机会, 直接包含该字符的框上的属性控制该机会处的换行。 对于由两个字符或原子内联元素之间的边界定义的软换行机会, 两个字符最近的共同祖先上的 white-space 属性控制换行; 在级别 3 中,哪些元素的 line-break、word-break 和 overflow-wrap 属性控制此类边界处软换行机会的确定是未定义的。
- 对于出现在框的第一个字符之前或最后一个字符之后的软换行机会,换行发生在框的边距边缘之前/之后,而不是在内容边缘和内容之间打破框。
- Ruby内和周围的换行在CSS Ruby注释布局1§ 3.4跨行换行中定义。 [CSS-RUBY-1]
-
为了避免意外溢出,如果用户代理无法执行所需的词汇或正字法分析来对需要此分析的内容语言进行换行—例如由于缺少某些语言的词典—它必须假设该书写系统中一对排版字母单元之间存在软换行机会。
注: 仅当用户代理未能在特定文本段中找到单词边界时,此规定才会被触发; 文本段很可能是一个不可分割的单词。 例如,当文本段由高棉字符(U+1780到U+17FF)组成时,如果用户代理不知道如何确定高棉语中的单词边界,该规定适用。
5.2. 字母断行规则:word-break 属性
名称: | word-break |
---|---|
值: | normal | keep-all | break-all | break-word |
初始值: | normal |
应用于: | 文本 |
是否继承: | 是 |
百分比: | 不适用 |
计算值: | 指定的关键词 |
规范顺序: | 不适用 |
动画类型: | 离散 |
此属性指定字母之间的软换行机会,
即允许断行的位置。
它具体控制在相邻的排版字母单元之间是否通常存在软换行机会,
并将属于NU
、AL
、AI
或ID
的非字母排版字符单元视为此目的下的排版字母单元。[UAX14] 它不影响由
空白字符(以及
其他空白分隔符)
和标点符号周围的软换行机会。
(参见line-break控制标点符号和小假名的换行方式。)

另一个例子是,韩语有两种换行风格: 在任意两个韩文字节之间换行(word-break: normal), 或像英语一样,主要在空格处断行(word-break: keep-all)。
각 줄의 마지막에 한글이 올 때 줄 나눔 기 준을 “글자” 또는 “어절” 단위로 한다.
각 줄의 마지막에 한글이 올 때 줄 나눔 기준을 “글자” 또는 “어절” 단위로 한다.
类似地,埃塞俄比亚语也有两种换行风格, 或者仅在单词分隔符处断行(word-break: normal), 或允许在单词内部的字母之间断行(word-break: break-all)。
ተወልዱ፡ኵሉ፡ሰብእ፡ግዑዛን፡ወዕሩያን፡ በማዕረግ፡ወብሕግ።ቦሙ፡ኅሊና፡ወዐቅል፡ ወይትጌበሩ፡አሐዱ፡ምስለ፡አሀዱ፡ በመንፈሰ፡እኍና።
ተወልዱ፡ኵሉ፡ሰብእ፡ግዑዛን፡ወዕሩያን፡በማ ዕረግ፡ወብሕግ።ቦሙ፡ኅሊና፡ወዐቅል፡ወይትጌ በሩ፡አሐዱ፡ምስለ፡አሀዱ፡በመንፈሰ፡እኍና።
注: 仅在发生溢出时启用额外的断行机会, 参见overflow-wrap。
这些值的含义如下:
- normal
- 单词根据其惯用规则断行, 如上文所述。 韩语通常表现为两种不同的行为, 允许在任何两个连续的韩文字节之间断行。 对于埃塞俄比亚语,它也表现为两种不同的行为, 单词内部不允许这种断行。
- break-all
-
允许在“单词”内断行:
具体来说,
除了正常的软换行机会之外,
任何排版字母单元(以及解析为
NU
(数字)、AL
(字母)或SA
(东南亚)换行类别的任何排版字符单元) 都被视为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·و·کمی·خط·عربی·และ·ตัวอย่าง·การเขียน·ภาษาไทย·በጽሑፍ፡·ማራዘሙን፡·አንዳንድ፡
当允许诸如阿拉伯语等形状化脚本在单词内部断行时, 字符仍然必须按未断开的方式进行形状化 (参见§ 5.6 跨单词内部断行的形状化)。
为了与旧内容兼容, word-break 属性还支持一个已弃用的 break-word 关键字。 指定后,其效果与 word-break: normal 和 overflow-wrap: anywhere 相同, 而不管 overflow-wrap 属性的实际值如何。
5.3. 换行严格度:line-break 属性
名称: | line-break |
---|---|
值: | auto | loose | normal | strict | anywhere |
初始值: | auto |
应用于: | 文本 |
是否继承: | 是 |
百分比: | 不适用 |
计算值: | 指定的关键字 |
规范顺序: | 不适用 |
动画类型: | 离散 |
该属性指定元素内应用的换行规则严格度: 特别是换行与标点符号及符号的交互。 各值的含义如下:
- auto
- 用户代理确定使用的换行规则集,并可以根据行的长度来调整换行限制;例如,在短行上使用较少限制的换行规则。
- loose
- 使用最少限制的换行规则来换行。通常用于短行,如报纸中的文章。
- normal
- 使用最常见的换行规则进行文本换行。
- strict
- 使用最严格的换行规则进行文本换行。
- anywhere
-
每个软换行机会都在每个印刷字符单元周围存在,
包括标点符号和保留空白字符,
或在单词中间,
不顾及任何禁止换行的规定,
即使是由具有
GL
、WJ
或ZWJ
换行类别的字符引入的禁止换行, 或由word-break属性强制的换行。[UAX14] 不优先考虑不同的换行机会。 不应用连字符。注意: 该值触发的换行规则通常见于终端窗口。
注意:anywhere仅允许行尾的保留空白字符 换行至下一行 当white-space被设置为break-spaces时, 因为在其他情况下:当对保留空白字符有效时, 使用white-space: break-spaces, 它允许在序列的第一个空格之前换行, 而break-spaces本身不允许此操作。
CSS 在文本换行规则中区分了四个严格级别。 loose、normal 和 strict 各自生效的精确规则集取决于用户代理 (UA) 并且应遵循语言约定。 但是,对于这三个关键字,本规范确实要求:
-
以下换行在strict中被禁止,
而在normal和loose中被允许:
- 在日文小假名或片假名-平假名长音符号之前换行,
即Unicode换行类别中的
CJ
类字符。[UAX14]
- 在日文小假名或片假名-平假名长音符号之前换行,
即Unicode换行类别中的
-
以下换行在normal和loose中允许
如果书写系统是中文或日文,
否则被禁止:
- 在某些CJK类连字符之前换行:
〜 U+301C, ゠ U+30A0
- 在某些CJK类连字符之前换行:
-
以下换行在loose中允许,
如果前面的字符属于Unicode换行类别
ID
[UAX14](包括当前面的字符 因word-break: break-all而被视为ID
时), 否则被禁止:- 在连字符之前换行:
‐ U+2010, – U+2013
- 在连字符之前换行:
-
以下换行在normal和strict中被禁止,
而在loose中被允许:
- 在迭代标记之前换行:
々 U+3005, 〻 U+303B, ゝ U+309D, ゞ U+309E, ヽ U+30FD, ヾ U+30FE - 在不可分割字符之间换行
(例如 ‥ U+2025, … U+2026)
即Unicode换行类别中的
IN
类字符。[UAX14]
- 在迭代标记之前换行:
- 以下换行在loose中允许, 如果书写系统 是中文或日文, 否则被禁止:
注意: 上述要求 仅在CJK文本中创建了区分。 在仅匹配上述规则且没有额外规则的实现中, line-break只会影响CJK代码点 除非书写系统被标记为中文或日文。 未来版本可能会为其他书写系统和语言 增加其他具体规则 以满足其需求。
注意: CSS工作组认识到在规范的未来版本中 可能需要更精细的换行控制 以满足高端出版需求。
5.4. 连字符: hyphens 属性
连字符是对单词进行受控拆分, 通常在不允许断开的地方进行拆分, 以改善段落的布局, 通常在音节或语素边界处拆分单词, 并且通常在视觉上指示拆分 (通常通过插入连字符 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 | |
维吾尔语 | |
|
|
克里语 | |
|
|
当行在有效的连字符机会处断开时,就会发生连字符, 这是一种软换行机会,存在于允许连字符的单词内。 在 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) 必须使用适合语言的连字符字符, 并且应应用任何适当的拼写更改, 就像在同一点进行自动连字符一样。
- auto
- 除了由条件连字符明确指示的连字符机会之外,还可以通过适合语言的连字符资源自动确定单词的断开位置。 如果单词包含条件连字符 (­ 或 U+00AD SOFT HYPHEN), 则必须忽略单词内其他地方的自动连字符机会, 而优先使用条件连字符。 但是,如果即使在这些机会处断开后, 该单词的某一部分仍然太长而无法容纳在一行中, 则可以使用自动连字符机会。
正确的自动连字符需要适合被断开文本语言的连字符资源。 因此,用户代理 (UA) 必须仅对已知内容语言 并且具有适当连字符资源的文本自动进行连字符处理。
用户代理 (UA) 可以使用针对特定语言的启发式方法 将某些单词排除在自动连字符之外。 例如,UA 可能会通过排除匹配某些大写和标点符号模式的单词 来避免在专有名词中使用连字符。 本规范未定义此类启发式方法。 (请注意,此类启发式方法需要因语言而异: 例如,英语和德语的大写约定就大不相同。)
对于 hyphens 属性而言, 构成“单词”的内容取决于用户代理 (UA)。 但是,在确定单词边界时, 必须忽略内联元素边界和流外元素。
在由条件连字符字符 (例如 U+00AD SOFT HYPHEN)创建的连字符机会处,由于连字符而显示的任何字形 都由该字符表示, 并根据应用于它的属性进行样式设置。
当允许阿拉伯文等成形文字由于连字符而在单词内断开时, 字符仍必须像单词未断开一样进行成形(参见§ 5.6 跨词内断点的成形)。
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-all,line-break: anywhere,overflow-wrap: break-word,overflow-wrap: anywhere或 连字符断字)断开时,字符必须保持其形状选择(连接形式)如同单词仍保持完整一样。
6. 对齐和分散
对齐和分散控制行内内容在行框中的分布。
6.1. 文本对齐: text-align 速记属性
名称: | text-align |
---|---|
值: | start | end | left | right | center | justify | match-parent | justify-all |
初始值: | start |
应用于: | 块级容器 |
继承属性: | 是 |
百分比: | 见各个属性 |
计算值: | 见各个属性 |
动画类型: | 离散的 |
规范顺序: | 不适用 |
这个 速记属性 设置了 text-align-all 和 text-align-last 属性,描述了如果内容未完全填充行框时,块的行内级内容如何沿行轴对齐。除了 justify-all 或 match-parent 之外的值分配给 text-align-all 并将 text-align-last 重置为 auto。
值有以下含义:
- start
- 行内级内容与行框的 起始 边对齐。
- end
- 行内级内容与行框的 结束 边对齐。
- left
- 行内级内容与行框的 左边 对齐。 (在垂直书写模式下,这可以是物理的顶部或底部,取决于 writing-mode.) [CSS-WRITING-MODES-4]
- right
- 行内级内容与行框的 右边 对齐。 (在垂直书写模式下,这可以是物理的顶部或底部,取决于 writing-mode.) [CSS-WRITING-MODES-4]
- center
- 行内级内容在行框中居中。
- justify
- 根据 text-justify 属性指定的方法对齐文本,以使行框完全填充。除非 text-align-last 另有规定,否则强制换行或块末尾之前的最后一行与 start 对齐。
- justify-all
- 将 text-align-all 和 text-align-last 都设置为 justify,强制最后一行也对齐。
- match-parent
-
该值的行为与 inherit 相同(计算为其父级的计算值),但如果继承值为 start 或 end,则根据父级的 方向 值进行解释,并得出 left 或 right 的计算值。指定在 start 时应用于 根元素。
当在 text-align 速记属性上指定时,同时设置 text-align-all 和 text-align-last 为 match-parent。
一段文本是由多个 行框 组成的堆栈。此属性指定每个行框内的行内级盒子如何相对于行框的起始和结束边对齐。对齐不是相对于 视口 或包含块。
对于 justify,UA 可以通过 调整 文本来拉伸或收缩任何行内盒子。(参见 text-justify。)如果元素的 空白 不可 折叠,则 UA 不需要调整其文本以进行对齐,并且可以将文本视为没有 对齐机会。如果 UA 选择调整文本,则必须确保 制表位 继续按照 空白处理规则 的要求对齐。
如果(在对齐之后,如果有的话)行框的行内内容太长,无法适应它,则内容将以 起始 对齐:任何不符合的内容将溢出行框的 结束 边。
有关如何确定行框的 起始 和 结束 边的详细信息,请参见 § 8.3 双向性与行框。
6.2. 默认文本对齐: text-align-all 属性
名称: | text-align-all |
---|---|
值: | start | end | left | right | center | justify | match-parent |
初始值: | start |
应用于: | 块级容器 |
继承属性: | 是 |
百分比: | 不适用 |
计算值: | 指定的关键字,除 match-parent 计算如上所述 |
规范顺序: | 不适用 |
动画类型: | 离散的 |
这个 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)形式和长尾形态来填充整行, 而下面的行稍微压缩了,通过使用 ت 和 م 之间字符的堆叠组合。 通过采用传统的书法技巧,排版员可以在保持流动性和色彩的同时对齐文本, 提供了非常高质量的对齐效果。然而, 这是一个非常特定于某种文字的效果。 混合脚本文本与 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-spacing 或 word-spacing 属性定义的间距之外的附加空间。 当这种附加空间分布到 词间隔符 对齐机会 时, 它适用与 word-spacing 相同的规则。 类似地,当空间分布到两个 排版字符单位 之间的 对齐机会 时, 应按照 letter-spacing 的相同规则应用。
对齐算法可以将 对齐机会 分为不同的优先级别。 给定级别内的所有 对齐机会 以相同的优先级进行扩展或压缩, 无论哪个 排版字符单位 创造了这个机会。 例如, 如果两个汉字之间的 对齐机会 和两个拉丁字母之间的对齐机会被定义为相同级别 (如在 inter-character 对齐样式中), 它们不会因为源自不同的 排版字符单位 而被区别对待。 在本级别中未定义其他因素(如字体大小、字母间距、字形形状、行内位置等)是否或如何影响 在行内分配给 对齐机会 的空间分布。
UA 可以启用或断开可选连字, 或使用其他字体特性, 如备用字形或字形压缩, 来帮助通过任何方法对齐文本。 此行为不受本级别的CSS控制。 然而, UA 不得 断开必需的连字 或以其他方式禁用正确形成功能复杂脚本所需的特性。
如果行内存在 对齐机会, 并且 文本对齐 为该行指定了完全对齐 (justify), 则必须对齐该行。
6.4.2. 处理符号和标点
在确定 对齐机会 时, 来自 Unicode 符号 (S*) 和标点 (P*) 类的 排版字符单位 通常被视为相同书写系统的 排版字母单位, 或者,如果字符的脚本属性为“通用” (Common), 则视为该段落中占主导地位的书写系统的 排版字母单位。
然而,根据排版传统, 可能会有额外的规则来控制符号和标点的对齐。 因此,UA 可能会重新分配特定字符 或引入额外的优先级别, 以处理涉及符号和标点的 对齐机会。
6.4.3. 不可扩展文本
如果一行的内联内容无法拉伸到行框的全宽, 那么它们必须按照 text-align-last 属性指定的方式对齐。 (如果 text-align-last 为 justify, 那么它们必须像 center 那样对齐。)
6.4.4. 连笔书写系统
对齐不得在如阿拉伯语等 连笔书写系统的 排版字母单位 之间引入空隙。 如果可能, UA 可以将分配到这些 排版字母单位 之间的 对齐机会 转换为某种形式的连笔延长。 否则,必须假设在 连笔书写系统中的任何 排版字母单位之间不存在 对齐机会 (无论它们是否连接)。
某些字体设计允许使用 tatweel 字符进行对齐。 执行基于 tatweel 对齐的 UA 必须正确处理其使用规则。 请注意,正确插入 tatweel 字符取决于上下文, 包括相关的字母组合、单词中的位置和单词在行中的位置。
6.4.5. auto 对齐的最低要求
对于 auto 对齐, 本规范未定义所有的 对齐机会, 它们的优先级如何, 或多个 对齐机会 级别何时以及如何交互。 然而,规范要求:
- 除非与 内容语言 或相邻符号/标点的排版传统相冲突, 否则以下每一项提供 对齐机会:
- 所有 字母 属于所有 块书写系统 被视为相同, 所有 字母 属于所有 集群书写系统 也被视为相同。 例如,不区分 汉字后面跟着另一个汉字的对齐机会, 和汉字后面跟着韩文字母的对齐机会。
有关文本对齐的更多信息可以在(或提交给)“全面对齐的方法”中找到, 按书写系统和语言编制索引, 由 W3C 国际化工作组 维护。 [JUSTIFY]
7. 间距
CSS 提供了通过 word-spacing 和 letter-spacing 属性控制文本间距的能力, 它们分别指定了围绕 词间隔符 或 排版字符单位 之间的额外空间。
7.1. 词间距: word-spacing 属性
名称: | word-spacing |
---|---|
值: | normal | <长度> |
初始值: | 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 : 1 em ; }
< p > abc</ p >
a b c
a b c
因此,UA 确实不应在行的右侧或尾部添加字距调整:[RFC6919]
a b c
两个排版字符单位之间的字距调整实际上“属于” 包含这两个 排版字符单位 的最内层元素: 两个相邻的 排版字符单位 之间的总字距调整(双向重排序后) 由包含两者之间边界的最内层元素指定并渲染。 然而,UA 可以将字距调整附加到元素边界上的其中一个或另一个 排版字符单位,并使用其包含元素的字距调整值。
注意: 由于 Web 兼容性问题,本级别允许此二级行为。
p{ letter-spacing : 1 em ; }
< p > a< span > bb</ span > c</ p >
a b b c
a b b c
因此,指定的 letter-spacing 预期仅影响该元素中完全包含的字符之间的间距:
p{ letter-spacing : 1 em ; } span{ letter-spacing : 2 em ; }
< p > a< span > bb</ span > c</ p >
a b b c
这进一步意味着,将letter-spacing 应用于仅包含单个字符的元素 对渲染结果没有影响:
p{ letter-spacing : 1 em ; }
< p > a< span > b</ span > c</ p >
a b c
由于字距调整是在 RTL 重排序之后 插入的, 因此应用于下面内联 span 的字距调整也没有效果, 因为重排序后,“c”不会与“א”相邻:
p{ letter-spacing : 1 em ; }
<!-- abc 后跟希伯来字母 alef (א)、bet (ב) 和 gimel (ג) --> <!-- 重排序将这些字母按逆序显示。 --> < p > ab< span > cא</ span > בג</ p >
a b c א ב ג
字距调整忽略不可见的零宽度格式字符 (如 Unicode Cf 类中的字符)。 必须像这些字符不存在一样添加间距。
当两个字符之间的有效间距不为零时 (由于 对齐 或 letter-spacing 的非零值), 用户代理不应应用可选连字, 即那些未定义为字形正确整形所必需的连字。 然而,通过低级 font-feature-settings 属性指定的连字和其他字体功能 优先于此规则。 参见 CSS Fonts Module Level 3 § feature-precedence。
注意: 在 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. 跨元素边界的整形
当以下任何条件为真时, 对于任何边界将两个 排版字符单位 分开的框, 必须在内联框边界处打断文本整形:
当格式没有有效变化时, 或者如果唯一的格式更改不影响字形 (如应用 文本装饰), 则不得跨内联框边界打断文本整形。
在其他情况下, 如果在字体技术的限制下是合理且可能的, 则不应跨内联框边界打断文本整形。
跨边界可能但不合理的整形示例 是处理对左右各 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-align 为 start,并且 text-indent 为 5em,在没有浮动的从左到右的文本中,第一行文本将从块的5em开始:
自CSS1起,就可以通过 将块元素的第一行缩进5em, 通过将 'text-indent' 属性设置为 '5em'。
如果我们添加 hanging 关键字, 那么第一行将从头开始, 但其他行将缩进 5em:
在CSS3中,我们可以将块元素的所有其他行 缩进5em, 通过设置 'text-indent' 属性为 'hanging 5em'。
例如,在此段落的中间是一个方程, 该方程居中对齐: 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 包含其他字符时 通知工作组这些添加内容。

p{ text-align : justify; hanging-punctuation : allow-end; }

p{ text-align : justify; hanging-punctuation : force-end; }
在 allow-end 中,第一行末尾的标点符号没有悬挂,因为它在不悬挂的情况下适合。 然而,如果使用 force-end,则标点符号被强制悬挂。 对齐测量行时,不包括悬挂标点符号。 因此,当行被扩展时,标点符号被推到行外。
8.3. 双向性和行框
行盒的开始边和结束边由行盒的内联基本方向决定。 尽管它们通常匹配, 但行盒的内联基本方向与包含块或双向段落的内联基本方向不同。 行盒的内联基本方向会影响 text-align-all、text-align-last、text-indent 和 hanging-punctuation——即其内容相对于其边缘的位置和对齐方式。 它不影响内联内容的格式化或排序 (这由 CSS 书写模式 [UAX9] [CSS-WRITING-MODES-4] 应用的 Unicode 双向算法 控制)。
在大多数情况下,行框的内联基线方向由其包含块 的计算方向决定。 然而, 如果其包含块具有unicode-bidi: plaintext [CSS-WRITING-MODES-4]:
- 如果行框所属的双向段落(即该行框所承载内容的 双向段落) 具有强方向性, 则行框的内联基线方向即为该方向。
- 如果行框为空 (即不包含任何原子内联或除换行符之外的字符), 或者它没有强方向性 (仅包含弱或中性字符), 则其内联基线方向取决于前一行框(如果有), 或者,如果这是包含块中的第一个行框, 则取自包含块的方向属性。 (这可能会导致具有 LTR 基线方向的 RTL 行框。)
<block>
是一个起始对齐的预格式化块
(display: block; white-space: pre; text-align: start),
每隔一行右对齐:
< block style = "unicode-bidi: plaintext" > français فارسی français فارسی français فارسی</ block >
< para style = "display: block; direction: rtl; unicode-bidi:plaintext" > “< quote style = "unicode-bidi:plaintext" > שלום!</ quote > ”, they said.</ para >
< textarea style = "direction: rtl; unicode-bidi:plaintext" > Hello!</ textarea >
由于 unicode-bidi: plaintext, “Hello!” 是从左到右排版的 (即感叹号位于右侧), 并左对齐, 忽略了包含块的 RTL 方向。 这使得其后的空行也是 LTR, 这意味着该行上的光标应出现在其左边缘。 然而,第一个空行是右对齐的: 因为没有前面的行, 它假设其包含块的 RTL 方向。
附录 A: 文本处理操作顺序
本附录为规范性内容。
以下列表定义了文本操作的顺序。 (只要生成的布局相同,实现方式不受此顺序的限制。)
- 空白字符处理 第一部分(换行前)
- 文本转换
- 文本合并 [CSS-WRITING-MODES-4]
- 文本方向 [CSS-WRITING-MODES-4]
- 文本换行 同时按行应用:
- 对齐(这可能会影响字形选择和/或文本换行,循环回到该步骤)
- 文本对齐
附录 B: 转换为纯文本
本附录是为了纯文本复制粘贴操作的规范性内容。
当 CSS 渲染的文档转换为纯文本格式时,预期以下内容:
附录 C: 默认用户代理样式表
本附录为信息性内容, 旨在帮助用户代理开发者实现 HTML 的默认样式表, 但用户代理开发者可以根据需要忽略或修改。
附录 D: 脚本和间距
本附录为规范性内容。
排版行为因语言有所不同,但由于书写系统的不同,差异很大。 本附录根据其对齐和间距行为,对 Unicode 6.0 中的一些常见 脚本 进行了分类。 分类描述是描述性的,而非规定性的; 决定因素是 对齐机会 的优先级。
- 块状脚本
- CJK 以及扩展的所有宽字符
(参见 东亚宽度 [UAX11])。
以下 Unicode 脚本 包括:
注音符号、汉字、韩文、平假名、片假名和彝文。
东亚宽度属性 为
Wide
和Fullwidth
的字符也包含在内, 但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 文本, 一个 排版字符单元 的属性由其第一个 字素簇 的基础字符给出——除了两种情况:
- 使用具有 Common 脚本的包围符号标记(
Me
) 形成的 字素簇 被视为其他符号(So
), 属于 Common 脚本。 它们被假定具有与替换字符 (U+FFFD) 相同的 Unicode 属性。 - 使用空格分隔符(
Zs
) 作为基础形成的 字素簇 被视为修饰符号(Sk
)。 它们被假定具有与基础相同的东亚宽度属性, 但其其他属性取自序列中的第一个组合字符。
附录 F: 识别内容书写系统
本附录为规范性内容。
虽然大多数语言都有首选的书写系统,
但有些语言有多个,
并且大多数语言还可以转录为一种或多种外来书写系统。
作为一个常见示例,大多数语言至少有一个拉丁文转录,
因此可以用拉丁文书写系统书写。
转录文本通常采用书写系统的排版约定:
例如日语“罗马字”和中文拼音使用拉丁字母和单词空格,
并因此遵循拉丁文的换行和对齐规则。
另一个示例是历史上的表意朝鲜文
(ko-Hani
),
不使用单词空格,
因此排版应该类似于中文,
而不是现代韩语。
在 HTML 或任何使用 文档语言 的系统中,
使用 BCP47 标签来标识语言,
以声明 内容语言,
作者可以通过脚本子标签来消除歧义或表示不常见的书写系统。[BCP47] 例如,
为了表示对某些不使用拉丁文的语言使用拉丁书写系统,
可以添加 -Latn
脚本子标签,
例如 ja-Latn
表示日语罗马字。
其他子标签也存在用于其他书写系统,
请参见 ISO 的 书写系统名称表示代码 和 ISO15924
脚本标签注册表。[ISO15924]
zh-Latn
- 中文,使用拉丁文转录。
ko-Hani
- 韩语,使用汉字(中国表意文字)。
tr-Arab
- 土耳其语,使用阿拉伯文书写系统。
mn-Cyrl
- 蒙古语,使用西里尔字母。
mn-Mong
- 蒙古语,使用传统蒙古文书写系统。
然而,对于与单一书写系统紧密相关的语言,
通常不会(事实上是被建议不使用)
使用 BCP47 脚本子标签:
如果没有指定其他书写系统,
该书写系统通常被隐含。[BCP47] IANA 通过 Suppress-Script
字段维护了一个数据库,
记录了各种语言最常用的书写系统,
该数据库位于 语言子标签注册表
中,
用于此目的。
注意:更多关于语言标签的建议可以在 国际化工作组 的 《HTML 和 XML 中的语言标签》 和 《选择语言标签》 中找到。
当没有明确指定书写系统时, 用户代理应假设已声明的 内容语言 的最常用书写系统,用于换行或对齐等语言敏感的排版行为。 然而,用户代理不得假设书写系统, 如果作者已明确声明了另一个书写系统。 如果用户代理对某种特定语言和书写系统组合没有特定的语言知识, 它必须使用声明的书写系统的排版规则 (如果有必要,可以假设另一种语言的规则), 而不是使用假设的书写系统的声明语言的规则, 因为这对声明的书写系统是不合适的。
本文件不涉及语言与其最常见书写系统之间的完整对应关系。 然而,用户代理必须至少假设以下内容:
- 如果 内容语言 是中文, 而 书写系统 未指定, 或对于任何 内容语言, 如果 书写系统 被指定为 Hant、Hans、Hani、Hanb 或 Bopo ISO 脚本代码之一, 那么 书写系统 是 中文。
- 如果 内容语言 是日语, 而 书写系统 未指定, 或对于任何 内容语言, 如果 书写系统 被指定为 Jpan、Hrkt、Hira 或 Kana ISO 脚本代码之一, 那么 书写系统 是 日语。
- 如果 内容语言 是韩语, 而 书写系统 未指定, 或对于任何 内容语言, 如果 书写系统 被指定为 Kore、Hang 或 Jamo ISO 脚本代码之一, 那么 书写系统 是 韩语。
- 仅当内容语言本身未知,或者明确指示书写系统未知时,书写系统才被视为未知。
附录 G: 小假名映射
本附录为规范性内容。
小假名 | 全尺寸假名 |
---|---|
ぁ U+3041 | あ U+3042 |
ぃ U+3043 | い U+3044 |
ぅ U+3045 | う U+3046 |
ぇ U+3047 | え U+3048 |
ぉ U+3049 | お U+304A |
ゕ U+3095 | か U+304B |
ゖ U+3096 | け U+3051 |
𛄲 U+1B132 | こ U+3053 |
っ U+3063 | つ U+3064 |
ゃ U+3083 | や U+3084 |
ゅ U+3085 | ゆ U+3086 |
ょ U+3087 | よ U+3088 |
ゎ U+308E | わ U+308F |
𛅐 U+1B150 | ゐ U+3090 |
𛅑 U+1B151 | ゑ U+3091 |
𛅒 U+1B152 | を U+3092 |
ァ U+30A1 | ア U+30A2 |
ィ U+30A3 | イ U+30A4 |
ゥ U+30A5 | ウ U+30A6 |
ェ U+30A7 | エ U+30A8 |
ォ U+30A9 | オ U+30AA |
ヵ U+30F5 | カ U+30AB |
ㇰ U+31F0 | ク U+30AF |
ヶ U+30F6 | ケ U+30B1 |
𛅕 U+1B155 | コ U+30B3 |
ㇱ U+31F1 | シ U+30B7 |
ㇲ U+31F2 | ス U+30B9 |
ッ U+30C3 | ツ U+30C4 |
ㇳ U+31F3 | ト U+30C8 |
ㇴ U+31F4 | ヌ U+30CC |
ㇵ U+31F5 | ハ U+30CF |
ㇶ U+31F6 | ヒ U+30D2 |
ㇷ U+31F7 | フ U+30D5 |
ㇸ U+31F8 | ヘ U+30D8 |
ㇹ U+31F9 | ホ U+30DB |
ㇺ U+31FA | ム U+30E0 |
ャ U+30E3 | ヤ U+30E4 |
ュ U+30E5 | ユ U+30E6 |
ョ U+30E7 | ヨ U+30E8 |
ㇻ U+31FB | ラ U+30E9 |
ㇼ U+31FC | リ U+30EA |
ㇽ U+31FD | ル U+30EB |
ㇾ U+31FE | レ U+30EC |
ㇿ U+31FF | ロ U+30ED |
ヮ U+30EE | ワ U+30EF |
𛅤 U+1B164 | ヰ U+30F0 |
𛅥 U+1B165 | ヱ U+30F1 |
𛅦 U+1B166 | ヲ U+30F2 |
𛅧 U+1B167 | ン U+30F3 |
ァ U+FF67 | ア U+FF71 |
ィ U+FF68 | イ U+FF72 |
ゥ U+FF69 | ウ U+FF73 |
ェ U+FF6A | エ U+FF74 |
ォ U+FF6B | オ U+FF75 |
ッ U+FF6F | ツ U+FF82 |
ャ U+FF6C | ヤ U+FF94 |
ュ U+FF6D | ユ U+FF95 |
ョ U+FF6E | ヨ U+FF96 |
隐私考量
本规范会泄露用户已安装的连字符和换行字典。
安全考量
本规范未引入任何新的安全考量。
鸣谢
本规范的完成离不开以下人员的帮助: Addison Phillips, Aharon Lanin, Alan Stearns, Ambrose Li, Arnold Schrijver, Arye Gittelman, Ayman Aldahleh, Ben Errez, Bert Bos, Chris Lilley, Chris Pratley, Chris Thrasher, Chris Wilson, Dave Hyatt, David Baron, Emilio Cobos Álvarez, Eric LeVine, Etan Wexler, Frank Tang, Håkon Wium Lie, IM Mincheol, Ian Hickson, James Clark, Javier Fernandez, John Daggett, Jonathan Kew, Ken Lunde, Laurie Anna Edlund, Marcin Sawicki, Martin Dürst, Martin Heijdra, Masafumi Yabe, Masayasu Ishikawa, Michael Jochimsen, Michel Suignard, Mike Bemford, Myles Maxfield, Nat McCully, Paul Nelson, Rahul Sonnad, Richard Ishida, Shinyu Murakami, Stephen Deach, Steve Zilles, Takao Suzuki, Tantek Çelik, Xidorn Quan, Yaniv Feinberg。
更改
最近更改
自 2023 年 9 月候选推荐草案以来,已进行以下规范性更改:
-
更正了 text-align-last 的计算值行。 (问题 7331)
-
消除替换元素周围软换行机会的歧义。 (问题 9964)
对于由两个字符或原子内联元素之间的边界定义的软换行机会 , 两个字符最近共同祖先上的 white-space 属性 控制换行;
自 2023 年 2 月候选推荐草案以来,已进行以下规范性更改。
-
更新附录G: 小假名映射至Unicode 15.0。 (问题 8442)
-
除 NBSP 外的不可定制 Unicode 换行控制优先于我们关于原子内联元素的规则。 (问题 8972)
为了 Web 兼容性,在每个替换元素或其他原子内联元素之前和之后都有一个软换行机会, 即使与通常会抑制它们的字符(
例如包括 U+00A0 NO-BREAK SPACE)相邻也是如此。 但是,除了 U+00A0 NO-BREAK SPACE 之外,原子内联元素与属于 Unicode GL、WJ 或 ZWJ 换行类的相邻字符之间不得有软换行机会。[UAX14]
以下是自2020年12月候选推荐标准以来所做的规范性更改。
-
允许 hanging-punctuation: first 悬挂 U+300 表意空格,以适应纯文本缩进习惯。 (问题 2462)
-
定义 distribute 计算为 inter-character,而不仅仅是行为相同; 允许将 distribute 实现为旧值别名, 因为这对某些引擎更容易,并且不影响兼容性。 (问题 6156, 问题 7322)
-
阐明特定语言的连字符规则也适用于显式连字符机会。 (问题 5973)
仅在单词内有字符明确建议连字符机会的地方才使用连字符连接单词。 用户代理 (UA) 必须使用适合语言的连字符字符, 并且应应用任何适当的拼写更改, 就像在同一点进行自动连字符一样。
-
定义根元素上的 match-parent 计算为 start,而不是根据主要书写模式进行计算。 (问题 6542)
-
将有关 text-transform 的创作建议设为规范性建议。 (问题 8279)
注意:text-transform 属性仅影响表示层; 出于语义目的的正确大小写应在源文档中表示。建议:作者不得依赖 text-transform 来实现语义目的; 而应在源文档文本和标记中编码正确的大小写和语义。
此外,还进行了若干小的编辑性修复。
较早更改
另请参阅较早的更改列表,涵盖了2020年和2019年工作草案在那之前的候选推荐版本,以及涵盖2013年至2020年之间所有评论的评论处理。