使用 font-display: swap 是解决 css 图标库加载闪动的最有效方案,需在 @font-face 中设置而非 link 标签;配合 woff2 格式、preload 和 svg 替代可进一步优化。

CSS图标库加载后闪动,本质是字体文件异步加载导致的“FOIT(Flash of Invisible Text)”或“FOUT(Flash of Unstyled Text)”。使用 font-display 是最直接有效的解决方案。
font-display 属性的作用
它控制自定义字体(比如图标字体:FontAwesome、iconfont 等)在加载过程中的渲染行为,决定浏览器是“先显示空白/回退字体”还是“等字体加载完再显示”,从而避免图标突然出现或文字跳变。
常用值及适用场景
- font-display: swap; —— 最推荐用于图标字体。字体未加载时,先用系统默认字体(或无内容)占位,加载完成后立即替换。用户几乎看不到空白,图标“闪一下”变成正常图标,体验自然。
- font-display: fallback; —— 短暂等待(约100ms),若未加载则用后备字体,之后即使字体加载完成也不替换。适合对图标一致性要求不高、但要避免任何闪动的场景。
- font-display: optional; —— 完全由浏览器决定是否加载该字体。网络慢时可能不加载图标,需配合 js 回退逻辑,一般不建议图标库使用。
如何正确配置 font-display
不能只靠 <link> 标签设置,必须配合 @font-face 规则生效:
✅ 正确写法(以 Iconfont 为例):
立即学习“前端免费学习笔记(深入)”;
@font-face {
font-family: ‘iconfont’;
src: url(‘iconfont.woff2’) format(‘woff2’);
font-display: swap;
}
⚠️ 注意:<link rel="stylesheet"> 本身不支持 font-display 属性;它只是引入样式表,真正起作用的是样式表内部的 @font-face 声明。
额外优化建议
- 优先使用
.woff2格式,体积小、兼容好,加快加载速度。 - 图标字体尽量内联关键图标(如首页高频图标),或用 SVG Sprite 替代,彻底规避字体加载问题。
- 搭配
preload提前加载字体:
基本上就这些。核心就是:改 @font-face,设 swap,别指望 <link> 标签自己搞定。