@font-face 的 CSS size-adjust

在加载网络字体时,您现在可以调整其缩放比例,以规范文档字体大小,并防止在切换字体时发生布局偏移

请看以下演示,其中 font-size 是一个一致的 64px,而每个标头之间的唯一区别是 font-family。左侧的示例未经调整,最终大小不一致。右侧的示例使用 size-adjust 来确保 64px 是一致的最终大小。

在此示例中,Chrome 开发者工具 CSS 网格布局调试工具用于显示高度。

本文将探讨一种名为 size-adjust全新 CSS font-face 描述符。它还演示了如何修正和规范化字体大小,以实现更流畅的用户体验、一致的设计系统和更可预测的网页布局。一个重要的使用场景是优化 Web 字体渲染,以防止出现累积布局偏移 (CLS)。

Browser Support

  • Chrome: 92.
  • Edge: 92.
  • Firefox: 92.
  • Safari: 17.

Source

下面是问题空间的互动演示。尝试使用下拉菜单更改字体,并观察:

  1. 结果中的高度差异。
  2. 视觉上令人不适的内容切换。
  3. 移动互动目标区域(下拉菜单会跳动!)。

如何使用 size-adjust 缩放字体

语法简介:

@font-face {
  font-family: "Adjusted Typeface";
  size-adjust: 150%;
  src: url(some/path/to/typeface.woff2) format('woff2');
}
  1. 创建名为 Adjusted Typeface 的自定义字体。
  2. 使用 size-adjust 将每个字形放大到默认大小的 150%。
  3. 仅影响单个导入的字体。

按如下方式使用上述自定义字体:

h1 {
  font-family: "Adjusted Typeface";
}

通过无缝字体替换来缓解 CLS 问题

在下面的 GIF 中,您可以看到左侧的示例,以及字体更改时出现的偏移。这只是一个小示例,其中包含一个标题元素,问题非常明显。

左侧的示例存在布局偏移,右侧的示例则没有。

为了改进字体渲染,一种非常好的技术是字体替换。先渲染加载速度快的系统字体来显示内容,然后在网页字体加载完毕后将其替换为网页字体。这样一来,您便可兼得二者之长:内容会尽快显示,并且您会获得样式精美的网页,而不会牺牲用户浏览内容的时间。不过,问题在于,有时当网络字体加载时,由于其呈现的盒子高度略有不同,因此会使整个网页发生位移。

内容越多,字体交换时可能发生的布局偏移就越多

通过将 size-adjust 放在 @font-face 规则中,可以为字体设置全局字形调整。如果时机恰当,视觉变化将非常小,从而实现无缝交换。如需实现无缝交换,请手动调整或尝试使用 Malte Ubl 提供的这款尺寸调整计算器

选择 Google 网页字体,获取预先调整好的 @font-face 代码段。

在本文开头,我们通过反复试验来解决字体大小问题。在源代码中对 size-adjust 进行了微调,直到 CookieArial 中的同一标题呈现的 64pxPress 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. 远程目标
    将本地字体调整为下载的字体。
  2. 本地目标
    将下载的字体调整为本地目标字体。

示例 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 以便无缝替换为所选字体。以下示例展示了计算器中的 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-overridedescent-overrideline-gap-override 进行更精细的调整

如果字形的常规缩放无法充分调整设计或加载策略,您可以搭配使用 size-adjust,并尝试以下更精细的调整选项。ascent-overridedescent-overrideline-gap-override 属性目前已在 Chromium 87+ 和 Firefox 89+ 中实现。

剪刀位于“覆盖”一词的上方,表明功能可以修剪的区域

ascent-override

Browser Support

  • Chrome: 87.
  • Edge: 87.
  • Firefox: 89.
  • Safari: not supported.

Source

ascent-override 描述符定义了字体在基线之上的高度。

@font-face {
  font-family: "Ascent Adjusted Arial Bold";
  src: local(Arial Bold);
  ascent-override: 71%;
}

红色标题(未调整)的大写字母 A 和 O 上方有空间,而蓝色标题经过调整,其大写字母高度与整个边界框紧密贴合。

descent-override

Browser Support

  • Chrome: 87.
  • Edge: 87.
  • Firefox: 89.
  • Safari: not supported.

Source

descent-override 描述符用于定义字体基线下方的高度。

@font-face {
  font-family: "Ascent Adjusted Arial Bold";
  src: local(Arial Bold);
  descent-override: 0%;
}

红色标题(未调整)的 D 和 O 基准线下方有空间,而蓝色标题经过调整,字母紧贴基准线。

line-gap-override

Browser Support

  • Chrome: 87.
  • Edge: 87.
  • Firefox: 89.
  • Safari: not supported.

Source

line-gap-override 描述符定义了字体的行间距指标。这是建议的字体行间距或外部前导。

@font-face {
  font-family: "Line Gap Adjusted Arial";
  src: local(Arial);
  line-gap-override: 50%;
}

红色标题(未调整)没有 line-gap-override,实际上是 0%,而蓝色标题向上调整了 50%,因此字母上方和下方相应地留出了空间。

综合应用

每种替换方法都提供了一种额外的方式来剪裁网页安全文本边界框中的多余部分。您可以调整文本框的大小,以便精确展示。

总结

@font-face size-adjust CSS 功能是一种令人兴奋的方式,可用于自定义网页布局的文本边界框,以改善字体替换体验,从而避免用户遇到布局偏移问题。如需了解详情,请参阅以下资源:

照片由 Kristian Strand 拍摄,选自 Unsplash 网站