这是通过 Data URI Scheme(数据URI方案) 实现的字体文件内嵌,它允许将任意文件的二进制内容直接编码为Base64字符串,嵌入到CSS、HTML或JavaScript中,无需单独发起HTTP请求加载外部字体文件。
一、核心原理
你看到的src: url('data:font/ttf;charset=utf-8;base64,AAEAAAAN...')遵循标准的Data URL格式:
data:[<媒体类型>][;charset=<编码>][;base64],<编码后的数据>
font/ttf:媒体类型,表示这是TrueType字体文件charset=utf-8:字符编码(字体文件通常用utf-8)base64:表示后面的数据是Base64编码的二进制内容AAEAAAAN...:字体文件经过Base64编码后的完整字符串
二、最便捷的生成方式(针对iconfont)
你这段代码是阿里图标库(iconfont.cn) 自动生成的标准内嵌式字体CSS,平台本身就提供了一键生成功能,无需手动转换:
- 进入你的阿里图标库项目
- 点击右上角「下载至本地」
- 在弹出的下载窗口中,勾选「Base64」选项
- 下载后的
iconfont.css文件中,@font-face的src就会自动变成这种内嵌格式
三、手动转换方法(通用任意字体文件)
如果你有自己的字体文件(.ttf/.woff/.woff2),可以通过以下方式转成内嵌格式:
方法1:在线工具(最简单)
推荐使用:
- Base64 Guru
- Convertio Base64 Encoder
- CSS Font Base64 Converter(专业字体转换,支持多种格式)
操作步骤:
- 上传你的字体文件
- 选择「Base64编码」
- 复制生成的完整Data URL字符串
- 替换到
@font-face的src属性中
方法2:命令行(适合开发者)
Linux/macOS
# 将iconfont.ttf转成Base64并输出到文件
base64 -i iconfont.ttf -o iconfont.base64
# 然后拼接成完整的Data URL
echo "data:font/ttf;charset=utf-8;base64,$(cat iconfont.base64)"
Windows PowerShell
# 读取字体文件并转成Base64
$base64 = [Convert]::ToBase64String([IO.File]::ReadAllBytes("iconfont.ttf"))
# 输出完整Data URL
"data:font/ttf;charset=utf-8;base64,$base64" | Out-File iconfont.dataurl
方法3:Node.js代码
const fs = require('fs');
// 读取字体文件
const fontBuffer = fs.readFileSync('./iconfont.ttf');
// 转成Base64
const base64Font = fontBuffer.toString('base64');
// 生成完整Data URL
const dataUrl = `data:font/ttf;charset=utf-8;base64,${base64Font}`;
console.log(dataUrl);
四、不同字体格式的对应写法
| 字体格式 | 媒体类型 | format值 |
|---|---|---|
| TrueType (.ttf) | font/ttf | truetype |
| WOFF (.woff) | font/woff | woff |
| WOFF2 (.woff2) | font/woff2 | woff2 |
| OpenType (.otf) | font/otf | opentype |
示例(推荐使用体积更小的woff2格式):
@font-face {
font-family: 'iconfont';
src: url('data:font/woff2;charset=utf-8;base64,你的woff2编码字符串') format('woff2');
font-weight: normal;
font-style: normal;
font-display: swap;
}
五、优缺点分析
优点
- 减少HTTP请求:无需单独加载字体文件,适合小体积的图标字体
- 解决跨域问题:避免字体文件放在CDN上时因CORS配置不当导致的加载失败
- 打包方便:所有资源整合在一个CSS文件中,无需管理文件路径
- 离线可用:内嵌在CSS中,应用离线时仍能正常显示图标
缺点
- 文件体积增大:Base64编码会使文件体积增加约33%
- 无法单独缓存:字体数据随CSS一起加载,无法利用浏览器对单独字体文件的缓存
- 影响首屏加载:大字体文件内嵌会显著增加CSS体积,延长首屏渲染时间
六、最佳实践
- 仅对小体积的图标字体(通常几十KB以内)使用内嵌方式
- 生产环境优先使用woff2格式,内嵌后的体积比ttf小很多
- 保留
font-display: swap属性,避免出现"文字闪烁"(FOIT)问题 - 如果字体文件超过100KB,建议使用外部链接方式加载,并配置好CDN的CORS头
