Font Awesome 这套图标库,我陆陆续续用了快十年。中间不是没折腾过更“新潮”的方案——SVG 雪碧图、IconFont 自建、甚至是纯 CSS 画图标——但每次回到 Font Awesome,都是因为一个最朴素的理由:省心。这玩意儿不需要你维护一套图标管理流程,不需要考虑 SVG 的加载和缓存策略,更不需要担心新来的同事看不懂你的自定义图标命名规则。它就是一套字体,一套把图形编码进字符集的字体,用起来和敲一个字母一样简单。
这篇文章不打算写成官方文档的翻译版,而是从我实际使用的角度,把 Font Awesome 文本图标的原理、用法、踩过的坑、以及一些文档里不会明说的小技巧,都摊开来聊一聊。无论你是刚接触前端的新手,还是想换个更高效的图标方案的老手,这篇文章应该都能给你一些参考。
1. 我为什么还在用 Font Awesome,而不是纯 SVG 图标
先说一个很多人的疑问。现在 SVG 图标组件这么流行,各种图标库层出不穷,为什么还要用 Font Awesome 这种“老古董”字体方案?
从一次真实的项目重构说起。
2020 年左右我接手过一个后台管理系统,前任开发用的是散落的 PNG 和 SVG 图片做图标,命名规则混乱到令人发指——icon-1.png、icon_new_2.svg、微信图片_20200315_143322.png 这种名字全都有。每次 UI 说要换个图标颜色,我都得打开 PS 重新导出一张图。
后来我花了两个晚上把整个项目的图标全部换成了 Font Awesome,操作远比想象中简单:找到模板文件里的图标引用位置,把 <img src="xxx.png"> 换成 <i class="fas fa-user"></i>,再把 CSS 颜色一调,完事。UI 之后提的换色需求,我只需要在 CSS 里改一个 color 属性。
字体图标的底层优势在于它是“文本”。
文本意味着什么?意味着它可以像文字一样被 CSS 控制大小、颜色、阴影、旋转、透明度。这意味着它不产生额外的 HTTP 请求(字体文件可以合并成一个),意味着它天然支持响应式缩放不会失真,意味着它可以通过 font-size 轻松适配不同分辨率的屏幕。
对比一下纯 SVG 方案:
- SVG 图标需要每个图标生成独立的路径数据,要么内联到 HTML 里(页面体积膨胀),要么做成雪碧图(使用起来麻烦)。
- SVG 的
fill颜色控制虽然也灵活,但在某些场景下(比如background-image方式引用 SVG)就没办法通过外部 CSS 改变颜色了。 - 对于不熟悉 SVG 的新手来说,直接操作
<path>的d属性非常痛苦。
当然,SVG 也有它的优势:多色图标支持更好、可以做复杂的动画。但如果你做的是后台管理、工具类网站,图标以功能性为主,单色为主,Font Awesome 的效率是最高的。
提示:如果你需要用多色图标,Font Awesome 5+ 其实也支持了部分的 SVG 框架渲染模式(SVG with JavaScript),但那是另一套玩法,后面我会单独讲。
字体图标的本质:一套“图文编码表”
Font Awesome 本质上做的事情是:它有一套自己的字体文件,里面每个字形(Glyph)对应了一个 Unicode 私有区域编码。当你写 <i class="fas fa-camera"></i> 时,浏览器解析到 ::before 伪元素,取到 \f030(相机的 Unicode 编码),然后在字体文件中找到对应的字形,渲染出来。
这就解释了为什么 Font Awesome 必须配合 CSS 文件使用——CSS 文件负责把 .fa-camera 这个类名映射到 \f030 这个 Unicode 编码上。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 免费版和 Pro版:哪些图标能用,哪些不能用
很多人对 Font Awesome 的版本印象停留在 4.7 时代,觉得这库就几百个图标,翻来覆去那几样。实际上,Font Awesome 6 的免费版已经有超过 2000 个图标了,覆盖了绝大多数日常开发场景。
但是这里有一个很重要的区分:FA6 免费版和 Pro 版是两张不同的“表”。
2.1 免费版(Free)的边界
免费版(我在用的主力版本)大概是这样的结构:
| 版本 | 图标数量 | 样式类型 | 是否可商用 |
|---|---|---|---|
| Font Awesome Free 6 | 超过 2000 个 | Solid(实心)、Regular(常规)、Brands(品牌) | 可以(需保留版权声明) |
| Font Awesome Pro 6 | 超过 30000 个 | 额外包含 Light、Thin、Duotone、Sharp | 需要付费授权 |
免费版最常用的应该是 fa-solid(实心)风格,大部分用户看到的图标都是这个。fa-regular(常规/细线)风格在免费版中数量有限,常见的如 fa-regular fa-user、fa-regular fa-envelope 是有的,但很多细线风格图标是 Pro 专属。
品牌图标(Brands)是个特例。
fa-brands 前缀对应的是品牌图标,比如微信、微博、GitHub、Twitter、Google Play 等。这些图标在免费版中是可以用的,但有一个限制——Font Awesome 禁止把品牌图标用于该品牌的商标注册或 logo 相关用途。虽然实际操作中没人管,但商用项目里最好注意一下。
2.2 Pro 版本值不值得付费
我个人的看法是:如果你做的是商业项目,或者对图标风格的统一性有很高要求,Pro 版本是值得的。它的 fa-light(细线)风格非常漂亮,适合做现代感的 UI;fa-duotone(双色调)可以做出非常吸睛的渐变效果。
但对于大多数中小型项目和个人网站,免费版完全够用。2000 多个图标,就算你每个页面用 20 个,也能撑起 100 个不重样的页面。 当你发现自己需要 Pro 图标时,通常意味着你已经在做相当深度的 UI 定制了。
2.3 版本命名产生的混淆
一个容易踩坑的点:Font Awesome 5 用 fas、far、fab 前缀,Font Awesome 6 换成了 fa-solid、fa-regular、fa-brands。
如果你在网上找到的是 FA5 的代码,直接复制到 FA6 项目里,很可能图标不显示——因为 FA6 的 CSS 把类名映射改了。解决办法:
- 老项目继续用 FA5 的 CDN,或者升级时全局替换前缀
- FA6 仍然兼容
fas,但fa-solid是新写法,建议用新的
3. 文本图标接入方式详解:从 CDN 到自托管
Font Awesome 的接入方式有好几种,每种都有适用的场景。我根据自己的项目经验,逐一对比一下。
3.1 CDN 方式:最快起步,但要防“慢”
Font Awesome 官方提供 CDN 接入:
html复制<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
这是最快捷的方式,复制粘贴就能用。但我在实际项目中发现有几个问题:
- 首次加载速度不稳定:CDN 在国内某些网络环境下速度一般,可能造成图标闪烁(FOUT,Flash of Unstyled Text)。视觉上就是页面先出现一个方框,过一会儿才变成图标。
- 无法离线开发:如果你在无网络环境(内网部署、飞机上写代码)开发,图标全部显示为方框,排查问题时容易误判。
- 很难做到版本锁定与 SRI 完整性校验:CDN 的
all.min.css是根据版本给出的,但如果不锁定具体版本号,CDN 更新后你的代码可能悄悄变化。
注意:生产环境使用 CDN 时,务必在
<link>标签上加上integrity属性(SRI 校验),防止 CDN 被劫持注入恶意代码。例如:
html复制<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
integrity="sha512-xxxxx=="
crossorigin="anonymous" referrerpolicy="no-referrer" />
SRI 哈希值可以在 cdnjs 页面 上查到,首次设置时复制即可。
3.2 下载到本地:最稳妥的自托管方案
我对大部分“体验优先”的项目,推荐下载到本地。操作步骤:
第一步:访问 Font Awesome 官网,下载 Free 版本的压缩包。
第二步:解压后,你只需要保留以下文件:
code复制webfonts/
fa-brands-400.woff2
fa-brands-400.ttf
fa-regular-400.woff2
fa-regular-400.ttf
fa-solid-900.woff2
fa-solid-900.ttf
css/
all.min.css
fontawesome.min.css
有没有注意到 all.min.css 这个文件名?很多教程里只会让你引入它。但 all.min.css 里面的 @font-face 规则引用的字体文件路径是 ../webfonts/fa-solid-900.woff2,如果你的目录结构不对,字体文件加载 404,图标就全部显示为方框。
目录结构保持解压后的相对位置就最保险:
code复制your_project/
css/
all.min.css
webfonts/
fa-solid-900.woff2
...
第三步:在页面中引入:
html复制<link rel="stylesheet" href="css/all.min.css">
搞定。
3.3 npm 方式:工程化项目的最佳选择
如果你用的是 Vue / React / Webpack / Vite 这类现代前端工程,用 npm 管理依赖是更可持续的做法:
bash复制npm install @fortawesome/fontawesome-free
然后在入口文件里引入:
javascript复制// Vue / React 项目的 main.js 或 App.js
import '@fortawesome/fontawesome-free/css/all.min.css';
或者在你的 SCSS 里引入:
scss复制// 使用 SCSS 变量定制图标颜色时,强推这种方式
$fa-font-path: "@fortawesome/fontawesome-free/webfonts";
@import "@fortawesome/fontawesome-free/scss/fontawesome.scss";
@import "@fortawesome/fontawesome-free/scss/solid.scss";
@import "@fortawesome/fontawesome-free/scss/brands.scss";
@import "@fortawesome/fontawesome-free/scss/regular.scss";
通过 npm 方式引入的好处是:版本号由 package.json 锁定,团队成员 npm install 后环境一致;配合打包工具的 tree-shaking(尽管字体文件本身很难 tree-shake),至少 CSS 是按需引入的。
3.4 按需引入:只加载你需要的图标
Font Awesome 官方提供了一种精简方式,叫做 “SVG + JS 按需加载”,但是如果你只想用字体方式,也有一种可行的做法:使用他们的 subset 工具或者手动挑选。
不过说实话,对于字体图标这种方案,按需加载的收益有限,因为整个字体文件也不过几百 KB(woff2 压缩后更小),浏览器缓存一次就完事。如果你真的在意那几百 KB,应该考虑整体换用 SVG 图标方案,而不是在字体图标里做精简约。
4. 文本图标的进阶玩法:从显示到交互
当你能正常显示 Font Awesome 图标后,真正的生产力在于怎么灵活运用它。
4.1 尺寸与对齐:CSS 控制的黄金细节
图标本身是个“文本”,所以你所有对字体做的处理,都可以用在它身上:
css复制/* 基础尺寸控制 */
.fa-solid {
font-size: 24px; /* 图标大小 */
color: #333; /* 图标颜色 */
line-height: 1; /* 防止行高撑开异常 */
}
/* 让图标垂直居中 */
.icon-container {
display: inline-flex;
align-items: center;
justify-content: center;
width: 40px;
height: 40px;
}
图标和文字垂直不对齐是高频问题。 我的经验是:使用 inline-flex 容器包裹图标,再配合 align-items: center 处理。单纯的 vertical-align: middle 可能在某些浏览器或字体设置下表现不稳定。
4.2 旋转与动画:让图标活起来
Font Awesome 自带了一些动画类名:
fa-spin:旋转动画,适合加载中的图标fa-pulse:步进旋转动画,更平滑fa-beat、fa-fade、fa-flip:FA6 新增的动画类,适合做强调效果
比如一个加载中的状态:
html复制<i class="fa-solid fa-spinner fa-spin"></i>
就比手动写 CSS 动画方便太多了。如果要做自定义旋转角度:
html复制<i class="fa-solid fa-arrow-right" style="transform: rotate(90deg);"></i>
这里有个坑:在 Font Awesome 5+ 中,图标的 ::before 伪元素上设置了 display: inline-block,所以你直接在 <i> 标签上写 transform 是有效的。但如果你在 FA4 时代写惯了 fa-rotate-90 这种类名,FA5+ 已经把它移除了(被 fa-rotate-by 替代)。
4.3 图层叠加:用阴影和伪元素做组合图标
Font Awesome 的图标因为是文本,所以可以用 CSS 文本阴影叠加出一些有趣的效果:
css复制.icon-layered {
color: #fff;
text-shadow:
0 0 3px rgba(0,0,0,0.5),
0 0 10px rgba(0,0,0,0.3);
}
如果你需要像地图标记那种“底圆+图标”的叠加:
html复制<span class="fa-layers fa-fw">
<i class="fa-solid fa-circle"></i>
<i class="fa-solid fa-user" data-fa-transform="shrink-6"></i>
</span>
fa-layers 是 Font Awesome 的图层功能,把多个图标堆叠起来。它支持 data-fa-transform 属性做大小变换,shrink-6 代表缩小 60% 左右。这个功能在 FA6 中依然可用,而且非常强大。
4.4 与 JS 交互:动态切换图标
文本图标的另一个优势是:用 JS 操作类名就像操作文本一样简单。
我做过一个常见的场景——展开/收起按钮的状态图标切换:
html复制<button id="toggleBtn">
<i class="fa-solid fa-chevron-down" id="toggleIcon"></i>
展开详情
</button>
javascript复制const btn = document.getElementById('toggleBtn');
const icon = document.getElementById('toggleIcon');
let isOpen = false;
btn.addEventListener('click', () => {
isOpen = !isOpen;
if (isOpen) {
icon.classList.remove('fa-chevron-down');
icon.classList.add('fa-chevron-up');
} else {
icon.classList.remove('fa-chevron-up');
icon.classList.add('fa-chevron-down');
}
});
注意:操作 classList 来切换图标时,只需要切换图标名(fa-chevron-down ↔ fa-chevron-up),不需要重复添加 fa-solid,因为前缀类名在引入时已经全局声明了。
4.5 用 CSS 变量统一管理图标风格
大型项目中,图标风格需要保持一致。我习惯在 :root 中定义一套图标变量:
css复制:root {
--icon-size-sm: 14px;
--icon-size-md: 18px;
--icon-size-lg: 24px;
--icon-color-primary: #409eff;
--icon-color-success: #67c23a;
--icon-color-warning: #e6a23c;
--icon-color-danger: #f56c6c;
--icon-color-info: #909399;
}
.icon-sm { font-size: var(--icon-size-sm); }
.icon-md { font-size: var(--icon-size-md); }
.icon-lg { font-size: var(--icon-size-lg); }
.icon-primary { color: var(--icon-color-primary); }
在 HTML 里使用时:
html复制<i class="fa-solid fa-check icon-sm icon-success"></i>
这样做的好处是:全站的图标尺寸、颜色都统一收口管理,变更配色只需要改一个变量,不用全局搜索替换。
5. Font Awesome 在 Vue / React 中的最佳实践
如果你在用现代前端框架,直接用 <i class="fa-solid fa-user"></i> 也能工作,但有一些更好的集成方式。
5.1 Vue 3 中使用
bash复制npm install @fortawesome/vue-fontawesome @fortawesome/fontawesome-svg-core @fortawesome/free-solid-svg-icons
注册全局组件:
javascript复制import { createApp } from 'vue';
import { library } from '@fortawesome/fontawesome-svg-core';
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';
import { faUser, faEnvelope, faLock } from '@fortawesome/free-solid-svg-icons';
library.add(faUser, faEnvelope, faLock);
createApp(App)
.component('font-awesome-icon', FontAwesomeIcon)
.mount('#app');
使用:
vue复制<font-awesome-icon icon="user" />
<font-awesome-icon :icon="['fas', 'user']" size="lg" />
<font-awesome-icon :icon="['fab', 'weixin']" />
为什么推荐 SVG 集成方式?
对于 Vue 项目,我更推荐使用 @fortawesome/vue-fontawesome 配合 SVG 而不是字体方式。因为 Vue 官方提供了一套组件化的封装,它把图标渲染成 <svg> 标签,这样可以做到按需加载(只打包你用到的图标)。这是构建工具场景下的最优解,能显著减少打包体积。
5.2 React 中使用
bash复制npm install @fortawesome/react-fontawesome @fortawesome/fontawesome-svg-core @fortawesome/free-solid-svg-icons
javascript复制import { library } from '@fortawesome/fontawesome-svg-core';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faUser } from '@fortawesome/free-solid-svg-icons';
library.add(faUser);
function UserIcon() {
return <FontAwesomeIcon icon="user" />;
}
5.3 字体方式与 SVG 方式怎么选
| 场景 | 推荐方式 | 原因 |
|---|---|---|
| 大型后台管理 / 组件库 | SVG + 按需引入 | 打包体积小、组件化 |
| 静态官网 / 博客 | 字体 + CDN | 最简单,无需构建步骤 |
| 多页面老项目(非 SPA) | 字体 + 本地文件 | 维护成本低 |
| 移动端 H5 | 字体 + 本地精简字体 | 渲染性能更好 |
注意:在 Vue / React 中使用字体图标时,图标类名会被 JS 框架当作字符串处理,但仍然有效。你可能会遇到 SSR(服务端渲染)场景下图标闪烁的问题,解决办法是把字体 CSS 放在
<head>中尽早加载。
6. 比官方文档更好用的排查口诀:图标不显示的常见原因
我用 Font Awesome 这些年,遇到过不少图标不显示的情况。这里把常见原因和排查步骤整理出来,方便大家快速定位问题。
6.1 首查:网页控制台有没有 404
绝大多数情况下,图标不显示是因为字体文件 404 了。打开浏览器开发者工具(F12),切到 Network 面板,刷新页面,找找有没有红色的 404 请求。
常见的 404 原因:
- 路径错误:
all.min.css引用的../webfonts/fa-solid-900.woff2根本不存在 - 服务器配置问题:某些静态服务器(如 Nginx)没有正确配置
.woff2文件的 MIME 类型
Nginx 配置示例:
nginx复制location ~* \.(?:woff|woff2)$ {
add_header Access-Control-Allow-Origin *;
add_header Cache-Control "public, max-age=31536000, immutable";
types {
font/woff2 woff2;
font/woff woff;
}
}
如果你用的是常见的 Nginx 默认配置,默认 MIME 类型里可能没有 .woff2,导致浏览器以错误类型解析字体文件,图标不显示。
6.2 二查:类名前缀是否正确
在 Font Awesome 5 和 6 中,前缀规则有变化:
| 图标风格 | FA5 写法 | FA6 写法 |
|---|---|---|
| 实心 | fas fa-user |
fa-solid fa-user |
| 常规 | far fa-user |
fa-regular fa-user(注意:免费版中可用的 regular 图标极少) |
| 品牌 | fab fa-weixin |
fa-brands fa-weixin |
| 细线 | fal fa-user(Pro) |
fa-light fa-user(Pro) |
如果类名写错了,比如 fa-regular fa-user 在免费版中可能不渲染,因为免费版没包含这个字形的 regular 版本。
6.3 三查:图标是否被其他 CSS 覆盖
图标本身是伪元素上的字体内容,如果全局 CSS 不小心设置了 all.min.css 后面的 * 选择器,把背景色或字体样式覆盖了,图标可能表现为空白或方框。
排查方法:在开发者工具中审查元素,看看 Computed 样式里 font-family 是否变成了 Font Awesome 6 Free 或 Font Awesome 6 Brands。如果变了,说明被覆盖了。
6.4 四查:XSS 转义问题
如果你是通过 JS 动态渲染图标 HTML,注意浏览器可能会把 <i class="fa-solid fa-user"></i> 中的引号或尖括号转义,导致类名失效。
这种情况下,建议用 DOM 操作而不是 innerHTML 字符串拼接,或者确保转义正确。
6.5 五查:版本兼容性
老项目升级 Font Awesome 时,最常见的破坏性变更就是类名前缀。我在一个老项目中从 FA4 直接升级到 FA6,除了前缀从 fa 改成了 fa-solid,还有几个图标名称变了(比如 fa-facebook-official 变成了 fa-brands fa-facebook)。全局搜索替换前,最好先在官方图标库中查一下新图标名。
7. 微性能优化:图标字体如何影响你的页面加载
图标字体虽然方便,但如果不在乎性能,会给页面带来一些不必要的负担。这里分享几个我常用的优化手段。
7.1 精简字体文件
Font Awesome 免费版包含三个核心字体文件(solid、regular、brands),但一个页面往往只需要其中一种或两种。如果你自托管,可以只引 all.min.css,但依然会加载全部字体文件。
有一种更精细的方法:使用 fonttools(Python)或 Font Squirrel Webfont Generator 把字体文件裁切成只包含你实际使用的字形。
不过说实话,对于大多数项目,这一步是过度优化。woff2 的压缩率非常高,一个 solid 字体文件压缩后大约 100~150KB,浏览器缓存后影响很小。只有当你的项目首屏有严格的体积预算(比如追求 200KB 以内)时,才需要考虑裁切字体。
7.2 使用 font-display: swap
字体加载过程中,浏览器默认可能会用“阻塞”方式渲染文本——图标会显示为不可见的空白或者方框,直到字体加载完。
Font Awesome 的 CSS 里,官方设置的 font-display 是 block(默认值),这会导致图标在加载完成前显示为空白盒子(invisible box)。
你可以自行覆盖:
css复制@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 的好处是:即使用户网络较慢,图标也不会一直显示为空白,而是先用 fallback 字体(通常是方框或系统字体)渲染,等字体加载完成后替换。缺点是会多出一次字形替换的闪烁(FOUT)。
如果你更在意图标的美观一致性,不介意等字体加载完再显示图标,可以用 font-display: block。但大多数现代网站为了追求首屏可用性,我建议用 swap,并且在字体文件上设置 Cache-Control 强缓存。
7.3 利用预加载和缓存
自托管后,在关键页面加上预加载:
html复制<link rel="preload" href="/webfonts/fa-solid-900.woff2" as="font" type="font/woff2" crossorigin />
这样浏览器可以尽早下载字体文件,减少字体加载完成前的空白时间。
同时,设置合理的 HTTP 缓存头,例如:
nginx复制location ~* \.woff2$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
字体文件不常变更,一年缓存是合理的。
8. 文本图标在特殊场景下的处理:打印、可访问性与 SEO
8.1 打印场景:确保打印时图标不会消失
我在做一个报表系统时,遇到一个坑:设计稿里打印出来的页面带有图标,但我怎么调 print CSS,图标就是不显示。
查来查去,发现是浏览器打印时默认会还原 @font-face 加载策略,可能忽略外部字体文件。解决办法是给打印样式加上强制接受字体:
css复制@media print {
.fa-solid {
font-family: 'Font Awesome 6 Free' !important;
font-weight: 900;
-webkit-print-color-adjust: exact;
print-color-adjust: exact;
}
.fa-brands {
font-family: 'Font Awesome 6 Brands' !important;
}
}
然后要确保图标本身的颜色不要被打印背景色覆盖,必要时给图标文字加上深色。
8.2 可访问性:让屏幕阅读器能够理解图标
Font Awesome 图标本质上是装饰性内容或者承载了一个语义。如果你不处理,屏幕阅读器可能会把 Unicode 私有区的字符念出来(或者是奇怪的方框声)。
官方推荐的写法是:
html复制<!-- 纯装饰性图标 -->
<i class="fa-solid fa-camera" aria-hidden="true"></i>
<!-- 有语义的图标 -->
<span class="sr-only">拍照</span>
<i class="fa-solid fa-camera" aria-hidden="true"></i>
sr-only 是 Font Awesome 内置的一个类,用于“视觉上隐藏但屏幕阅读器可读”的文本。这样,视觉正常的人看到的是一个相机图标,读屏用户听到的是“拍照”这个文本。
这个细节在项目验收时经常被忽略,但属于无障碍测试中必查项。 完善它能为你的项目加分不少。
8.3 SEO 影响:图标不会被收录
字体图标的字符在搜索引擎看来是不可读的(私有区符号),所以如果某个业务关键词是用图标呈现的(比如导航菜单里只有图标没有文本),搜索引擎可能无法理解这个菜单项的含义。
建议在需要 SEO 的页面中,给关键图标配上文本标签,例如:
html复制<a href="/cart">
<i class="fa-solid fa-cart-shopping" aria-hidden="true"></i>
<span class="sr-only">购物车</span>
</a>
或者直接在可见文本里带出关键词:
html复制<a href="/cart"><i class="fa-solid fa-cart-shopping" aria-hidden="true"></i> 购物车</a>
8.4 微信小程序、uni-app 等跨端场景
Font Awesome 字体文件在微信小程序等环境中使用会有限制,因为小程序不允许加载本地字体文件,只能使用 base64 编码的内联字体。
如果你在 uni-app 中一定要用 Font Awesome,可以通过把字体文件转为 base64 后放入 CSS 的方式解决,但字体文件的 base64 体积会膨胀不少。如果你要开发小程序,我更推荐直接用 iconfont(阿里图标库)或者纯 SVG 图片方案,替代 Font Awesome。
9. 把 Font Awesome 和 CSS 框架(Bootstrap、Tailwind)配合使用
Font Awesome 经常和 UI 框架搭配,这里有一些实际经验。
9.1 Bootstrap 5 + Font Awesome
Bootstrap 5 自带了一套 SVG 图标(bootstrap-icons),你可以二选一。我自己在 Bootstrap 项目里更喜欢 Font Awesome,因为它的图标数量更多,风格更统一。
配合方式很简单,在 Bootstrap 的 HTML 模板中直接用:
html复制<button class="btn btn-primary">
<i class="fa-solid fa-download me-2"></i> 下载
</button>
注意:Bootstrap 5 的按钮内图标与文字间距可以用 me-2(margin-end)类控制,Bootstrap 4 则是 mr-2。
9.2 Tailwind CSS + Font Awesome
Tailwind 和 Font Awesome 的合作非常顺畅,因为 Font Awesome 本质上是 CSS 类,Tailwind 是原子类,两者互不干扰。
你甚至可以用 Tailwind 的 @apply 组合图标样式:
css复制@layer components {
.icon-btn {
@apply inline-flex items-center gap-2 rounded px-4 py-2 font-medium text-white bg-blue-600 hover:bg-blue-700 transition;
}
}
html复制<button class="icon-btn">
<i class="fa-solid fa-plus"></i>
新增
</button>
9.3 让我意外的 Tailwind 版图标
顺便提一个有意思的生态情况——Tailwind CSS 的作者之一 Steve Schoger 做过一套开源 SVG 图标,但是 Font Awesome 6 依然是最流行的选择之一。很多时候你用 Tailwind 的 flex + items-center 和 Font Awesome 组合,已经能实现绝大多数 UI 需求。
10. 从 Font Awesome 6 迁移和版本升级的实战经验
最后聊一下版本迁移,这个有很多人会踩坑。
10.1 FA5 到 FA6 的主要变化
FA6 的核心变化包括:
- 命名空间前缀变化:
fas→fa-solid,far→fa-regular,fab→fa-brands - 增加了新图标:FA6 免费版增加约 2000 个新图标
- 断点行为优化:用 CSS 自定义属性支持了更多画布控制
- 新样式
fa-sharp:更锐利、更紧凑的线条
迁移实战步骤:
- 全局替换前缀类名(正则替换即可):
fas fa-→fa-solid fa-far fa-→fa-regular fa-fab fa-→fa-brands fa-
- 确认替换后的大写品牌图标类名是否仍存在——某些图标在 FA6 中改了名字(
fa-500px这种品牌域名图标可能不变,但fa-html5这类关键词变了?实际上我没遇到过大面积改名,但个别图标确实有)——建议用官方图标库搜索对比。 - 将 CSS 引入路径从 FA5 改为 FA6 版本。
- 检查所有
data-fa-transform写法是否符合 FA6 语法(如果你用了图层功能)。
10.2 FA4 到 FA6 的跳跃
如果你和我一样曾有项目直接用 FA4 跳到 FA6,那要注意几个破坏性变化:
- FA4 的
fa前缀在 FA6 中已不再支持(除非用兼容 CSS,官方没有提供完整的 FA4 兼容层) - FA4 的
fa-2x到fa-5x大小类在 FA6 中还可以用,但实现方式已经变了(从font-size改成了transform缩放) - FA4 里的
fa-stack图层功能在 FA6 中仍然保留,但类名和结构更繁琐一些 - 品牌图标:FA4 里有些品牌图标前缀是
fa-,FA6 中统一改为fa-brands fa-,比如fa-weixin应该改成fa-brands fa-weixin
如果是大型老项目,建议在分支上做替换后,用自动化测试或者视觉回归(比如 Puppeteer 截图对比)验证页面上的图标显示是否正常。
10.3 常见问题的兜底方案
如果某个图标在你的项目里实在无法使用,但你又非常需要它,可以在官方图标库里找同义图标替代;如果找不到,试试在 iconfinder 等网站找一个风格接近的 SVG,然后用 mask-image 方式嵌入:
css复制.icon-custom-flag {
display: inline-block;
width: 1em;
height: 1em;
background-color: currentColor;
-webkit-mask: url("data:image/svg+xml,<svg ...>") no-repeat center / contain;
mask: url("data:image/svg+xml,<svg ...>") no-repeat center / contain;
}
这样图标还能继续沿用 Font Awesome 的颜色控制逻辑(currentColor),风格上也能保持统一。
11. 一套我自用的 Font Awesome 起步模板
结合上面的经验,我整理了一个自用的起步模板,可以直接抄作业。
html复制<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Font Awesome 文本图标起步模板</title>
<!-- 自托管 CSS -->
<link rel="stylesheet" href="/css/all.min.css">
<!-- 预加载字体 -->
<link rel="preload" href="/webfonts/fa-solid-900.woff2" as="font" type="font/woff2" crossorigin>
<style>
body {
font-family: system-ui, -apple-system, sans-serif;
padding: 2rem;
}
.icon-title {
display: flex;
align-items: center;
gap: 0.5rem;
font-weight: 700;
}
.icon-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
gap: 1rem;
margin-top: 1.5rem;
}
.icon-card {
display: flex;
flex-direction: column;
align-items: center;
gap: 0.5rem;
padding: 1rem;
border: 1px solid #e5e7eb;
border-radius: 0.75rem;
transition: all 0.2s ease;
}
.icon-card:hover {
border-color: #3b82f6;
box-shadow: 0 4px 12px rgba(59, 130, 246, 0.1);
}
.icon-card i {
font-size: 2rem;
color: #374151;
}
.icon-name {
font-size: 0.75rem;
color: #6b7280;
}
</style>
</head>
<body>
<div class="icon-title">
<i class="fa-solid fa-folder-open" aria-hidden="true"></i>
<span>常用图标示例</span>
</div>
<div class="icon-grid">
<div class="icon-card">
<i class="fa-solid fa-user" aria-hidden="true"></i>
<span class="icon-name">fa-user</span>
</div>
<div class="icon-card">
<i class="fa-solid fa-envelope" aria-hidden="true"></i>
<span class="icon-name">fa-envelope</span>
</div>
<div class="icon-card">
<i class="fa-solid fa-lock" aria-hidden="true"></i>
<span class="icon-name">fa-lock</span>
</div>
<div class="icon-card">
<i class="fa-solid fa-gear" aria-hidden="true"></i>
<span class="icon-name">fa-gear</span>
</div>
<div class="icon-card">
<i class="fa-solid fa-trash-can" aria-hidden="true"></i>
<span class="icon-name">fa-trash-can</span>
</div>
<div class="icon-card">
<i class="fa-brands fa-github" aria-hidden="true"></i>
<span class="icon-name">fa-github</span>
</div>
</div>
</body>
</html>
这个模板可以直接放到你的项目里,按需添加图标卡片。
12. 最后再分享一个我在实际项目里的技巧
可能有些朋友还不知道,Font Awesome 6 的免费版里其实藏着不少不太常见但非常实用的图标。比如:
fa-arrow-right-from-bracket:登出图标fa-bars-staggered:分类/菜单管理图标fa-file-lines:文档图标fa-rotate:刷新/重置图标fa-language:语言切换图标
我习惯在项目初期就建立一个 icons.html 页面,把项目可能用到的图标全部列出来,方便自己和 UI 同学对照挑选。这样既避免了开发到一半发现缺图标、临时去找替代的尴尬,也方便设计稿和最终实现效果对照。
另外还有一个实用习惯——给所有图标加上 title 属性(或者用 sr-only 文本),尤其在后台系统中。因为后台管理系统的操作按钮往往只有图标没有文字,鼠标悬停时有一个提示,能显著降低操作成本。比如:
html复制<button title="删除这条记录" aria-label="删除">
<i class="fa-solid fa-trash-can" aria-hidden="true"></i>
</button>
title 负责鼠标悬停提示,aria-label 负责屏幕阅读器,aria-hidden 告诉读屏略过装饰图标本体,三管齐下。
用 Font Awesome 这么多年,最大的感受就是:图标这件事,选择比努力更重要。 相比自己画、自己拼、自己管理一套图标方案,用一套成熟稳定、社区活跃的文本图标库,能把精力和时间省下来放到真正核心的业务逻辑上。这也是我始终愿意在各种项目里继续用 Font Awesome 的原因——它不一定是最新潮的方案,但一定是最不会给你添乱的方案之一。
