浏览器伪造的粗体与斜体:font-synthesis
给一段文字设 font-weight: bold 或 font-style: italic,如果当前字体没有对应的 bold / italic 字面,浏览器并不会报错,而是算法伪造一个:把常规字形的轮廓加粗(faux bold),或整体倾斜(faux oblique)。这层兜底由
font-synthesis 控制——它决定浏览器在缺字面时是否允许合成。与 font-variant-caps 页演示的「真小型大写 vs 浏览器合成」是同一个机制的不同分支:font-synthesis 统管 weight / style / small-caps /
position 四类合成。
1 · 真字面 vs 浏览器合成
| 请求 | 字体有真字面 | 字体缺字面 + 允许合成 | 字体缺字面 + 禁止合成 |
|---|---|---|---|
font-weight: bold |
用设计师调好的 bold 字面,笔画粗细均匀 | faux bold:把 regular 轮廓向外膨胀 / 重描,笔画变粗但粗细不均、字间距偏挤 | 退回 regular 字重显示 |
font-style: italic |
用专门设计的 italic 字面,a / g / f 常是另一套手写体字形 |
faux oblique:把直立字形整体倾斜(shear),字形结构不变,只是斜了 | 退回直立(upright)显示 |
合成只是「应急兜底」:几何变换无法重现真字面里的笔画修正与字形重绘,放大后区别明显。能用带齐全字面的字体就不该依赖它。
2 · 取值与四个 longhand
| 属性 / 取值 | 控制的合成 | 默认 |
|---|---|---|
font-synthesis-weight |
缺 bold 字面时是否合成伪粗体 | auto(允许) |
font-synthesis-style |
缺 italic 字面时是否合成伪斜体 | auto |
font-synthesis-small-caps |
缺 smcp 字形时是否合成小型大写(见 font-variant-caps 页) |
auto |
font-synthesis-position |
缺字形时是否为 font-variant-position 合成上 / 下标 |
auto |
font-synthesis: none |
简写:全部关闭,四类合成一律退回原字形 | — |
font-synthesis: weight style |
简写:只列出允许的轴,未列出的即关闭(此例关闭 small-caps / position) | — |
简写 font-synthesis 的语义是「白名单」:列出的轴允许合成,没列出的全部禁止;none 等于全禁。四个 longhand 各自取 auto / none。
图标字体务必 font-synthesis: none:icon font 把图标塞进各码位,只有一个字面。一旦某处样式继承了 font-weight: bold,浏览器会对图标轮廓做 faux bold,图标因此变形发糊、对不齐像素网格。给图标容器显式设 font-synthesis: none(或用真有多字重的图标字体)可避免。
为什么需要这个开关:大多数场景合成是有用的兜底——字体没做 bold / italic 时仍能近似呈现层级。需要关闭它的是少数:其一,图标字体(见上);其二,设计上明确不想要伪斜 / 伪粗,宁可退回常规也要保证字形纯净;其三,检验某字体是否真的含某字面(合成关掉后若样式无变化,说明那是真字面)。注意合成的伪斜体在可访问性树与文本选择里仍是原文本,只是视觉变换。
3 · 相关链接
- font-synthesis · MDN——developer.mozilla.org。简写与 weight / style / small-caps / position 四个 longhand 的取值(auto / none);控制缺字面时浏览器是否合成。
- font-synthesis-style · MDN——developer.mozilla.org。伪斜体的开关:auto / none,以及 oblique-only 取值(允许斜体但仅用倾斜变换,不用真 italic 字面)。
- 同系列:font-variant-caps——font-features。font-synthesis 的 small-caps 分支在那页演示:真小型大写 vs 浏览器把大写等比缩小的伪小型大写。