BLOG · 2026-09-16 Blog · 5 min

字体加载不闪屏

FOIT vs FOUT,三行代码解决字体白屏。

字体导致的白屏和闪烁(FOIT/FOUT)是最伤体感的慢:页面明明加载完了,字就是不出来。三行代码 + 两个习惯,彻底解决。

中文站尤其要注意:中文字体动辄几 MB,不处理必白屏。

核心结论
  • font-display:swap 是底线,先系统字体顶上
  • 只加载用到的字重,中文做子集化
  • 主字体 preload,其他按需
  • 兜底字体栈调好,swap 时不跳动

三行代码

@font-face {
  font-family: "Brand";
  src: url("/fonts/brand.woff2") format("woff2");
  font-display: swap;
}

预加载主字体

<link rel="preload" href="/fonts/brand.woff2" as="font" type="font/woff2" crossorigin>

中文站专项

  • ·标题用定制字体 + unicode-range 子集化,只含常用字
  • ·正文优先系统字体栈,细节差异用户无感
  • ·字重只留 400/700,300/500 按需再加

兜底栈

swap 瞬间的字体 fallback 决定了是否“闪”:挑 x-height 接近的系统字体,行高固定,跳动几乎不可见。

上线前检查清单
  • 01是否有 font-display:swap
  • 02主字体是否 preload
  • 03字重是否 ≤2 个
  • 04中文是否子集化
  • 05兜底栈是否调过行高

常见问题

swap 会导致闪烁吗?

会换一次字形,但比白屏好得多;调好兜底栈后几乎无感。

图标字体还用吗?

新项目用 SVG,图标字体体积大还阻塞,别用了。

Google Fonts 直连慢?

国内自托管 woff2,或走 CDN 代理,别裸连。