← Web 排版:一行字怎么排布 / 标点与禁则:行首与行尾的规则 待审核 9 / 10
punctuation · 禁则

标点与禁则:行首与行尾的规则

汉字排版里,标点不是普通字符:逗号、句号 不能落在行首,开引号 不能落在行尾——这套规则叫 禁则 (kinsoku),本质是对软换行机会(见 折行与断词 页)的额外限制。line-break 控制执行力度(strict / normal / loose)。另一侧:全角标点自带半个字宽的内置空白,相邻时就是一整个字宽的间隙,text-spacing-trim 可以把它挤掉。最后,hanging-punctuation 让行首 / 行尾的标点「悬挂」到版心外,使文字边界在视觉上更整齐——但 Chrome 迄今不实现此属性,切到 first/last 后本页会实测并如实标注。

把下方版心 拖窄,观察标点被挤到行首 / 行尾时各设置的表现;打开「标注」后叠加层会用 橙框 标出落在行首 / 行尾的高危标点,用 绿框 标出被成功挂出版心的标点。

1 · 避头尾禁则:标点不许落在行首或行尾

  • 禁止落在行首的标点(行头禁则):逗号 ,、、句号 。.、顿号 、叹号 、问号 、右括号 )」』、省略号 \dots \dots 等闭合类符号。行首见到它们,浏览器会把它们推回上一行或把整个词一起换行。
  • 禁止落在行尾的标点(行尾禁则):开引号 「『( 等开合类符号不能压行尾。
  • line-break: strict——严格执行日本工业规格(JIS)禁则表,包含一些 normal 下允许的边缘标点;normal——按语言常规规则(中文 / 日文默认);loose——放宽限制,在极窄版心下允许部分标点落行首(报纸小字体常用);auto——交给浏览器按 lang 属性决定。

全角标点的隐形空白。 中文全角标点(句号、逗号、引号……)字符宽度是一个汉字(1em),其中字符本身只占约 0.5em,剩余 0.5em 是字符内置的边距。两个全角标点相邻(如 ,")之间就有整整 1em 的空白,排出来像是漏了一个字。text-spacing-trim: space-all / trim-start 把相邻全角标点之间多余的半宽间距挤掉——但这是新特性,各浏览器支持程度不一,切换后 verdict 会实测并说明。

hanging-punctuation 在 Chrome 中不支持。 hanging-punctuation: first 让行首的开引号悬挂到版心左边界外;last 让行尾句号悬挂到右边界外,使文字的视觉左 / 右边界更整齐(排版术语「悬挂标点」)。只有 Safari 实现了此属性——first / lastSafari 10(2016)起可用,但直到 Safari 26.5(2026-05)才补齐直引号;Chrome 与 Firefox 均未实现(兼容性据 MDN BCD,核对于 2026-07)。切到 first/last 后本页通过 getBoundingClientRect() 比对标点位置与版心边界——若标点 没有越出版心边界 则说明 hanging 未生效,verdict 如实提示。

2 · 悬挂标点的渐进落地:curly quote 与 straight quote

hanging-punctuation 不只作用于 CJK 标点,对西文引号同样生效。但 Safari 的实现是 分两步到位 的:弯引号(curly quote “ ” ‘ ’)的悬挂从 Safari 10.0 起支持,而直引号(straight quote " ')的悬挂直到 Safari 26.5(2026-05)才补上(核对于 2026-07)。下面四段引文,前两段用 curly quote、后两段用 straight quote——在不同版本的 Safari 中可观察到悬挂覆盖范围的差异(Chrome / Firefox 则完全不悬挂)。打开「版心参考线」后,引号是否越过左右边界一目了然。

各取值的作用范围。 first——行首的开引号 / 开括号悬挂到左边界外;last——行尾的闭引号 / 句点悬挂到右边界外;force-end——行尾的句点、逗号 强制 悬挂(总是挂出);allow-end——行尾的句点、逗号 仅在 能改善 justification 时才悬挂。后两者作用于句读类标点(stop / comma),与 first / last 可组合(如 first force-end)。在上面切换取值即可对比:none 时引号贴齐参考线,first / last 时对应一侧的引号挑出线外。

3 · 浏览器支持矩阵