WOFF
Web Open Font Format——首个专为网页设计的字体格式。
什么是 WOFF?
WOFF 1.0 由 Mozilla、Opera 和 Microsoft 联合开发,是第一个从头为网页构建的字体格式。2012 年 12 月,它成为 W3C 推荐标准,标志着网页字体排版的重要里程碑。
WOFF 的核心是对现有 TrueType 或 OpenType 字体数据的封装。它应用 zlib 压缩来缩减文件大小,并包含可选的元数据字段用于授权和署名信息。在 WOFF 出现之前,网页开发者只能提供原始的 TTF 或 OTF 文件——体积大、未压缩,且缺乏嵌入授权信息的标准方式。
关键创新在于创建了一个专为网页设计的字体容器,同时解决了三个问题:通过压缩减小文件体积、为字体授权提供标准元数据块,以及为浏览器提供可轻松验证和沙箱化的安全格式。
工作原理
WOFF 容器将现有字体表(来自 TTF 或 OTF 源文件)与逐表的 zlib 压缩封装在一起。原始字体中的每张表——字形轮廓、字偶距数据、命名记录——均独立压缩,允许浏览器仅解压所需的表。
WOFF 文件头以四字节签名(wOFF)开头,随后是字体类型(指示封装数据是 TrueType 还是 CFF)、总压缩大小以及可选元数据块的指针。浏览器读取文件头,将各个表解压回原始形式,并将重建的字体数据交给文本渲染引擎。
从渲染引擎的角度来看,解压后的 WOFF 文件与原始 TTF 或 OTF 完全相同——压缩对渲染引擎完全透明。
典型 @font-face 用法@font-face {
font-family: 'MyIcons';
src: url('icons.woff2') format('woff2'),
url('icons.woff') format('woff');
}
浏览器按顺序尝试每条 src。现代浏览器会加载 WOFF2 文件(更小、更快);不支持 WOFF2 的旧版浏览器则回退到 WOFF。这种级联方式在最大兼容性的前提下实现了最优性能。
优缺点
- 良好的压缩效果——比原始 TTF 小约 40%
- 广泛支持,包括 IE 9+
- W3C 推荐标准(官方网络标准)
- 包含元数据和授权信息支持
- 从 TTF 或 OTF 源转换简便
- 已被压缩更好的 WOFF2 取代
- 比同等 WOFF2 文件大约 30%
- zlib 压缩效率不如 Brotli
浏览器支持
WOFF 自 2010 年代初起就被所有主流浏览器支持,是网页字体最安全的兜底格式。它比 WOFF2 覆盖更广,因为它还支持旧版 Internet Explorer。
| 浏览器 | 最低版本 |
|---|---|
| Chrome | 6+ |
| Firefox | 3.5+ |
| Safari | 5.1+ |
| Internet Explorer | 9+ |
| Edge | 所有版本 |
| Opera | 11.1+ |
凭借 98%+ 的全球浏览器覆盖率,WOFF 几乎被所有仍在使用的浏览器所理解。唯一明显的缺口是 IE 6-8,它们需要使用 EOT。
WOFF 与 WOFF2 对比
WOFF2 是 WOFF 的继任者,在大多数实际情况下是严格意义上的改进。以下是两者的对比:
| 对比项 | WOFF | WOFF2 |
|---|---|---|
| 压缩算法 | zlib (deflate) | Brotli |
| 压缩比 | 比 TTF 小约 40% | 比 WOFF 小约 30% |
| 预处理 | 无 | 字形数据变换 |
| 解压速度 | 快 | 更快 |
| IE 支持 | IE 9+ | 仅 Edge(不含 IE) |
| W3C 标准 | 2012 年 | 2018 年 |
WOFF2 凭借 Brotli 和专用预处理步骤,提供了约 30% 更好的压缩比,同时解压速度也更快。现代浏览器对 WOFF2 的支持同样广泛——唯一的缺口是支持 WOFF 但不支持 WOFF2 的 IE 9-11。
对于大多数面向 2024 年及之后浏览器的项目,仅 WOFF2 就已足够。WOFF 的唯一剩余优势是覆盖 IE 9-11。
何时使用 WOFF
尽管 WOFF2 已取而代之,仍有一些充分理由在字体栈中保留 WOFF:
- 作为 WOFF2 的兜底格式——在
@font-face声明中将 WOFF2 列在前,WOFF 列在后,让现代浏览器获得更小的文件,同时确保旧版浏览器仍能获取字体。 - 需要支持 IE 11——IE 11 支持 WOFF 但不支持 WOFF2,因此 WOFF 是该浏览器可用的最佳压缩格式。
- 不支持 Brotli 的环境——某些旧版构建工具、代理或 CDN 可能无法正确处理 WOFF2 的 Brotli 压缩;WOFF 的 zlib 压缩则被普遍支持。
如果以上情况均不适用于你的项目,可以安全地跳过 WOFF,只提供 WOFF2。