最可靠的方式是直接写标签。适合纯展示无交互图标,但无法css控制;内联支持变色动画和暗黑模式;适合多图标统一管理;cdn图标字体不推荐新项目使用。

直接写 <svg></svg> 标签最可靠,不用管路径、CDN、MIME 类型或跨域问题。 其他方式看似方便,但每种都有明确的适用边界和容易卡住的坑。
用 <img> 引入本地 SVG 文件
适合纯展示、无交互、不需变色的小图标(比如页脚 logo、分隔线)。
- 路径必须正确:
<img src="/assets/icon-home.svg" alt="首页">,注意是相对路径,且需通过 HTTP 服务访问(双击打开 HTML 会失败) - 浏览器不会解析 SVG 内部结构,
fill、stroke等 CSS 无法穿透控制 - 如果服务器没返回
image/svg+xmlMIME 类型(常见于本地开发服务器配置缺失),部分浏览器会拒绝加载 - 优点是体积小、可缓存、语义清晰
内联 <svg></svg>:填色、动画、暗黑模式都靠它
把 SVG 代码原样贴进 HTML,比如从 iconfont 下载的单个 SVG 文件里复制 <svg>...</svg> 块。
- 必须保留
viewBox属性,否则缩放会失真;删掉width/height,用 CSS 控制尺寸更灵活 - 想让图标随文字颜色变化?把
fill改成currentColor,然后用color: #333或color: var(--text-color)控制 - 加 hover 动画?直接写
<svg class="icon">...</svg>,再在 CSS 里定义.icon:hover path { transform: scale(1.2); } - 缺点是每个图标都增加 HTML 体积,不适合上百个图标的场景
用 <use></use> 复用 SVG 符号(Sprite 方案)
适合中大型项目,图标数量多、需要统一管理、又想保持 CSS 可控性。
- 先建一个
icons.svg文件,里面用<symbol id="icon-search">...</symbol>定义所有图标,放在<defs></defs>里 - 在
index.html的最上方加一个隐藏的<svg></svg>加载这个文件:<svg style="position:absolute;width:0;height:0"></svg>(注意:不能用<link>或<script></script>加载) - 使用时:
<svg class="icon"><use href="/icons.svg#icon-search"></use></svg>—— 注意路径必须和文件实际位置一致,且同域 - 常见错误:
href指向错误、symbol缺少id、icons.svg没被浏览器成功加载(检查 Network 面板)
为什么别急着用 CDN 图标字体(如 Font Awesome)
除非你项目已重度依赖它,否则对新项目不推荐。
- 图标字体本质是字体,
fill不生效,得用color;但有些图标内部用了stroke,就很难统一着色 - 字体加载有延迟,可能闪动;图标不可选、不可索引,对 SEO 和屏幕阅读器不友好
- 全量引入体积大(Font Awesome v6 近 300KB),按需打包麻烦,v6 已默认禁用 Web Fonts,转向 SVG + JS
- 如果你只是要几个图标,CDN 带来的便利远小于它引入的兼容性和维护成本
真正难的不是“怎么放进去”,而是决定哪种方式能扛住后续半年的迭代:图标要不要换色?会不会加点击反馈?有没有暗黑模式?这些需求一旦出现,<img> 就得重写,<use></use> 得补 JS 加载逻辑,只有内联 <svg></svg> 能立刻响应——但别因此全用它,先数清你到底有几个图标。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











