SVG(Scalable Vector Graphics,可缩放矢量图形)是一种基于 XML 的矢量图像格式,用于描述二维图形和图形应用程序。与传统的位图(如 JPG、PNG)不同,SVG 使用数学公式来定义线条、形状和颜色,因此无论放大多少倍,图像都能保持清晰锐利,不会出现像素化。
以下是关于 SVG 的详细介绍和使用指南:
1. SVG 的核心特点
- 无限缩放不失真:这是 SVG 最大的优势。由于它是基于矢量的,图像由路径(path)、圆(circle)、矩形(rect)等几何形状定义,而非像素点。这使得它非常适合图标、Logo、图表和需要适应不同屏幕分辨率(Retina 屏)的场景。
- 文件体积小:对于简单的图形(如图标、线条画),SVG 的代码通常比同等质量的 PNG 或 JPG 文件更小,有助于提升网页加载速度。
- 可被 CSS 和 JavaScript 控制:SVG 本质上是 DOM 的一部分(当直接嵌入 HTML 时)。你可以使用 CSS 改变它的颜色、大小、透明度,甚至添加动画;也可以使用 JavaScript 动态修改其结构或交互行为。
- 可访问性(Accessibility) :SVG 支持
<title>和<desc>标签,可以为屏幕阅读器提供图像描述,提升无障碍体验。 - 文本可选中:SVG 中的文本是真实的文本字符,用户可以直接选中、复制和搜索,而位图中的文字只是图片像素。
2. SVG 的使用方式
在 Web 开发中,主要有三种使用 SVG 的方式:
A. 作为 <img> 标签引入(最简单,但交互性差)
适用于不需要内部交互或样式控制的静态图片。
<img src="logo.svg" alt="公司 Logo" width="200">
- 优点:用法简单,浏览器会缓存图片。
- 缺点:无法通过 CSS 修改内部元素的颜色(如 hover 变色),无法操作内部 DOM。
B. 作为背景图片(CSS Background)
适用于装饰性背景。
.icon {
background-image: url('icon.svg');
background-size: contain;
background-repeat: no-repeat;
}
- 缺点:同样无法控制内部元素样式。
C. 内联 SVG(Inline SVG)(推荐,功能最强)
直接将 SVG 代码复制到 HTML 文件中。
<svg width="100" height="100" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
<circle cx="50" cy="50" r="40" stroke="black" stroke-width="3" fill="red" />
</svg>
- 优点 :
- 完全可控 :可以用 CSS 直接针对
<circle>、<path>等标签写样式(例如:.my-svg circle:hover { fill: blue; })。 - 减少 HTTP 请求:代码直接写在 HTML 里,无需额外请求文件。
- 动画支持:方便结合 CSS Animation 或 JS 库(如 GSAP)制作复杂动画。
- 完全可控 :可以用 CSS 直接针对
- 缺点:代码量较大时会增加 HTML 文件体积,且无法被浏览器单独缓存(除非配合构建工具提取)。
D. 使用 <object> 或 <iframe>
介于两者之间,可以加载外部文件并保留一定的脚本交互能力,但兼容性略复杂,现在用得较少。
3. SVG 的基本结构解析
一个标准的 SVG 文件通常包含以下部分:
<svg
version="1.1"
baseProfile="full"
width="300"
height="200"
viewBox="0 0 300 200"
xmlns="http://www.w3.org/2000/svg">
<!-- 标题和描述(用于无障碍) -->
<title>一个简单的矩形</title>
<desc>这是一个红色的矩形示例</desc>
<!-- 图形元素 -->
<rect x="10" y="10" width="100" height="50" fill="red" />
<text x="20" y="80" font-family="Arial" font-size="20" fill="blue">Hello SVG</text>
</svg>
viewBox:最重要的属性之一。它定义了 SVG 的"可视区域"坐标系(格式:min-x min-y width height)。它让 SVG 能够根据容器大小自动缩放,保持比例。xmlns:XML 命名空间,必须声明为http://www.w3.org/2000/svg。- 常用图形标签 :
<rect>:矩形<circle>:圆形<ellipse>:椭圆<line>:直线<polyline>:折线<polygon>:多边形<path>:路径(最强大,可绘制任意复杂形状,由d属性定义指令)<text>:文本<image>:嵌入位图
4. 实际应用场景
- 图标系统(Icon Systems) :现代前端项目(如使用 Iconfont, FontAwesome SVG 版)普遍使用 SVG 图标,因为它们可以随意改变颜色(
currentColor)和大小。 - 数据可视化:D3.js、ECharts 等图表库底层大量使用 SVG 来绘制动态图表,因为需要频繁操作 DOM 节点。
- 响应式 Logo:确保 Logo 在手机小屏和 4K 大屏上都清晰。
- 交互动画 :利用 SVG 的
stroke-dasharray和stroke-dashoffset属性,可以轻松实现"线条绘制"动画效果。
5. 优缺点总结
| 特性 | 优势 | 劣势 |
|---|---|---|
| 清晰度 | 任意缩放不失真 | 不适合表现照片级真实感的复杂图像(如风景照) |
| 性能 | 简单图形文件极小 | 极其复杂的矢量图(如详细地图)可能导致渲染卡顿,DOM 节点过多 |
| 编辑性 | 代码可编辑,易于版本控制 | 手动编写复杂图形困难,通常需借助设计软件(Illustrator, Figma, Sketch)导出 |
| 兼容性 | 现代浏览器完美支持 | IE8 及以下不支持(现已基本无此顾虑) |
6. 如何获取和编辑 SVG?
- 设计工具:Adobe Illustrator, Figma, Sketch, Inkscape(免费开源)。设计完成后选择"导出为 SVG"。
- 在线编辑器:SVGOMG(用于优化压缩 SVG 代码,去除冗余信息),CodePen(查看和调试代码)。
- 转换工具:可以使用在线工具将 PNG/JPG 转换为 SVG(矢量化),但效果取决于图像复杂度,通常不如原生绘制的 SVG 干净。