什么是 SVG

为什么越来越多的项目选择 SVG?它到底好在哪里?这一节我们聊聊 SVG 的优势和适合的使用场景。

SVG 的核心优势

1. 无限缩放不失真

这是 SVG 最大的卖点。矢量图的本质是数学公式,放大多少倍都是清晰的。

同一个 SVG,不同尺寸,边缘始终清晰

<svg viewBox="0 0 24 24">
  <circle cx="12" cy="12" r="10" fill="#3498db"/>
</svg>

同样的代码,设置不同的 width/height,图形质量完全一样。这在响应式设计中特别有用。

2. 文件体积小

简单的图形,SVG 文件通常比 PNG 小很多。一个纯色图标可能只有几百字节。

图标对比(500x500 像素):
PNG: 15KB
SVG: 0.5KB

复杂图形另说,但图标、简单插图这类,SVG 优势明显。

3. 可被搜索引擎索引

SVG 是文本格式,里面的文字内容可以被搜索引擎读取。对 SEO 很友好。

<svg>
  <text x="10" y="20">这是一段可搜索的文字</text>
</svg>

相比之下,PNG 里的文字搜索引擎是看不到的。

4. 样式可控制

SVG 可以用 CSS 控制样式,包括颜色、描边、透明度等。还能用 JavaScript 操作。

鼠标悬停试试

.svg-icon {
  transition: all 0.3s;
}
.svg-icon:hover {
  fill: #e74c3c;
  transform: scale(1.2);
}

5. 支持动画

SVG 有三种动画方式:

  • SMIL 动画(SVG 原生)
  • CSS 动画
  • JavaScript 动画

6. 无障碍支持

SVG 支持 <title><desc> 标签,屏幕阅读器可以读出来。这对无障碍访问很重要。

<svg>
  <title>下载图标</title>
  <desc>一个向下的箭头,表示下载功能</desc>
  <path d="..."/>
</svg>

SVG 的局限

优点说完了,也得承认 SVG 的不足:

1. 复杂图形性能差

几万个节点的 SVG,渲染会很慢。这种场景 Canvas 更合适。

2. 不适合照片

照片用 SVG 描述,文件会非常巨大。照片还是用 JPG/WebP 吧。

3. 旧浏览器支持有限

IE8 及以下不支持 SVG。不过现在基本不用考虑了。

适合用 SVG 的场景

图标系统

这是 SVG 最常见的用途。一套图标,多种颜色,无限缩放。

菜单

搜索

用户

设置

数据可视化

折线图、饼图、柱状图,用 SVG 绑制非常方便。D3.js、ECharts 都是基于 SVG 或 Canvas 的。

简单动画

加载动画、进度条、微交互效果。

响应式图片

需要适配多种屏幕尺寸的图形,比如 Logo、插图。

打印输出

SVG 是矢量格式,打印出来和屏幕显示一样清晰。

不适合用 SVG 的场景

  • 照片类图片
  • 复杂的游戏画面
  • 大量粒子效果
  • 实时视频处理

这些场景 Canvas 或 WebGL 更合适。

小结

SVG 的优势:

  • 缩放不失真
  • 文件体积小
  • 可搜索、可样式化
  • 支持动画和无障碍

适合场景:

  • 图标系统
  • 数据可视化
  • 简单动画
  • 响应式图形