← 字体里的隐藏开关 / 浏览器伪造的粗体与斜体:font-synthesis 待审核 15 / 18
加餐 · font-synthesis

浏览器伪造的粗体与斜体:font-synthesis

给一段文字设 font-weight: boldfont-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 浏览器把大写等比缩小的伪小型大写。