text-align: justify 单行不生效是因为浏览器只对有多行且含换行断点(如空格、标点)的文本拉伸间距;单行无断点可分摊,故退为左对齐——这是规范行为而非bug,中文尤甚。

text-align: justify 为什么单行不生效
浏览器对 text-align: justify 的实现逻辑是:只在有换行断点(如空格、标点、连字符)的多行文本中,才拉伸这些断点间的空白。单行文本没有断点可“分摊”,所以默认退回到左对齐——这不是 bug,是规范行为。
常见错误是给一个只有“姓名”“电话”这类短词的 <div> 直接加 <code>text-align: justify,结果毫无变化。验证方法:手动插入两个英文单词加空格(如 "Zhang Li"),就能看到空隙被拉开了。
- 纯中文单行几乎永远不触发 justify,因 Unicode 中文字符间无默认断点
-
text-align-last: justify是补救关键,它强制让“最后一行”(含唯一一行)也参与两端对齐 - 若内容来自接口,可在 JS 渲染时末尾追加零宽空格
'\u200b',骗过浏览器的断点检测
中文单行两端对齐必须加 text-align-last
想让“张三”“李四”“王五”这种两字标题在固定宽容器里首尾贴边,text-align: justify 单独写没用,必须配 text-align-last: justify。
注意:text-align-last 不继承,必须显式写在文字容器上(如 <p></p> 或 <td>),且不能依赖父级设置。
<ul>
<li>错误写法:<code>div { text-align: justify; } → 子 p 仍不会两端对齐
p { text-align: justify; text-align-last: justify; }
text-align-last,需降级为 text-align: center 或 flex 布局表格单元格里 justify 失效?检查是否漏了 td/th 选择器
text-align 属性不会从 <table> 继承到 <code><td> 或 <code><th>,这是 CSS 规范明确规定的。哪怕你给 <code>table 加了 text-align: justify,单元格依然左对齐。
必须把样式直接写在单元格级:
td, th {
text-align: justify;
text-align-last: justify;
}
如果还无效,再检查两点:
- 是否用了
white-space: nowrap?它会禁用换行,justify 就失去作用 - 是否设置了
width过小或font-size过小( - 中文效果差?可尝试加
text-justify: inter-character(Chromium 120+ 支持),但别当兼容性基础
letter-spacing 手动控制空隙更可控但要算字数
当 justify 行为不可靠(比如固定 2~4 字的表单项 label),用 letter-spacing 拉开字符间距更稳定。但它需要按字数分情况处理,不能一招通吃。
例如 2 字变 4 字宽,可设 letter-spacing: 20px;3 字则可能只需 10px;4 字反而要负值收缩。字体、字号、容器宽度都会影响最终视觉效果。
- 不要用全角空格硬凑,会导致右侧留白异常且无法响应缩放
- JS 动态计算推荐用
getBoundingClientRect().width测量当前宽度,再反推 spacing,比预设值靠谱 - 移动端慎用大
letter-spacing,iOS Safari 对负值渲染不稳定











