Font Awesome 字体图标完整指南:4.x/5.x/6.x 跨版本语法、SVG vs WebFont 渲染、性能与无障碍配置
Font Awesome 从 4.x 到 6.x 的语法、引入方式与渲染机制差异极大,旧教程贴上线就过时。本文按版本横切讲清前缀变化、CDN/本地/npm 三种引入、WebFont 与 SVG 双渲染模式取舍,附字体子集化、preload、ARIA 无障碍等实战优化与升级排坑。
Font Awesome 是网页领域使用最广的字体图标库,从 2012 年的 1.0 版到 2024 年的 6.5 版,这套图标体系已经更迭过四次大版本。绝大多数早年的教程还停在 4.x 时代(fa-* 前缀、单 CSS 文件),但生产环境上现在更常见的是 5.x 与 6.x(fas/far/fab/fa-solid/fa-regular 多前缀、SVG 与 WebFont 双渲染模式、Pro 商业版分离)。本文按版本横切讲清楚每个版本的引用方式、语法差异、实战避坑、性能优化与无障碍配置,所有代码都给出 4.x 与 6.x 两套写法。
Font Awesome 各版本演进与语法差异
4.x(最广泛流行的旧版)
4.7.0 是 4.x 的最终版,2016 年发布,包含 675 个图标。引用方式简单:单一 font-awesome.min.css,所有图标用统一 fa 前缀。直到现在仍有大量博客主题、CMS 默认主题(包括 WordPress 的某些经典主题、ECShop、DedeCMS 老主题)使用 4.x。
<link rel="stylesheet" href="font-awesome/css/font-awesome.min.css">
<i class="fa fa-camera-retro"></i>5.x(架构重写版)
5.x 在 2018 年发布,做了三件大事:拆分图标族(Solid 实心、Regular 线条、Light 细线、Brands 品牌),免费版只含 Solid + Brands + 部分 Regular;引入 SVG with JS 渲染模式,让图标矢量更锐利但增加了 JS 解析开销;推出 Pro 版作为商业产品。语法变化:
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.15.4/css/all.css">
<i class="fas fa-camera-retro"></i>
<i class="far fa-bell"></i>
<i class="fab fa-twitter"></i>fas = solid,far = regular,fab = brands,fal = light(Pro),fad = duotone(Pro)。如果你直接把 4.x 的 fa fa-bell 抄到 5.x 不会显示——前缀必须切换。
6.x(当前主流版本)
6.x 在 2022 年发布,最新到 6.5.x。引入新前缀 fa-solid、fa-regular、fa-brands(替代 fas/far/fab,但旧前缀仍向后兼容)。新增 Sharp Solid、Sharp Regular 等风格族(Pro)。同时把 CDN 的 all.css 拆成多个按需引入文件减少初始下载量。
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
<i class="fa-solid fa-camera-retro"></i>
<i class="fa-regular fa-bell"></i>
<i class="fa-brands fa-twitter"></i>跨版本兼容写法
如果项目正在从 4.x 迁移到 6.x,过渡期可以同时保留两套前缀让模板代码暂时不动。Font Awesome 提供了 v4 shim 文件 v4-shims.css,引入它后旧的 fa fa-camera 在 6.x 下仍能识别,自动映射到 fa-solid fa-camera。这是大型项目升级时最省事的过渡方案。
引入方式对比:CDN、本地、npm
CDN 引入
最快上手,但有几个生产环境需要权衡的点:
- 请求路径多一跳,TLS 握手延迟。如果你的站点本身用 Cloudflare CDN,自托管反而更快。
- 第三方 CDN 可能被墙、可能改协议、可能下线。fontawesome.com 官方 CDN 在中国大陆访问偶有缓慢;jsDelivr 与 cdnjs 相对稳定但仍非 100%。
- 无 SRI(subresource integrity)的 CDN 引用有被篡改风险。生产环境建议加 integrity 与 crossorigin 属性:
<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
integrity="sha512-..."
crossorigin="anonymous">本地引入
把整个 font-awesome/ 目录放到 web 根目录或主题目录下,CSS 文件 + 字体文件一起。文件夹结构:
font-awesome/
├── css/
│ ├── all.min.css
│ └── v4-shims.min.css
├── webfonts/
│ ├── fa-solid-900.woff2
│ ├── fa-regular-400.woff2
│ ├── fa-brands-400.woff2
│ └── ...其它格式
└── js/ (仅 SVG 渲染模式需要)注意 6.x 用 webfonts/ 目录而 4.x 用 fonts/,CSS 内部相对路径不同,混用会拿到 404。
npm 引入(webpack/vite/rollup 项目)
npm install @fortawesome/fontawesome-free
// 或者按需引入 SVG 模式:
npm install @fortawesome/fontawesome-svg-core @fortawesome/free-solid-svg-icons在入口文件:
import '@fortawesome/fontawesome-free/css/all.min.css';这种方式打包工具会处理字体文件路径,无需手动配置。Vite 默认会把 woff2 加上 hash 进 dist/assets/。
WebFont 模式与 SVG 模式的渲染差异
这是 5.x 之后才有的选择。同样的图标在两种模式下表现差异明显:
WebFont 模式
用 ::before 伪元素把字体文件中对应 unicode 字符渲染出来。优点:CSS 体积小(只有几 KB 样式 + 几百 KB 字体)、渲染极快、所有 CSS 文本属性(color、text-shadow、font-size)都生效。缺点:FOIT/FOUT(字体未加载完时图标显示为方框或字母 I)、字体文件加载是阻塞渲染的。
SVG with JS 模式
JS 在 DOM 加载后扫描所有 <i class="fa-..."> 标签,替换成内联 SVG。优点:无 FOIT、矢量极清晰、可对单个 path 单独着色、可直接复制到剪贴板成 SVG。缺点:JS 文件加载与执行有开销(all.min.js 约 1.4MB,gzip 后 350KB),DOM 替换在低端设备上有可见延迟,对 SEO 不友好(爬虫看到的是替换前的 i 标签)。
SVG core 模式(按需引入)
npm 模式独有,只引入用到的具体图标。打包后 JS 体积可以小到 30KB 以内。
import { library } from '@fortawesome/fontawesome-svg-core';
import { faCamera, faBell } from '@fortawesome/free-solid-svg-icons';
import { dom } from '@fortawesome/fontawesome-svg-core';
library.add(faCamera, faBell);
dom.watch(); // 自动替换 i 标签这是性能与可维护性最好的方案,强烈推荐 SPA 项目使用。
常见图标使用语法(按版本)
基础图标
4.x:<i class="fa fa-camera-retro"></i>
6.x:<i class="fa-solid fa-camera-retro"></i>
放大尺寸(fa-lg、fa-2x ~ fa-10x)
fa-lg 让图标相对父级文字放大 33%;fa-2x 放大到 2 倍,最大支持到 fa-10x(5.x 起)。
<i class="fa-solid fa-camera-retro fa-lg"></i>
<i class="fa-solid fa-camera-retro fa-2x"></i>
<i class="fa-solid fa-camera-retro fa-3x"></i>注意:行高(line-height)不会跟着自动调整。如果图标被上下截掉,给父元素加 line-height: 1.5 或更大。
固定宽度(fa-fw)
不同图标的视觉宽度不同(一个 home 图标可能比 cog 宽 30%),混合在列表里会让文字对不齐。fa-fw 强制所有图标占同样宽度。
<a><i class="fa-solid fa-house fa-fw"></i> Home</a>
<a><i class="fa-solid fa-book fa-fw"></i> Library</a>
<a><i class="fa-solid fa-pen fa-fw"></i> Editor</a>
<a><i class="fa-solid fa-gear fa-fw"></i> Settings</a>这是导航菜单、侧边栏、工具栏的标配。
列表图标(fa-ul / fa-li)
替换默认的圆点项目符号:
<ul class="fa-ul">
<li><span class="fa-li"><i class="fa-solid fa-square-check"></i></span>首项</li>
<li><span class="fa-li"><i class="fa-solid fa-square-check"></i></span>次项</li>
<li><span class="fa-li"><i class="fa-solid fa-spinner fa-spin"></i></span>加载中</li>
</ul>4.x 的写法是 fa-li 直接放在 <li> 里:<li><i class="fa-li fa fa-check-square"></i>首项</li>。两种语法在 6.x 都可用,但官方推荐新写法(用 span 包一层)。
边框与浮动(fa-border、fa-pull-left、fa-pull-right)
<i class="fa-solid fa-quote-left fa-3x fa-pull-left fa-border"></i>
正文段落,左侧浮动一个带边框的引号图标,常用于文章引言或推荐位。4.x 是 pull-left,5.x 起改成 fa-pull-left,前缀加 fa- 是为了避免与 Bootstrap 等其它框架的同名 class 冲突。
旋转动画(fa-spin、fa-pulse)
<i class="fa-solid fa-spinner fa-spin"></i>
<i class="fa-solid fa-circle-notch fa-spin"></i>
<i class="fa-solid fa-arrows-rotate fa-spin"></i>
<i class="fa-solid fa-gear fa-spin"></i>
<i class="fa-solid fa-spinner fa-pulse"></i>fa-spin 是匀速旋转,fa-pulse 是按 8 个停顿位旋转(更像传统 loading 动画)。6.x 还新增了 fa-spin-reverse(反向)、fa-spin-pulse(结合两种效果)。
注意:用户开启了 prefers-reduced-motion 系统设置时(无障碍考虑),6.x 默认会停止旋转动画。如果你想强制旋转,可以加:
@media (prefers-reduced-motion: reduce) {
.fa-spin, .fa-pulse {
animation-duration: 1s !important;
}
}但从无障碍角度不建议覆盖这个用户偏好。
旋转角度与翻转(fa-rotate-90/180/270、fa-flip-horizontal/vertical)
<i class="fa-solid fa-shield"></i> 正常
<i class="fa-solid fa-shield fa-rotate-90"></i> 90°
<i class="fa-solid fa-shield fa-rotate-180"></i> 180°
<i class="fa-solid fa-shield fa-rotate-270"></i> 270°
<i class="fa-solid fa-shield fa-flip-horizontal"></i> 水平翻转
<i class="fa-solid fa-shield fa-flip-vertical"></i> 垂直翻转
<i class="fa-solid fa-shield fa-flip-both"></i> 双向翻转(6.x 新增)6.x 还支持任意角度旋转:style="--fa-rotate-angle: 45deg;" 配合 class="fa-rotate-by"。
叠加图标(fa-stack)
<span class="fa-stack fa-lg">
<i class="fa-solid fa-square fa-stack-2x"></i>
<i class="fa-solid fa-camera fa-stack-1x fa-inverse"></i>
</span>
<span class="fa-stack fa-lg">
<i class="fa-solid fa-circle fa-stack-2x" style="color: #1da1f2;"></i>
<i class="fa-brands fa-twitter fa-stack-1x fa-inverse"></i>
</span>
<span class="fa-stack fa-lg">
<i class="fa-solid fa-camera fa-stack-1x"></i>
<i class="fa-solid fa-ban fa-stack-2x" style="color: #e74c3c;"></i>
</span> 禁用相机fa-stack-2x 是底层大图标,fa-stack-1x 是上层小图标,fa-inverse 让上层与底层颜色反差。最常见的用途是社交平台彩色按钮、禁用状态、徽章。
颜色、阴影、动画的 CSS 控制
因为 Font Awesome 本质是字体(WebFont 模式)或 SVG(SVG 模式),CSS 文本相关属性都生效:
.fa-camera-retro {
color: #e74c3c;
text-shadow: 1px 1px 3px rgba(0,0,0,0.3);
font-size: 24px;
transition: transform 0.2s, color 0.2s;
}
.fa-camera-retro:hover {
color: #c0392b;
transform: scale(1.2);
}渐变色需要借助 background-clip:
.fa-gradient {
background: linear-gradient(45deg, #f06, #06f);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}SVG 模式下还可以单独控制每个 path 的颜色(duotone 双色图标 Pro 版本独有)。
性能优化:从 1.5MB 降到 50KB 以内
痛点:默认引入 all.min.css 体积大
FA 6.x 的 all.min.css 文件 100KB 左右,配套 webfonts 总和 1.2MB(包含 Solid、Regular、Brands 三套字体的多种格式)。如果你站点只用了 5 个图标,下载这一坨完全是浪费。
优化方案 A:字体子集化(subset)
用 fonttools(Python 包)的 pyftsubset 命令把字体文件只保留你用到的图标:
pip install fonttools brotli
pyftsubset fa-solid-900.woff2 \
--unicodes="U+F02D,U+F03A,U+F0F3" \
--flavor=woff2 \
--output-file=fa-solid-subset.woff2U+F02D 等是 unicode 码位,可以从 fontawesome.com 的图标详情页或 css/all.css 里查找。这种方式可以把字体从 200KB 降到 5KB。
优化方案 B:按需引入 SVG(推荐 SPA)
用 npm 包按图标 import:
import { library } from '@fortawesome/fontawesome-svg-core';
import { faCamera } from '@fortawesome/free-solid-svg-icons/faCamera';
import { faTwitter } from '@fortawesome/free-brands-svg-icons/faTwitter';
library.add(faCamera, faTwitter);注意 import 路径要精确到具体图标文件而不是整个包,否则 tree-shaking 不会生效。
优化方案 C:CSS preload + font-display
WebFont 加载阻塞渲染会导致 LCP 变差。两个手段:
<link rel="preload" as="font" type="font/woff2"
href="/font-awesome/webfonts/fa-solid-900.woff2"
crossorigin>让浏览器在解析 HTML 时就开始下载字体。同时在 CSS 里设置 font-display:
@font-face {
font-family: 'Font Awesome 6 Free';
font-style: normal;
font-weight: 900;
font-display: swap; /* 字体未加载时先用 fallback 显示,加载完再切换 */
src: url('webfonts/fa-solid-900.woff2') format('woff2');
}font-display: swap 能消除 FOIT,代价是用户可能短暂看到方框,再切换成图标。如果不希望看到方框,用 font-display: optional,3 秒内加载不完就放弃显示这个图标(用 fallback)。
无障碍(ARIA)配置
图标如果是装饰性的(旁边已有文字说明),应当对屏幕阅读器隐藏:
<button>
<i class="fa-solid fa-magnifying-glass" aria-hidden="true"></i> 搜索
</button>图标是唯一信息载体(比如关闭按钮只有 ✕ 没有文字),必须给屏幕阅读器读出意义:
<button aria-label="关闭">
<i class="fa-solid fa-xmark" aria-hidden="true"></i>
</button>aria-hidden 加在 i 标签上避免图标本身被读,aria-label 加在 button 上提供语义。这是 WCAG 2.1 的硬要求,Lighthouse 无障碍打分会扣分。
SEO 角度的考量
Font Awesome 图标本身不会影响 SEO(搜索引擎不渲染字体图标),但有两个间接影响:
- WebFont 模式下加载阻塞影响 LCP,间接影响 Core Web Vitals 评分。如果 Lighthouse 性能分扣到 60 以下,对排名有持续负面影响。
- SVG with JS 模式下,爬虫看到的 HTML 是 i 标签而非渲染后的 SVG。如果你的图标是关键内容(比如商品页的「五星评分」),爬虫拿不到这个信息。建议这种场景用纯 SVG 写法或者 Schema.org Rating microdata 替代。
实战故障与排查
故障 1:图标显示为方框
三种可能:字体文件 404(开发者工具 Network 看 fa-solid-900.woff2 是否 200);CSS 引入失败(看 all.min.css 是否 200);版本前缀错(4.x 写法用在 6.x 主题里)。
故障 2:图标显示为字母「I」或竖线
是字体未加载完全的瞬间状态(FOIT)。如果停留状态超过几秒,说明字体加载失败回退到默认字体,按故障 1 排查。
故障 3:CDN 跨域字体加载被拒
浏览器对 WebFont 的跨域加载有 CORS 限制。如果字体文件托管在 a.com 而 CSS 在 b.com,需要在字体响应头加:
Access-Control-Allow-Origin: *nginx 配置:
location ~* \.(woff|woff2|ttf|otf|eot)$ {
add_header Access-Control-Allow-Origin "*";
}故障 4:图标尺寸异常变大或变小
父元素的 font-size 影响 fa-lg 等相对单位。把图标包在固定 font-size 的容器里:
<span style="font-size: 16px;">
<i class="fa-solid fa-camera fa-2x"></i>
</span>故障 5:fa-spin 在 iOS Safari 不动
iOS 上 prefers-reduced-motion 默认开启的设备会停止动画。这是设备级设置(无障碍 - 减弱动态效果),不是 bug。如果业务必须旋转(比如 loading 必须明显),用纯 CSS 写一个不被该设置影响的动画:
.force-spin {
animation: spin 1s linear infinite;
}
@keyframes spin {
100% { transform: rotate(360deg); }
}故障 6:升级到 6.x 后部分图标找不到
6.x 重命名了几十个图标。例如 4.x 的 fa-home 在 6.x 改成 fa-house,fa-trash 改成 fa-trash-can,fa-question-circle 改成 fa-circle-question。建议查 fontawesome.com 的 Icon Search,输入旧名字会显示「This icon was renamed in 6.x」。
故障 7:自托管字体在 nginx 下 404
常见原因:mime.types 没包含 woff/woff2 类型。修复:
types {
font/woff2 woff2;
font/woff woff;
application/font-ttf ttf;
application/vnd.ms-fontobject eot;
}替代方案对比
2024 年的设计趋势已经从「图标字体」转向「内联 SVG 集合」。值得了解的几个替代品:
- Lucide:fork 自 Feather Icons,1500+ 图标,统一线条风格,纯 SVG,npm 包按需引入。
- Heroicons:Tailwind 团队出品,500+ 图标,与 Tailwind 深度配合。
- Material Symbols:Google 出品的全新一代 Material 图标,可变字体支持 fill/weight/grade 多维度调节,体积小、效果好。
- Tabler Icons:4000+ 图标,免费开源。
- Phosphor Icons:1200+ 图标,6 种风格族(Thin、Light、Regular、Bold、Fill、Duotone)。
如果是新项目,建议直接选 Lucide 或 Material Symbols;如果是老项目维护,Font Awesome 4.x/6.x 的覆盖度仍然够用。
WordPress / Discuz / DedeCMS 集成 Font Awesome
WordPress 集成
functions.php 加:
function enqueue_fontawesome() {
wp_enqueue_style('fontawesome',
'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css',
[], '6.5.1');
}
add_action('wp_enqueue_scripts', 'enqueue_fontawesome');
add_action('admin_enqueue_scripts', 'enqueue_fontawesome'); // 后台也要Discuz X3.5 集成
把 font-awesome/ 目录上传到 source/plugin/yourplugin/font-awesome/,然后在主题的 common/header.htm 里加:
<link rel="stylesheet" href="source/plugin/yourplugin/font-awesome/css/all.min.css">DedeCMS 集成
把 font-awesome/ 上传到 templets/default/style/,在 head.htm 里:
<link rel="stylesheet" href="{dede:global.cfg_templeturl/}/default/style/font-awesome/css/all.min.css">常见问题解答
Font Awesome 4.x 与 6.x 能否在同一项目共存?
不建议。两套 CSS 引入会让 fa 类名解析冲突,部分图标显示混乱。如果必须共存,用 6.x 的 v4-shims.css 替代独立引入 4.x,让旧前缀映射到新前缀。
免费版 Font Awesome 包含多少图标?
6.5.x 免费版包含约 2000 个图标(Solid 1500 + Regular 200 + Brands 470)。Pro 版包含 30000+,含 Light、Thin、Sharp、Duotone 等多个风格族。商业项目如果对图标精细度有要求可以考虑订阅 Pro。
fa-spin 在低端 Android 设备上卡顿?
SVG with JS 模式下 fa-spin 会让浏览器持续 reflow,低端设备 GPU 拉胯时确实会卡。改用 WebFont 模式(CSS animation 由 GPU 合成),或者把旋转动画提取出来用 transform: translateZ(0) 强制开启硬件加速。
引入 Font Awesome 后 Lighthouse 性能分掉了 10 分怎么办?
三步:用 preload 提前加载关键字体;用 font-display: swap 避免阻塞渲染;做字体子集化只保留用到的图标。完成这三步通常能把性能分恢复回原状态。
SVG 模式 vs WebFont 模式选哪个?
SPA 框架项目(React/Vue/Angular)选 SVG 模式(按需引入打包最优);传统 PHP 模板、CMS 主题选 WebFont 模式(无需 JS 处理,渲染最快);对 SEO 敏感的内容页面选 WebFont 或纯 inline SVG。
fa-pull-left 与 Bootstrap 的 pull-left 冲突?
不冲突。FA 5.x 起所有 utility class 都加 fa- 前缀,避免与 Bootstrap、Foundation 等框架的同名 class 冲突。如果你用的是 4.x,确保 Font Awesome CSS 在 Bootstrap CSS 之后引入,让 FA 的样式优先级高。
能否给单个 SVG path 单独着色?
WebFont 模式不行(整个图标是单色字符);SVG with JS 模式可以,用 CSS 变量 --fa-primary-color 与 --fa-secondary-color 控制 duotone 图标的两层色,或者直接修改替换后的 SVG path 的 fill 属性。
引入 Font Awesome 会触发 GDPR 隐私声明吗?
使用 fontawesome.com 官方 CDN 会向 fontawesome.com 服务器发送用户 IP,理论上需要在 GDPR 隐私政策里披露。规避方法:自托管或者用 jsDelivr/cdnjs(这些 CDN 不做用户追踪)。
Font Awesome 商业项目能用吗?
免费版(Free)采用 SIL OFL 1.1 / MIT 双协议,商业项目可以免费使用。Pro 版需要订阅。商用前看清协议条款,特别是关于 attribution 的要求。
Font Awesome 6 与 Material Symbols 哪个更适合中文站点?
Material Symbols 体积小、动态可变字体效果好,但图标偏「Material 设计语言」与中国用户习惯有时不一致;Font Awesome 6 风格更通用,国内国外用户都熟悉。中文站点建议优先 Font Awesome 6 free 版,在需要更多动态效果(比如点击图标时图形微调)时再考虑 Material Symbols。
本文标题:《Font Awesome 字体图标完整指南:4.x/5.x/6.x 跨版本语法、SVG vs WebFont 渲染、性能与无障碍配置》
本文链接:https://zhangwenbao.com/how-to-use-font-awesome-font-icons.html
版权声明:本文原创,转载请注明出处和链接。许可协议: CC BY-NC-SA 4.0