You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

本地加载自定义字体先显默认字体再闪烁切换求助(附示例站点)

解决自定义字体加载闪烁问题

兄弟,你碰到的这个是很常见的**字体加载闪烁(FOUT/FOIT)**问题——浏览器在自定义字体还没加载完成时,会先显示系统默认字体,等字体文件下载完才切换过去,就出现了闪烁的情况。下面给你几个实用的解决方案,按推荐优先级排序:

1. 用font-display属性(最推荐,现代浏览器友好)

这是CSS里专门解决字体加载行为的属性,直接加到你的@font-face规则里就行,不同取值对应不同的策略:

  • swap:优先显示 fallback 字体,等自定义字体加载完成后立刻切换,几乎不会让用户感觉到闪烁,是最常用的选项
  • fallback:短时间(约100ms)等待字体加载,超时就显示 fallback,之后字体加载完再切换
  • optional:和fallback类似,但如果字体加载超时就再也不切换了,适合非核心文本的字体

修改后的@font-face代码示例:

/* Open Sans regular */
@font-face {
  font-family: "Open Sans";
  src: url("./wp-includes/fonts/OpenSans-Regular.eot"); /* IE9 Compat Modes */
  src: url("./wp-includes/fonts/OpenSans-Regular.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */
       url("./wp-includes/fonts/OpenSans-Regular.woff2") format("woff2"), /* 优先用woff2,体积更小加载更快 */
       url("./wp-includes/fonts/OpenSans-Regular.woff") format("woff"), /* Modern Browsers */
       url("./wp-includes/fonts/OpenSans-Regular.ttf") format("truetype"), /* Safari, Android, iOS */
       url("./wp-includes/fonts/OpenSans-Regular.svg") format("svg"); /* Legacy iOS */
  font-display: swap; /* 关键属性 */
}

2. 预加载字体文件

通过<link rel="preload">告诉浏览器优先加载字体文件,减少等待时间,把这段代码放到HTML的<head>里:

<link rel="preload" href="./wp-includes/fonts/OpenSans-Regular.woff2" as="font" type="font/woff2" crossorigin>

注意:即使字体是同域的,也要加crossorigin属性,因为浏览器对字体资源的跨域处理有特殊规则。

3. 优化字体文件体积

字体文件越大,加载时间越长,闪烁越明显。你可以做这些优化:

  • 只保留现代浏览器支持的格式:现在绝大多数浏览器都支持woff2,它的体积比其他格式小很多,你可以只保留woff2格式,删掉旧的eot、svg等格式,大幅减少加载时间
  • 裁剪字体:如果只用到字体里的部分字符,可以用工具裁剪字体,只保留需要的字符,进一步缩小体积

4. 隐藏文本直到字体加载(不推荐,影响体验)

这个方法是让浏览器在字体加载完成前不显示文本,避免闪烁,但如果字体加载失败,用户就看不到内容了,所以谨慎使用:

  • font-display: block;:浏览器会隐藏文本最多3秒,超时就显示fallback字体
  • 或者用JavaScript监听字体加载事件,加载完成后再显示文本,但需要写额外的代码处理降级

内容的提问来源于stack exchange,提问作者Sam Jefferies

火山引擎 最新活动