根本原因是Firefox(Gecko)依赖字体文件os2.usWeightClass和轮廓厚度,Chrome(Blink)对合成加粗更宽容、笔画增强更明显;需结合font-synthesis控制、完整Web Font字重声明及Firefox禁用document fonts三者协同解决。

font-weight在Firefox和Chrome中视觉粗细不同,不是写错了
根本原因是渲染引擎对字重的解释逻辑不一致:Firefox(Gecko)更依赖字体文件自带的 os2.usWeightClass 和实际轮廓厚度,Chrome(Blink)则对合成加粗更宽容、笔画增强更明显。同一 font-weight: 700 在两浏览器里可能对应不同物理字形,甚至触发不同合成策略。
禁用 font-synthesis 是最直接有效的控制点
默认 font-synthesis: all 会让 Firefox 和 Chrome 各自“脑补”粗体,尤其在中文字体缺失 Bold 档时,Firefox 倾向不合成或弱合成,Chrome 却可能强行加粗发虚。显式关闭能立刻收敛行为:
-
font-synthesis: none:只用字体文件里真实存在的字重,适合你已提供完整 Web Font(如 Inter 300–900)的场景 -
font-synthesis: weight:允许加粗但禁止斜体合成,折中方案,中文下比all稳定得多 - 避免在
@font-face外全局设font-synthesis,优先加在具体文本选择器上,比如h1, .title { font-synthesis: weight; }
Web Font 引入必须带全字重声明,不能靠 fallback
系统字体(如 "Microsoft YaHei"、"PingFang SC")本身没有细粒度字重映射——font-weight: 600 和 700 往往指向同一个物理文件,浏览器只能硬合成。真正可控的方式是引入多档位 Web Font,并为每个字重单独声明:
- 每个
@font-face块必须有唯一font-weight值,且不能共用font-family名混用不同字重文件 - 例如:用
url('inter-bold.woff2') format('woff2')对应font-weight: 700,同时必须配url('inter-regular.woff2')对应font-weight: 400 - 搭配
font-display: swap,防止加载期间回退到系统字体造成粗细跳变
Firefox 需额外关掉 document fonts 才能真正统一
即使 CSS 写了 font-family 和 font-weight,Firefox 默认仍会尊重网页声明的字体权(browser.display.use_document_fonts = 1),导致部分元素(如 button、input、svg text)绕过你的样式。必须手动干预:
立即学习“前端免费学习笔记(深入)”;
- 地址栏输入
about:config→ 搜索browser.display.use_document_fonts→ 设为0 - 配合在设置中将“简体中文”默认字体明确选为
Microsoft YaHei(不是“微软正黑体”或“SimSun”) - 重启 Firefox 生效,否则
font-synthesis和 Web Font 声明都可能被底层绕过
font-synthesis 控制 + Firefox 底层的 use_document_fonts 关闭。漏掉任意一环,都可能在某个浏览器里看到“明明写了 700 却像 500”的现象。


















