← Web 排版:一行字怎么排布 / 折行与断词:一行放不下了怎么办 待审核 1 / 10
wrap · break

折行与断词:一行放不下了怎么办

浏览器把一行文字塞进版心时,会在「软换行机会(soft wrap opportunity)」处折行:默认只有 空格CJK 字符 之间才算机会。超长英文单词或长 URL 内部没有空格,浏览器找不到机会,内容直接撑破容器 溢出overflow-wrapword-breakhyphens 这三个属性以不同策略引入额外的断点。

下面这块版心包含一个超长单词、一条长 URL、普通英文句子和一段中文。拖动各控件实时观察折行结果,verdict 区 用真实 getBoundingClientRect() 报告当前行数、是否溢出,以及 getComputedStyle 回显各属性的实际生效值。

1 · overflow-wrap: break-word vs word-break: break-all 的区别

  • overflow-wrap: break-word——「最后手段」策略:浏览器先尝试所有正常断点,只有当 某个词一整行都放不下 时,才去词内部断。普通英文词不受影响,每行只要还有空格可用就按空格折,不会拦腰截断正常词。
  • word-break: break-all——「字符级」策略:任意字符间 都可以作为折行点,不管是否是词边界。切换到这个值再调窄版心:正常英文词也会被拦腰截断,行末不再整词换行。
  • 区别总结: break-word 只在长词放不下时才在词内断,普通词不受影响;break-all 对所有词一律允许字符级断行。
  • overflow-wrap: anywhere——语义同 break-word,区别在于它会影响 min-content 宽度的计算:长词不再把 min-width 撑大(Flex/Grid 布局中有时有用)。

white-space 控制的是「允不允许折行」,其他属性控制的是「词内怎么断」。 white-space: nowrap 直接关掉软换行,所有其他属性都无从发挥。pre 只按字面换行符折,pre-wrap 在此基础上允许软换行,pre-line 合并空白但保留换行符。

hyphens: auto 需要两个前提才生效: 其一是元素或祖先有正确的 lang 属性(本页 .tstage 已加 lang="en");其二是浏览器内置对应语言的断词字典。满足两者,浏览器会在词的合适音节处插入连字符 - 折行,比在任意字符处截断更易读。hyphens: manual 只在 HTML 实体 ­(软连字符)处断,其他位置不断。若切到 auto 后折行结果无变化,说明当前浏览器或系统缺少该语言的断词字典。

2 · text-wrap: balance——让标题各行宽度更均衡

text-wrap: balance(Chrome 114+, Safari 17.5+)让浏览器重新分配折行点,使各行宽度尽量均衡,避免最后一行只剩一两个孤字。下面两个标题用 getBoundingClientRect() 实测各行宽度,报告「最宽行 − 最窄行」的差值:balance 一侧应更小。balance 是给 标题 / 短文本 的;正文应使用 text-wrap: pretty(见下一节)。

3 · text-wrap: pretty——正文的 rag 与末行孤字

balance 给标题:每行等宽、整块比容器窄,放在正文会显得参差。text-wrap: pretty(Chrome 117+ / Safari 26+)才是给 正文 body text 的——它 保持填满版心宽度,只在末几行的弹性区间内微调折点,做三件事:其一,避免 过短的末行(孤字 orphan);其二,改善 rag(让右边缘更整齐);其三,减少 连续行的断字(hyphenation)。实现差异:WebKit 会评估 整段,Chrome 目前只回看 末 4 行

顺带厘清:text-wrap 是简写,拆成两个 longhand——text-wrap-modewrap | nowrap,管「允不允许折行」)+ text-wrap-styleauto | stable | balance | pretty | avoid-short-last-lines,管「怎么折」)。下面两栏是同一段正文,右侧加 text-wrap: pretty,用 Range 实测末行词数,孤字会被标红:

这里把段落宽度 固定在 240px,好让默认折行确定地把末行逼成单个孤字——支持的浏览器下,pretty 一侧会把它拉成两词。能否优化、幅度多大都因浏览器而异:若两栏读数一样,多半是当前浏览器尚未支持 text-wrap: pretty