无法通过单个 font-weight 值统一 Mac 与 Windows 的粗细表现,因 Core Text 与 DirectWrite 渲染逻辑不同;需用 font-synthesis 控制合成、引入全字重 Web Font 并分层声明回退链。

没法靠单个 font-weight 值“调平”Mac 和 Windows 的粗细差异——这是系统渲染引擎的底层行为,CSS 不具备覆盖能力。
为什么 font-weight: 700 在 Mac 上看着更粗?
Core Text(macOS)和 DirectWrite(Windows)对“加粗”的定义不同:前者主动加厚笔画、增强对比,后者优先保清晰、防糊。同一段文字在高 DPI 屏上笔画粗细能差 20%,这不是你写错了值,也不是浏览器 Bug。
更关键的是:font-weight 数值本身不保证真实字重存在。比如系统字体 "PingFang SC" 或 "Microsoft YaHei" 的 600 和 700 很可能指向同一个物理字形文件,浏览器只能 fallback 到最接近的可用档位,不会插值。
-
-webkit-font-smoothing只在 macOS 生效,Windows 下完全忽略,硬写反而可能干扰 ClearType 策略 - 浏览器默认启用
font-synthesis: all,即自动合成粗体/斜体;Mac 合成更激进,容易发虚,Windows 更保守,导致跨平台偏差被放大 - 直接写
font-family: "PingFang SC", sans-serif,在 Windows 上会 fallback 到sans-serif(通常是 Arial),连字体都换了,粗细自然失控
用 font-synthesis 控制合成行为,减少意外加粗
显式禁用或限制浏览器自动“造粗体”,是最快见效的干预手段。尤其当你已引入完整字重的 Web Font 时,必须关掉合成,否则它会覆盖你精心加载的真实 Bold 字形。
-
font-synthesis: none:强制只用字体文件里真实存在的字重,适合你已提供Regular/Bold/Semibold等完整档位的场景 -
font-synthesis: weight:仅允许合成字重(不合成斜体),比默认值更可控,中文界面推荐这个 - 避免
font-synthesis: all(默认值),中文字体合成粗体后边缘模糊、细节丢失,Mac 上尤其明显
示例:
h2 {
font-family: "Inter", "PingFang SC", "Microsoft YaHei", sans-serif;
font-weight: 700;
font-synthesis: weight;
}
换用支持全字重档位的 Web Font 并正确声明 @font-face
系统字体不可控,真正统一的方式是引入带明确字重映射的 Web Font,并为每个档位单独声明 @font-face。不能偷懒只声明一个 font-family 名 + 多个 font-weight,那样浏览器无法区分物理文件。
- 优先选 Inter、HarmonyOS Sans、阿里巴巴普惠体、PingFangSC(开源苹方字体包),它们提供 300–900 全档位
- 每个字重必须独立
@font-face声明,font-weight值要与文件实际字重严格对应 - 务必搭配
font-display: swap,避免加载期间 fallback 到系统字体造成粗细跳变 - 错误写法:
@font-face { font-family: "MyFont"; src: url("bold.woff2"); font-weight: 700; }→ 缺少400档,正文会失效
构建分层、可预测的字体回退链
直接写 "PingFang SC", sans-serif 是危险的:Mac 用苹方,Windows 用 Arial,Linux 用 DejaVu Sans,三者字宽、x-height、粗细全不同。必须按平台倾向性分层声明,让 fallback 可控。
- 把平台专属字体放在前面:
-apple-system(macOS)、BlinkMacSystemFont(macOS Chrome)、"Segoe UI"(Windows)、"Roboto"(Android) - 中间放你引入的 Web Font 名(如
"Inter"),确保它在所有平台都优先于系统默认 sans-serif - 末尾必须保留
sans-serif,作为通用兜底,否则某些老旧环境会用 serif 字体渲染无衬线内容
典型链路:
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto",
"Inter", "PingFang SC", "Microsoft YaHei", sans-serif;
}
真正难的不是写对某一行 CSS,而是理解:你控制的从来不是“字体本身”,而是浏览器在不同系统上“找字体”的路径和策略。漏掉任意一环——比如没声明 400 档、没设 font-display、回退链里混入未安装字体——都会让前面所有努力失效。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











