Web 排版:一行字怎么排布
一段文字交给浏览器,从「一串字符」变成「一块整齐的版面」,中间发生了一连串排版决策: 一行放不下了在哪儿折、长单词要不要断开、右边要不要对齐、靠拉哪里的空隙对齐、 行与行隔多远、字与字之间松紧,乃至竖排时字怎么转向。这些都由 CSS Text / Writing Modes 模块的一组属性掌管。本系列把它们逐个拆开,每页一块可拖宽度、可切参数的版心,用真实 getBoundingClientRect() 实测浏览器的实际排版结果。
十页覆盖排版全景,从空白折叠、折行一路讲到双向文本与分栏分页。每页都有一个「浏览器真实行为」实测点 —— 不少 CSS 值(如 text-justify: inter-character、hanging-punctuation)主流浏览器 并不实现,页面会当场测量并如实标注。前置知识:行盒(line box)与 inline 布局的基础概念, 可参考 inline-block 系列。正文用中文,属性 / 取值等关键词保持英文。
折行与断词:一行放不下了怎么办
软换行机会在哪、长单词撑破容器怎么办。white-space(normal / nowrap / pre / pre-wrap / pre-line / break-spaces)、overflow-wrap vs word-break vs line-break、连字符 hyphens、以及新的 text-wrap: balance / pretty(标题不再「孤字落单」)。
空白折叠:源码里的空格去哪儿了
连续空格、换行、Tab 在渲染时被「折叠」——规则由新两值属性 white-space-collapse(collapse / preserve / preserve-breaks / break-spaces)× text-wrap-mode(wrap / nowrap)掌管,老的 white-space 单值(normal / pre / pre-wrap / pre-line)如今只是它们的 shorthand。交互矩阵实测每种组合 + 映射表。
截断与省略:放不下的文字怎么收尾
单行 text-overflow: ellipsis 为什么必须配 overflow: hidden + white-space: nowrap 三件套(逐个开关验证缺一不可)、多行 -webkit-line-clamp 四件套配方,以及经典需求「一行居中、多行居左」的两个纯 CSS 方案对照。
两端对齐:把右边也对齐,靠「撑开空隙」
text-align: justify 靠拉宽行内空隙让右边界对齐——但拉哪里?西文拉词间空格(inter-word)、CJK 只能拉字与字之间(inter-character),这正是 text-justify 管的事。实测各值在主流浏览器的 真实支持、CJK 与西文的差异、最后一行 text-align-last,以及窄版心下「河流」空隙怎么来的。
行高与 leading:行与行隔多远
line-height 取数值 / 单位 / normal 的继承差异、leading 如何上下半分(half-leading)、首末行多出来的半行距、以及用新的 text-box-trim / text-box-edge 把行盒裁到字面框做精确垂直对齐。
字间距与缩进:松紧与首行
letter-spacing(tracking)与 word-spacing 的尺度、CJK 字间距、首行缩进 text-indent(含负缩进做 hanging indent)。和 font-features 系列的 tab-size / text-autospace 互为补充。
书写模式:把文字竖起来
writing-mode(horizontal-tb / vertical-rl / vertical-lr)让正文竖排,text-orientation(mixed / upright / sideways)管每个字转不转向,text-combine-upright 做「縦中横」(竖排里把两位数横过来)。古籍 / 日文排版的根基。
双向文本:RTL 混排时字符的视觉顺序
RTL 与 LTR 文字、数字混排时,浏览器按 Unicode Bidi Algorithm 把逻辑顺序重排成视觉顺序。direction、unicode-bidi(isolate / bidi-override / plaintext …)、HTML dir attribute 与 CSS 的覆盖关系,外加新属性 reading-flow 的现状。
标点与禁则:行首与行尾的规则
标点悬挂 hanging-punctuation(让句号挂到版心外让边界更齐)、全角 / 半角标点的取舍、CJK 标点挤压 text-spacing-trim、以及行首不能是逗号句号、行尾不能是开引号的避头尾禁则(line-break 的 strict / normal / loose)。
分栏与分页:内容在哪儿被切开
多栏 (columns) 与打印分页把内容流切进一个个 fragmentainer——break-before / break-after / break-inside 控制切口落点。实测卡片在三栏容器里被拦腰切开 / 整体搬移的行为,以及旧名 page-break-* 与 @media print 的渊源。
相关链接
📐 规范 / 文档
- CSS Text Module Level 4 drafts.csswg.org 本系列大半属性的规范本体:white-space-collapse / text-wrap / text-justify / hanging-punctuation / text-spacing-trim 等折行、对齐、空白、断词的处理模型。
- CSS Writing Modes Level 4 drafts.csswg.org writing-mode / text-orientation / text-combine-upright 与逻辑方向随书写模式对调的规范定义。
- MDN · CSS text 模块总览 developer.mozilla.org CSS Text 模块的属性索引页:从这里可跳转到 white-space / overflow-wrap / word-break / hyphens / line-break 等每个属性的详页与指南。
- MDN · writing-mode developer.mozilla.org 竖排书写模式各取值的含义、可动画性与浏览器回退方案。
- Can I use · text-wrap: balance caniuse.com 标题平衡折行的实时浏览器支持矩阵(pretty 另有条目)。
- Can I use · hyphens caniuse.com 自动连字符断词的浏览器支持与 lang 依赖说明。
- Can I use · line-clamp caniuse.com 多行截断 -webkit-line-clamp 的浏览器支持矩阵。
- Can I use · writing-mode caniuse.com 竖排书写模式的实时浏览器支持矩阵。
📄 属性细节 / 延伸
- text-justify · MDN developer.mozilla.org auto / inter-word / inter-character / none 各值含义,以及「distribute 已废弃、多数浏览器只实现 inter-word」的现状说明。
- text-align-last · MDN developer.mozilla.org 单独控制一段(或被 justify 的块)最后一行的对齐方式。
- CSS Text Module Level 3 · §7 Justification w3.org 规范原文:text-align: justify 的展开、justification opportunity(词间 / 字间)的定义、为何不处理最后一行与强制换行行。
- CSS Text Level 3 · Line Breaking & Word Boundaries w3.org white-space / overflow-wrap / word-break / line-break / hyphens 的规范定义:软换行机会、强制断点、CJK 避头尾。
- Better Typography with text-wrap: pretty webkit.org WebKit 实现 text-wrap: pretty 的设计:评估整段(对比 Chrome 仅末 4 行)、改善 rag、避免短末行、减少连续断字,以及它与 balance 的分工(正文 vs 标题)。
- CSS Writing Modes Level 4 w3.org writing-mode / text-orientation / text-combine-upright,以及 inline / block 逻辑方向随书写模式如何对调。
- 中文排版需求 · Requirements for Chinese Text Layout w3.org · clreq W3C 的中文排版规范文档:避头尾禁则、标点挤压、全角半角、竖排等中文专属排版规则的权威依据。
- 姊妹系列:字体里的隐藏开关 · font-features playground · font-features 本系列管「行怎么排」,那个系列管「字形怎么选」(tabular-nums / OpenType feature / text-autospace / tab-size),两边在 spacing 一页接上。
🧩 分栏 / 分页
- CSS Fragmentation Module Level 3 w3.org 规范原文:fragmentainer 的定义、break-* 三属性的取值与冲突合并规则(相邻元素的 break-after 与 break-before 如何取强者)。
- CSS fragmentation · MDN developer.mozilla.org 模块总览:break-before / break-after / break-inside、orphans / widows,以及与 page-break-* 旧名的 alias 关系。
- break-inside · MDN developer.mozilla.org avoid / avoid-page / avoid-column 各值的浏览器兼容表 —— 分栏场景兼容性最好的是 avoid。