现在,您可以在 Web 字体加载时调整其缩放比例,以使文档字体大小归一化,并防止在字体之间切换时出现布局偏移
请考虑以下演示,其中 font-size
是一致的 64px
,并且这些标头之间的唯一区别是 font-family
。左侧的示例未经过调整,最终大小不一致。右侧的示例使用 size-adjust
来确保 64px
的最终大小保持一致。
本文将探讨一个名为 size-adjust
的新 CSS 字体描述符。该文档还介绍了一些校正和规范字体大小的方法,以便提供更顺畅的用户体验、一致的设计系统和更可预测的网页布局。一个重要的用例是优化 Web 字体渲染,以防止累积布局偏移 (CLS)。
下面是问题空间的互动演示。尝试使用下拉菜单更改字体,并观察以下情况:
- 结果中的高度差异。
- 视觉上令人不适的内容切换。
- 移动交互式目标区域(下拉菜单会跳来跳去!)。
如何使用 size-adjust
放大字体
语法简介:
@font-face {
font-family: "Adjusted Typeface";
size-adjust: 150%;
src: url(some/path/to/typeface.woff2) format('woff2');
}
- 创建一个名为
Adjusted Typeface
的自定义字体。 - 使用
size-adjust
将每个字形放大到其默认大小的 150%。 - 仅影响单个导入的字体。
使用上述自定义字体,如下所示:
h1 {
font-family: "Adjusted Typeface";
}
通过流畅的字体切换来缓解 CLS
在以下 GIF 动画中,观看左侧的示例,以及更改字体后出现的变化。这只是一个包含单个标题元素的小示例,但问题非常明显。
如需改进字体渲染,字体切换是一项非常有用的技术。先渲染快速加载的系统字体以显示内容,然后在网页字体加载完毕后将其替换为网页字体。这样,您既能让内容尽快显示,又能获得样式出色的网页,而无需让用户等待太久。不过,问题在于,有时当 Web 字体加载时,由于其显示的框高度略有不同,因此会使整个网页发生偏移。
通过在 @font-face
规则中放置 size-adjust
,它会为字体设置全局字形调整。将此时间安排得当,可最大限度地减少视觉变化,实现无缝切换。如需实现流畅的切换,请手动调整,或试用 Malte Ubl 制作的尺寸调整计算器。
本文开头部分提到,我们是通过反复试验来解决字体大小问题的。在源代码中调整了 size-adjust
,直到 Cookie
和 Arial
中的同一标头呈现与 Press Start 2P
自然呈现的相同 64px
。我将两个字体对齐到目标字体大小。
@font-face {
font-family: 'Adjusted Arial';
size-adjust: 86%;
src: local(Arial);
}
@font-face {
font-family: 'Cookie';
size-adjust: 90.25%;
src: url(...woff2) format('woff2');
}
校准字体
作为作者,您可以确定用于规范字号的校准目标。您可以使用 Times、Arial 或系统字体进行标准化,然后调整自定义字体以使其匹配。或者,您也可以调整本地字体,使其与您下载的字体一致。
size-adjust
校准策略:
- 远程目标:
根据下载的字体调整本地字体。 - 本地目标:
将下载的字体调整为本地目标字体。
示例 1:远程目标
请考虑以下代码段,它会调整本地可用的字体,使其大小与远程 src 自定义字体相匹配。远程自定义字体是校准的目标,可能是品牌字体:
@font-face {
font-family: "Adjusted Regular Arial For Brand";
src: local(Arial);
size-adjust: 90%;
}
@font-face {
font-family: "Rad Brand";
src: url(some/path/to/a.woff2) format('woff2');
}
html {
font-family: "Rad Brand", "Adjusted Regular Arial For Brand";
}
在此示例中,本地字体 Arial 正在调整,以便在加载自定义字体后进行流畅切换。
这种策略的优势在于,可为设计师和开发者提供相同的字体来调整大小和排版。品牌是校准目标。这对设计系统来说是个好消息。
Malte 的计算器也是以品牌字体作为目标。选择一种 Google 字体,系统会计算如何调整 Arial 以与其无缝切换。以下是 Calculator 中的 Roboto CSS 示例,其中 Arial 已加载并命名为“Roboto-fallback”:
@font-face {
font-family: "Roboto-fallback";
size-adjust: 100.06%;
src: local("Arial");
}
如需创建完全跨平台的调整,请参阅以下示例,其中提供了 2 种经过调整的本地后备字体,以应对品牌字体。
@font-face {
font-family: "Roboto-fallback-1";
size-adjust: 100.06%;
src: local("Arial");
}
@font-face {
font-family: "Roboto-fallback-2";
size-adjust: 99.94%;
src: local("Arimo");
}
@font-face {
font-family: "Roboto Regular";
src: url(some/path/to/roboto.woff2) format('woff2');
}
html {
font-family: "Roboto Regular", "Roboto-fallback-1", "Roboto-fallback-2";
}
示例 2:本地目标
请考虑以下代码段,它会调整品牌自定义字体以匹配 Arial:
@font-face {
font-family: "Rad Brand - Adjusted For Arial";
src: url(some/path/to/a.woff2) format('woff2');
size-adjust: 110%;
}
html {
font-family: "Rad Brand - Adjusted For Arial", Arial;
}
这种策略的优势在于,无需任何调整即可进行渲染,然后调整任何传入字体以使其匹配。
使用 ascent-override
、descent-override
和 line-gap-override
进行更精细的微调
如果对字体的通用放大无法满足您的设计或加载策略的调整需求,请参考下方可与 size-adjust
搭配使用的更精细的调整选项。ascent-override
、descent-override
和 line-gap-override
属性目前已在 Chromium 87 及更高版本和 Firefox 89 及更高版本中实现。
ascent-override
ascent-override
描述符用于定义字体相对于基准线的高度。
@font-face {
font-family: "Ascent Adjusted Arial Bold";
src: local(Arial Bold);
ascent-override: 71%;
}
红色标题(未调整)的大写字母 A 和 O 上方有空格,而蓝色标题已经过调整,其大写字母高度与整个边界框紧密贴合。
descent-override
descent-override
描述符定义了字体基准线以下的高度。
@font-face {
font-family: "Ascent Adjusted Arial Bold";
src: local(Arial Bold);
descent-override: 0%;
}
红色标题(未调整)的 D 和 O 基准线下方有空白,而蓝色标题已经过调整,因此字母紧贴在基准线上。
line-gap-override
line-gap-override
描述符定义了字体的行距指标。这是字体建议的行距或外边距。
@font-face {
font-family: "Line Gap Adjusted Arial";
src: local(Arial);
line-gap-override: 50%;
}
红色标题(未调整)没有 line-gap-override
,实际上它位于 0%
,而蓝色标题则向上调整了 50%,相应地在字母上方和下方留出了空间。
综合应用
每种替换项都提供了一种额外的方法来修剪 Web 的安全文本边界框中的多余内容。您可以根据需要调整文本框,以便精确呈现。
总结
@font-face
size-adjust
CSS 功能是一种令人兴奋的方式,可用于自定义网页布局的文本边界框,以改善字体切换体验,从而避免用户遇到布局偏移。如需了解详情,请参阅以下资源:
- CSS 字体级别 5 规范
- MDN 上的尺寸调整
- 无缝切换 @font-face 生成器
- web.dev 上的 Cumulative Layout Shift (CLS)
- 一种减少字体加载影响的新方法:CSS 字体描述符
照片由 Kristian Strand 拍摄,选自 Unsplash