博客字体优化手记:从 Safari 差异到自托管字体子集

島主 发布于 阅读:45 建站运维

起因很简单:在 Safari 里打开本站,字体看起来和 Chrome/Windows 不太一样。折腾一番后发现,根源是字体栈里的字体在不同系统上回退到了不同字体。干脆上了「自托管字体子集」方案——字体文件放自己服务器,所有浏览器渲染完全一致。记录一下全过程和踩的坑。

一、问题:同一个网站,不同系统字体不一样

主站正文用的字体栈是 "SimSun"(宋体), "Songti SC", ...——SimSun 是 Windows 专属字体,Mac/iOS 没有,于是 Safari 自动回退到「Songti SC(华文宋体)」,字形和粗细都不一样;加上 Safari 对中文的渲染更细,差别肉眼可见。

博客的问题更隐蔽:正文用的是仿宋栈(FangSong → 仿宋 → STFangsong → ...),但 Mac 和 Windows 上的仿宋根本不是同一个字体,回退结果自然不同。

二、方案:自托管字体子集(全平台像素级一致)

治本的办法是把字体文件放到自己服务器上,让所有浏览器加载同一个文件:

  1. 下载开源字体:思源宋体 Noto Serif SC(Google/Adobe 出品)+ 朱雀仿宋(TrionesType 开源仿宋,博客正文专用)
  2. 用 fonttools pyftsubset 按网站实际用到的字切子集,转 woff2:
    • 主站:只收录本站页面的 1037 个字 → 251K
    • 博客:文章内容 + 主站字符 ≈ 1077 字 → 思源宋体 256K + 朱雀仿宋 340K
  3. CSS @font-face 引用,字体栈把 webfont 放第一位

效果:任何浏览器、任何系统(含 Safari),看到的都是同一个字体文件。

三、中途的一次实验:微软雅黑

中间试过把全部字体换成「微软雅黑 + 不加粗」——结果发现一个事实:微软雅黑是 Windows 专属字体,Mac 上会自动回退成苹方(PingFang),永远无法真正统一。最终回到宋体路线:标题思源宋体、正文朱雀仿宋,保持网站「深墨底 + 衬线」的设计气质。

四、附带的优化

五、踩坑记录:标题为什么会变黑

调整字号时用正则批量改 CSS,结果把 .loglist-title(文章标题)和 .loglist-tag(标签)两条规则误合并了——标题继承了标签规则的 color: #000000,整个首页标题变黑。排查半天才发现是 CSS 规则结构被破坏。

教训:改 CSS 用正则要格外小心,改完必须做两件事——① git diff 逐行检查只改了目标属性;② 校验花括号配对(553/553)。这次就是靠 diff 发现规则被吞并的。

六、最终效果

如果你也遇到「同一网站不同设备字体不一样」的问题,自托管字体子集是目前最可靠的解法——比调字体栈顺序彻底得多。

—— 2026.08.16 于 島上隨筆

文章导出
预览框
生成预览中...

emlog 運維 踩坑

收到18条评论
avatar
android架构师 1 个月前
安卓机型碎片化,字体回退链如果没配好,低端机会渲染异常,子集化反而放大差异。
commentator
島主 1 个月前
@android架构师:回退链配了系统字体兜底,子集化减的是加载体积,回退保证渲染不崩。低端机测过,没放大差异。
avatar
iOS端架构师 1 个月前
苹果设备字体渲染差异大,子集化如果没覆盖苹果的渲染特性,部分字符可能还是走系统字体。
commentator
島主 1 个月前
@iOS端架构师:苹果渲染特性测过了,子集覆盖了常用字符集,没覆盖的回退系统字体,显示不崩,不是硬扛。
avatar
前端架构师 1 个月前
字体优化前端能做的事很多,子集化是基础,但首屏字体加载策略更影响体验,这块有没有做。
commentator
島主 1 个月前
@前端架构师:首屏用了字体预加载和显示策略,子集化是减体积,加载策略是抢时间,两层都做了,不是只做子集。
avatar
安全客 1 个月前
自托管字体要注意 CORS 和子集的版权,别踩字体授权红线。
commentator
島主 1 个月前
@安全客:用的是开源可商用字体,版权清晰。CORS 已配同源,子集是生成不是分发,不侵权。
avatar
学生小王 1 个月前
Safari 兼容投入和用户占比不匹配,大多数是 Chrome 用户。
commentator
島主 1 个月前
@学生小王:Safari 占比确实不高,但首屏视觉一致性是品牌底线,不能按占比取舍。
avatar
运维老兵 1 个月前
自托管字体增加带宽成本,用 CDN 托管更省。
commentator
島主 1 个月前
@运维老兵:CDN 托管有稳定性优势,但自托管可控且无第三方依赖。字体文件 gzip 后很小,带宽可忽略。
avatar
设计狮 1 个月前
字体子集维护成本高,每次加字都要重新生成子集,不如用系统字体栈。
commentator
島主 1 个月前
@设计狮:系统字体栈确实省事,但视觉不可控。子集用脚本自动生成,加字时一键重跑,成本可接受。
avatar
前端小张 1 个月前
Safari 字体差异是渲染引擎特性,花精力抹平不如接受差异,渐进增强。
commentator
島主 1 个月前
@前端小张:渐进增强是正道,但首屏标题字体不一致影响品牌统一,核心视觉不能将就。
avatar
一叶知秋 1 个月前
微软雅黑实验我也干过,结果 Mac 上全是苹方,直接放弃。
commentator
島主 1 个月前
@一叶知秋:自托管字体子集是性能和隐私的平衡。第三方字体服务方便但加了一层外部依赖,断了就全废。