Chrome 98 中的 COLRv1 颜色渐变矢量字体

Dominik Röttsches
Dominik Röttsches
Rod Sheeter
Rod Sheeter

紧凑、易压缩的彩色矢量字体,包含您喜爱的所有渐变风格。

在 Chrome 98 中,Chrome 和 Fonts 团队添加了对 COLRv1 的支持。COLRv1 是 COLRv0 字体格式的演变,旨在通过添加渐变、合成和混合,以及改进内部形状重用,让彩色字体广泛普及,从而获得清晰紧凑且压缩效果出色的字体文件。

立即上色

在 Web 上,文本通常以 CSS 中指定的颜色绘制。字体不会定义任何特定颜色,而只是指明像素应放置在何处。这通常是好事。借助 CSS,作者可以灵活选择颜色。不过,有时一个字形包含多个颜色,这些颜色组合在一起具有意义。例如,如果仅使用当前文本颜色绘制带有浅蓝色、粉色和白色条纹的此旗帜 由浅蓝色和浅粉色条纹组成的跨性别旗帜。,则无法传达相同的含义。

目前,对于大多数用户来说,表情符号是他们看到的唯一彩色字体。表情符号通常通过系统表情符号字体或通过插入图片(这有其自身的复杂性,表情悲伤的熊猫表情符号。)显示在网络上。文件大小较大(尤其是基于位图的彩色字体),因此很难将网络字体用于表情符号。通过支持 COLRv1,我们希望在网络上及其他平台上看到越来越多的创意彩色字体。

给我看看你的颜色

我们创建了一些示例供您试用:

示例中使用的 Google Fonts 示例资源位于 Google Fonts Web API 中。这些字体未在 fonts.google.com 目录中列出,因为它们仅适用于 Chrome 98 或更高版本,并且展示了实验性成果。

现在,您可以使用免费的开源工具制作自己的 COLRv1 字体。您可以使用 nanoemoji 字体编译器从 SVG 源图片构建 COLRv1 字体,然后在 Chrome 98 或更高版本中试用这些字体。您可以尝试按照这些说明更改渐变色,打造自己的 Bungee Spice 主题。

例如,您可以修改 Bungee Spice 字体,使其呈现蓝色和红色的渐变效果,如下所示:

采用 Bungee Spice 彩色字体的“dune”字样,采用蓝色和红色渐变色调。

欢迎将结果发推给 @googlefonts 🙂? 不妨试试径向渐变或扫描渐变效果。

COLRv1 中的新功能

该字体格式支持多种颜色支持方式,但每种方式都有不同的权衡,但到目前为止,还没有一种方式在 Web 上取得成功。(如需详细了解权衡,请参阅 Dominik 在 BlinkOn 15 大会上的演讲。) Chrome 98 支持 COLRv1,这是 COLRv0 的演变。我们希望 COLRv1 的图形功能和紧凑文件的组合使其成为许多彩色字体用例的理想之选。COLRv1 添加了渐变、合成和混合功能,并改进了内部形状重用,以使文件更加紧凑。

COLRv1 的表达能力大致相当于 SVG Native,并且还添加了混合和合成功能。颜色填充有四种类型:纯色、线性渐变、径向渐变和扫掠/圆锥渐变。借助 COLRv1,您可以使用一整套平移、旋转、剪切和缩放转换来重新定位和转换字形元素。此外,它还支持字体变体,并会重复使用字体中的现有形状定义格式。

蓝色和紫色水晶球表情符号,棕色底板上有重复使用的星星。
水晶球表情符号中的形状重复使用

以水晶球表情符号为例:星形亮点的形状相同,但大小不同,这意味着只需一个形状即可重新定位和重复使用,而无需在文件中重复。借助此格式,您可以在新字形中重复使用完整字形,而无需为每个字形冗余编码相同的形状。假设您有一个带花卉装饰的装饰色字体,其中只需引用现有的色字形,即可将相同的花形放置在不同的字母上。对于 Web 字体用例,COLRv1 在 woff2 下可实现良好的压缩。例如,使用 COLRv1 的 Twemoji 测试 build 膨胀后大约需要 1.2 MB,但以 woff2 形式大约需要 0.6 MB。完整 Noto Emoji 字形集的 build 从位图版本的 9MB 缩减为 COLRv1+woff2 格式的 1.85MB。

条形图:比较将 Noto Emoji 用作位图字体和 COLRv1 字体的大小,约为 9MB 对 1.85MB
WOFF2 压缩后的 Noto Emoji 字体大小 CBDT/CBLC 与 COLRv1。

彩色字体用例

醒目标题

新颖的彩色字体可让视觉亮点、标题和横幅脱颖而出。

Plakato Color Happy 2022 采用充满活力的扫描渐变效果,由创新字体铸造厂 Underware(Twitter:@underware、Instagram:@underwarefoundry)制作。如需详细了解 Underware 的首个 COLRv1 版本,请参阅他们的博文

不再替换图片:表情符号字体

如果您支持用户生成的内容,那么您的用户可能会使用表情符号。如今,扫描文本并将遇到的所有表情符号替换为图片非常常见,这有助于确保跨平台呈现一致,并支持比操作系统支持的更新的表情符号。然后,在剪贴板操作期间,必须将这些图片切换回文本。下面是一个实际示例:

代码段:将内嵌图片显示为聊天记录中的 img 标记和元数据
Google Chat 中的图片替换

如果您使用的是表情符号字体,只需使用该字体渲染文本即可,如下所示:

<style>
@import url(https://fonts.googleapis.com/css2?family=Noto+Color+Emoji);

.emoji {
  font-family: "Noto Color Emoji", sans-serif;
}
</style>
<span class="emoji">🙂</span>

同样,在表情符号回应组件中,COLRv1 提供了使用紧凑的字体文件(而非图片资源目录)的机会。

GitHub 上使用的表情符号选择器界面
GitHub 上的表情符号回应选择器

试想一下,您需要提取多少张图片才能构建一个完整的表情符号选择器!

图标字体中的颜色

在图标字体中使用颜色有助于提高清晰度,让字形更易于理解。

三个带有黑色轮廓的绿色图标
材质双色调图标来自 https://fonts.google.com/icons

艺术表现

节省空间的彩色字体可让您在网页上以新的形式对文本进行艺术表现。此 Kufi 风格阿拉伯字体示例使用颜色渐变作为艺术诠释,展示了将传统书法的墨水流动应用于 Kufi 风格阿拉伯书写(起源于用钢笔和墨水书写,而不是雕刻在石头上)时可能呈现的效果。

从黑色到红色的渐变阿拉伯字母。
Reem Kufi Ink,由 Khaled Hosny 设计的阿拉伯语字体

功能检测

目前,您可以通过用户代理嗅探或在 @PixelAmbachtChromaCheck 等库中搜索来确定浏览器引擎是否支持特定的彩色字体格式,以便测试 Canvas 上彩色字形的渲染效果。这两种解决方案都不是最优方案。功能测试应仅检测特定功能本身,并避免用户代理嗅探。ChromaCheck 库不应需要执行资源密集型 2D 画布操作来确定支持情况。

Chrome 团队希望改进这一点,并已在 CSS 工作组中发起了一系列讨论 [12],以提供有关在 JavaScript 中以声明方式和在 CSS 中以声明方式支持浏览器字体技术的信息。该团队计划在未来的 Chrome 版本中发布针对彩色字体和其他字体技术的高效特征检测功能。

目前,COLRv1 支持仅限于 Chrome,如果您想立即在项目中使用彩色字体,可以通过以下两种方式实现:向字体供应商索要同时包含单色字符的 COLRv1 字体。不支持 COLRv1 的用户代理将回退为渲染单色字形。或者,您也可以使用 ChromaCheck 库或用户代理嗅探来确定是否支持 COLRv1。然后,您可以提供在支持的用户代理中加载 COLRv1 字体的 CSS,并在其他浏览器中使用替代字体格式,例如 COLRv0、位图字体格式或 OpenType SVG。

CSS font-palette 支持

如果使用其他颜色组合不需要使用新字体,将会非常有用。幸运的是,有一个机制可以解决此问题:font-palette CSS 属性。Chrome 团队正在努力在 Chrome 中添加对字体调色板的支持

COLRv1 字体与您

如果 COLRv1 字体引起了您的兴趣,请向字体供应商咨询要在项目中使用的 COLRv1 彩色字体,试用上面的示例和演示,或者不妨直接着手尝试自行制作

如果您对 Chrome 中的 COLRv1 有反馈,请发送到 blink-dev 邮寄名单,或在我们的问题跟踪器中提交问题。如果您对 COLRv1 字体格式本身有任何反馈,请在 COLRv1 规范 GitHub 代码库中提交问题。

我们很高兴在 Chrome 98 中推出 COLRv1,它将为 Web 带来全新的排版创意。

了解详情

如果您想了解更多详情,可以参阅以下资源:

如需了解 COLRv1 的运作方式以及在 Chrome 中的实现方式,请参阅 Dominik 在 BlinkOn 15 大会上的演讲。

致谢

非常感谢 Behdad Esfahbod、Cosimo Lupo、Peter Constable、Ben Wagner、Werner Lemberg、Dave Crossland、Vladimir Levantovsky、Jonathan Kew、Laurence Penney、Chris Lilley、David Jonathan Ross、Underware、Just van Rossum、Roel Nieskens 等对 COLRv1 做出的贡献。