如果您在 2006 年开发网站,那么您可能与像我这样的设计师合作过,他们会对字体在浏览器中的显示效果与在模型中的显示效果不完全相同而感到困扰。
然后您可能尝试向我解释跨浏览器兼容性的痛苦,以及不同的浏览器如何以不同的方式渲染字体。作为回应,我可能会向您发送一个包含内容的图像文件,以确保所有浏览器中的显示效果都相同。是的,我曾经是那种设计师。
从那时起,网络字体取得了长足的进步,我们现在有了调整字体在浏览器中渲染方式的工具。有些工具已经存在很长时间了。我记得当我发现 FitText.js 和 Lettering.js 时,我的内心充满了兴奋。
即使拥有所有这些花哨的工具,在当今仍然有很多需要调整字体的场景,以确保最佳的可读性。我们将在本文中介绍其中的一些场景,以及如何处理它们的方法。
使一个标题看起来恰到好处
我经常遇到这种情况,尤其是在设计中包含高度自定义的网络字体时,这些字体总体看起来很棒,但在某些情况下可能会显得奇怪。
以使用来自 Google 字体的 Abril Fatface 的以下标题为例

这是一个可爱的字体!但是,对于这个特定的标题,我有一些不喜欢的点,特别是几个字母之间的间距,这使得内容显得有点拥挤

这就是 **字距调整** 派上用场的地方!字距调整从字面上定义为字母之间的间距。所有字体文件,无论我们是否知道,都包含某种程度的字距调整,我们有 CSS font-kerning
属性来移除它
.no-kern-please {
font-kerning: none;
}
<h1 class="no-kern-please">Rubber Baby Buggy Bumpers</h1>
这是一个细微的差异,但如果您的设计师(或您自己的眼睛)想要这样做,它可能会派上用场。

请注意,禁用字距调整并不总是符合您的最佳利益。正如 James Kolce 在下面的 评论 中指出的那样,设计良好的字体使用字距调整作为一种工具,并且这样做是有原因的。使用 CSS 移除字距调整,虽然在一次性情况下解决了某些特定的设计需求,但可能会对字体中字母之间的整体间距产生意想不到的后果,这可能会导致其他字母之间的间距不太好。
查看 CSS-Tricks 的 CodePen 作品 字距调整切换 (@css-tricks) 在 CodePen 上。
此浏览器支持数据来自 Caniuse,其中包含更多详细信息。数字表示浏览器从该版本及更高版本开始支持该功能。
桌面
Chrome | Firefox | IE | Edge | Safari |
---|---|---|---|---|
29* | 34 | 否 | 79 | 7* |
移动/平板电脑
Android Chrome | Android Firefox | Android | iOS Safari |
---|---|---|---|
127 | 127 | 4.4* | 8* |
全面修复糟糕的字母间距
如果您曾经使用过每个字母之间的间距都太宽或太窄的网络字体,那么您完全知道这种情况有多痛苦。以下是用另一种名为 Dorsa 的漂亮的 Google 网络字体作为示例

这可能适合作为标题的显示字体,但你能想象将其用作段落来阅读吗?不行。

如果我们在每个字母之间添加几个像素,则 CSS letter-spacing
属性可以帮助对段落内容进行全面更改
.spaced-out {
letter-spacing: 2px;
}
我不会说这仍然是段落文本的最佳字体,但有了额外的间距,它更容易阅读
查看 CSS-Tricks 的 CodePen 作品 zKkPqK (@css-tricks) 在 CodePen 上。
此浏览器支持数据来自 Caniuse,其中包含更多详细信息。数字表示浏览器从该版本及更高版本开始支持该功能。
桌面
Chrome | Firefox | IE | Edge | Safari |
---|---|---|---|---|
30 | 2 | 9 | 12 | 6.1 |
移动/平板电脑
Android Chrome | Android Firefox | Android | iOS Safari |
---|---|---|---|
127 | 127 | 4.4 | 4.0-4.1 |
单词之间间距过小或过大
这是上一种情况的一个分支,只是间距问题出现在每个单词之间,而不是单个字符之间。
这就是 CSS word-spacing
属性非常棒且所有浏览器都普遍接受的地方。以下是用 Prompt 网络字体 编写的散文示例,该字体比许多其他字体略宽,如果针对此用例稍微调整一下,看起来会更好。
查看 Geoff Graham 的 CodePen 作品 GjJaaE (@geoffgraham) 在 CodePen 上。
行间距不规则
并非所有行高都被认为是相等的。例如,某些字体看起来比其他字体更大,即使它们具有相同的 font-size
值。
查看 CSS-Tricks 的 CodePen 作品 字体行高差异 (@css-tricks) 在 CodePen 上。
设置 font-size
会设置字体允许占据空间的边界框。如果我们将 font-size
设置为 20px
,则会创建一个占用 20px
垂直空间的框,供每个字符占用。

某些字体将占用比其他字体更多的空间,这将使一种字体看起来比另一种字体更大,并且行之间的垂直空间也会或多或少。
我们可以使用 line-height
属性来帮助调整该垂直空间。一个不错的经验法则是 font-size * 1.5 = line-height
(或使用无单位的 line-height: 1.5;
)以提高可读性,但这将取决于所使用的字体以及它如何占据垂直空间。查看 熔化行距。
清晰度和可读性
并非所有字体在所有操作系统上都具有相同的生成效果。这是因为每个操作系统(无论是 Windows、Mac OS 还是其他任何操作系统)都会有不同的处理方式来确定显示字体的像素数量。
我们许多网页设计师都讨厌受制于系统如何解释我们的排版决策。

我们有 CSS 属性可用于提高字体在不同系统上的显示分辨率。此过程更正式地称为 **子像素渲染**,因为它指示浏览器尝试填充可能存在的缺失像素。
关于是否适合玩弄字体的子像素渲染,存在着大量的争议。尽管是在几年前写的,但 Dmitry Fadeyev 很好地总结了他反对这种做法的论点。
抗锯齿模式不是子像素渲染的“修复”——在大多数情况下,它是一种障碍。子像素渲染在技术上更优越,更清晰,更易读,因为它通过利用每个子像素,将其用于字体平滑的有效分辨率提高了三倍。抗锯齿在某些情况下有用,例如深色背景上的浅色文本,但它绝对不能替代子像素渲染,当然也不是“修复”。
但假设我们无论如何都想这样做。CSS 使我们可以使用 font-smooth
来填充操作系统可能遗漏的部分,从而对清晰度和可读性进行一定程度的控制。
font-smooth
值包括
auto
:允许浏览器决定填充字体像素的最佳方案。never
:禁用系统自动平滑字体。这将以其自然状态显示字体,包括所有锯齿边缘。always
:指示浏览器始终在它认为有必要的地方向字体添加像素。
注意: 在撰写本文档时,font-smooth
属性被认为是非官方属性,不建议在生产环境中使用。虽然 WebKit 和 Mozilla 有供应商前缀可以实现这种效果,但还没有标准实现。
鉴于上述说明,以下供应商前缀目前可用,并具有其自身的值
-webkit-font-smoothing
none
:在 WebKit 浏览器中禁用字体平滑。antialiased
:在系统已提供的像素相同级别上平滑字体。subpixel-antialiased
:在更微观的层面上平滑字体,以获得尽可能清晰的文本,尤其是在高分辨率屏幕上。
-moz-osx-font-smoothing
auto
:允许浏览器决定是否优化字体平滑。inherit
:获取父元素的属性值。unset
:与在 WebKit 前缀中指定none
相同。grayscale
:类似于 WebKit 前缀中的antialiased
值。
这些浏览器支持数据来自 Caniuse,其中包含更多详细信息。数字表示浏览器从该版本及更高版本开始支持该功能。
桌面
Chrome | Firefox | IE | Edge | Safari |
---|---|---|---|---|
130* | 132* | 否 | 127* | TP* |
移动/平板电脑
Android Chrome | Android Firefox | Android | iOS Safari |
---|---|---|---|
否 | 否 | 否 | 否 |
哦,等等,您正在使用 SVG?!
SVG 对我们本文中介绍的技术有其自身的支持级别。我们有字距调整(不太可能产生太大影响)以及通常的嫌疑人字间距和词间距。有趣的是,我们还有一个 textLength
属性,可用于明确设置文本的渲染宽度,它会拉伸/压缩文本以适应。lengthAdjust 属性控制这是否应该仅发生在字符上,或者也发生在字形(如标点符号)上。
查看 CSS-Tricks 的 Pen SVG 文本间距 (@css-tricks) 在 CodePen 上。
总结
网页排版很难!是的,我们确实可以对字体在屏幕上的显示、渲染和定位方式进行大量控制。但能力越大,责任越大。至少您现在可以使用一些工具来回应那些纠结于浏览器中排版设计的精确度的网页设计师。
抱歉,但我发现这虽然出发点很好,但几乎让人无法理解。“……稍微降低……”?您在这里处理的是紧缩字距的概念(几乎是看不见的量),却使用了完全不具体的陈述。我怎么可能将其解释为实现您心中所想的结果。
我不同意您的字距调整示例。在我看来,原始版本比您在两个词组中扩展字距调整的版本更容易阅读。
您的“清晰度和可读性”没有示例。您只是展示了以非自然放大的图像大小显示的操作系统输出样式。这对学习如何利用这个概念毫无价值。
SVG 示例完全不清楚。
使用 Dorsa 作为字间距过小的文本示例是愚蠢的。Dorsa 不是文本字体;它是一种显示字体。以这种方式使用 Dorsa 是初级错误,而不是您正在处理的二级考虑因素之一。然后您在增加字间距时更改了字号,因此人们不再是在比较同类事物。
虽然我同意网页上的字体需要观察和考虑才能提高其可读性,但我认为您没有为论点添加任何内容,实际上可能造成了比澄清更多的困惑。
就像我们南方人说的,“只是说说而已”
嘿,Randy——我感谢您的反馈!我真的很感谢。
虽然您的一些观点更多地属于主观方面,但您确实有一些有趣的观察结果,当然值得关注。
我想可以有静态屏幕截图来显示差异,我一定会研究一下。同时,目前对这些方法的支持为零,在生产环境中无法使用的情况下提供具体的示例似乎也不合适。
并排展示不够清楚吗?将代码示例放在输出旁边似乎是说明这些概念最清晰简洁的方式。
我在文章中也提到了这一点。我想要一些能显著展示差异的内容。
我不确定这篇文章的目的是否是为了论证,但它考虑了在特定情况下如何处理排版的问题。在设计和开发方面都工作过,这些是我发现自己身处的真实场景,以及我如何处理它们的方式。如果您有不同的方法,这完全有效且很酷,但让我们至少记住文章的范围。而且,如果您有不同的场景或方法,那么请务必贡献出来,因为这篇文章并非旨在提供所有情况的详尽列表——仅仅是我遇到的情况。我们可以从彼此的集体经验中学习,而不仅仅是我一个人的经验。 :)
就像我们南加州人说的,“没错”。
保佑你
你好!
在“使一个精确的标题看起来正确”部分,第一个示例中的字距调整实际上是正确的。如果仔细观察,禁用它会导致不希望出现的结果。您可能正在查看的所有这些字母形式的小部件都太轻了,不需要那么多空间(如第二个示例所示),您必须考虑整个字母,而不仅仅是它的边界,这就是为什么第一个示例中的“b”和“y”有点重叠,以修复“y”留下的空间,但当您禁用字距调整时,整体空间变得太大。
字距调整功能不是自动的(据我所知),它只激活类型设计师提供的间距设置,而这些设置通常是正确的,至少在设计良好的字体中是这样。
此外,字距调整不是字母之间的间距,这称为跟踪(CSS 中的 letter-spacing),字距调整仅指两个字母之间的间距。
我只是认为我应该指出这一点,因为这是一个非常受欢迎的网站,所以很多人可能会在阅读完此文章后考虑在一个真实的网站上禁用字距调整,但这 99% 的情况下不是一个好主意。
谢谢,我也有同样的想法。看到像 CSS-Tricks 这样的网站推荐禁用字距调整,我感到很惊讶。
你说得对,这是一个有帮助的评论,James!
需要明确的是,这篇文章并没有建议将字距调整作为一项好主意,而是将其作为一个工具,CSS 在我们需要调整间距的情况下提供这个工具。
我肯定会在文章中添加一条关于注意字距调整的整体影响和意外后果的说明,因为正如您指出的那样,这非常合理,而且绝对值得注意。
干杯!
很好,请记住,我们讨论的是禁用字距调整的坏处,而不是使用字距调整!字距调整是好的,好的字距调整更好,但没有字距调整是不好的……除非您正在使用等宽字体。
干杯!
当然,收到!
我也必须直截了当地说:您关于关闭字距调整的建议是毫无根据的——一般情况下以及在本例中:您是如何得出这两个字母组合需要修复,因为它们据称“拥挤”的?看看“be”和“ab”有多近!“u”和“b”甚至合并在一起。但“Ru”和“by”需要修复?为什么?您有什么字距调整原则来解释这一点?我相信没有一位经验丰富的排版设计师或平面设计师会同意您的观点。
一般来说:默认间距(无字距调整)是类型设计师仅将每个字母放在字母的边界框内所能做到的最好的事情。这有其局限性,因为它没有上下文,某些字母对可能需要调整。这就是字距调整的用武之地。它是默认字母间距的上下文改进(!)尤其是在正确完成时,正如您对来自像 Type Together(创建 Abril 的公司)这样的优秀字体铸造厂的字体所期望的那样。
您展示的内容应该相反:您应该展示未进行字距调整的文本的局限性,以及如何在几乎所有情况下通过字距调整对其进行改进。这不仅仅是我的“观点”——拿起任何一本 100 本入门级排版书籍中的任何一本——它们都会说相同的话,因为这是 500 年印刷史的综合知识。
没错。我想我排版老师看到这些提供的例子后,会在棺材里转圈圈。
嘿,Ralf,
我完全理解你的意思,但要直接回答你的问题
这篇文章是关于处理我作为前端开发人员遇到的特定场景,其中设计师要求对正在实施的字体进行非常具体的更改。这篇文章不是关于字距调整原则是否合理或正确,而是关于当遇到非常详细、挑剔(是的,完全奇怪)的更改请求时,CSS 提供的方法。
换句话说:我完全同意你的观点。然而,我们如何应对与我们合作的人提出的此类请求的背景可能就是我们意见分歧的地方。
哇。作者花费了大量精力让我们这些排版极客能够控制和精确控制我们可能想要控制的元素,而所有人能说的就是他的作品很糟糕。真的吗?
我感谢我从这篇文章中学到的东西。我可能会使用这些工具。对我来说足够了。
在我的网站 https://tobireif.com/ 上,我为标题添加了自定义字距调整,以获得我想要的字符间距,而无需更改字体本身。
谢谢!不知何故,我之前不知道字距调整和字间距属性。
很棒的文章!很喜欢阅读。
我有一个问题找不到答案:你能控制单个字母之间的间距吗(例如像这 样)?
还想指出我刚开始学习 CSS,所以如果这是一个愚蠢的问题,请原谅。我用谷歌搜索了无数次,但从未找到答案。
无论如何,谢谢!
感谢这篇文章,我一直在寻找这个。
冷静点,伙计们。他只是提供了一些信息。
作为一名设计师已经很长时间了,并且在相当长的一段时间内一直在编写网站代码,所有这些 CSS 属性都是我多年来一直在使用的。也就是说,对我个人而言,这里没有什么真正的新东西。但是,这并不能否定作者所说的话。
你可能不同意他的排版决策(我不会关闭字距调整……我花费了太多时间将其构建到我创建的字体中),但这似乎并不是这篇文章的重点。它只是一个入门指南,介绍了一些您可以根据需要控制网络上间距的方法,正如标题所述。这对很多人来说都是有用的东西;显然,对于许多回复的人来说,这是一个好的、新的信息。