写对 @font-face:字体名、字重和 local()
适合谁看:自己写
@font-face、或自己部署多字重字体的开发者。
@font-face 写错了,浏览器多半不会报错,只会悄悄用错字体、自己加粗,或者多下载文件[1]。下面是几条容易忽略的正确写法。
一个家族,一个名字
同一款字的不同字重,font-family 应该写同一个名字,用 font-weight 区分:
@font-face {
font-family: "My Sans";
src: url("my-sans-regular.woff2") format("woff2");
font-weight: 400;
font-display: swap;
}
@font-face {
font-family: "My Sans";
src: url("my-sans-bold.woff2") format("woff2");
font-weight: 700;
font-display: swap;
}
这样页面里写 font-family: "My Sans",正文自动用 400,<strong>、<h1> 自动用 700。
如果每个字重起不同的名字(如 "My Sans Regular"、"My Sans Bold"),浏览器会把它们当成两款字。给 <strong> 加粗时,它找不到同名的 700,就会把 400 人工加粗,效果很差。
字重数值要和文件对应
font-weight 要写这个文件实际的粗细[2]。常见对应关系:
| 数值 | 常见名称 |
|---|---|
| 100 | Thin、Hairline |
| 200 | ExtraLight、UltraLight |
| 300 | Light |
| 400 | Regular、Normal |
| 500 | Medium |
| 600 | SemiBold、DemiBold |
| 700 | Bold |
| 800 | ExtraBold、UltraBold |
| 900 | Black、Heavy |
字体文件 OS/2 表里的 usWeightClass 记录了厂商给的数值,可以用它来对照[3]。
两点要注意:
- 同一个名字下,两条
@font-face不要声明相同的字重和样式。 浏览器会按自己的规则选一个,结果不可控。 - 只有一档的字,就只声明这一档。 不要把一份 Bold 文件声明成 400,也不要给只有一档的字加
font-weight: bold。可以用font-synthesis: none禁止浏览器人工加粗和拉斜,见《在 CSS 里使用:字体名、备用字体和多字重》。
可变字体写一个范围
可变字体一个文件包含连续的字重,用两个值写范围:
@font-face {
font-family: "My Sans VF";
src: url("my-sans-vf.woff2") format("woff2");
font-weight: 100 900;
}
local() 的正确写法
local() 让浏览器先找用户电脑上装好的同名字体,找到了就不下载。写法要点:
- 括号里写字体的完整名称(Full Name)或 PostScript 名,不是家族名;
- 一个
local()只写一个名字,有多个候选就写多个local(),用逗号隔开; - 名字加引号。
src: local("Source Han Sans SC Regular"),
local("SourceHanSansSC-Regular"),
url("source-han-sans-sc-regular.woff2") format("woff2");
什么时候不要用 local():
- 字体被拆成很多分片时,本地装的版本可能和分片的版本不同,字形、字距、覆盖的字都可能不一致;
- 名字太常见时,可能匹配到用户电脑上另一款同名字体[4]。
拿不准就不写 local(),只写 url()。
记得 format()
format("woff2") 告诉浏览器文件格式,不支持的格式会直接跳过,不会白白下载。今天所有主流浏览器都支持 WOFF2,一般只提供 WOFF2 就够了。