第一个 SVG 程序

想学 SVG 却不知道从哪开始?这篇文章用几个实际例子带你入门。不管你是做网页图标、数据可视化,还是简单的图形动画,SVG 都能派上用场。

内联 SVG:最直接的用法

把 SVG 代码直接写在 HTML 里,这是最简单的方式。看下面这个例子:

SVG

完整代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>第一个 SVG 程序</title>
</head>
<body>
  <svg width="200" height="200">
    <rect x="20" y="20" width="160" height="160" fill="#3498db" rx="10" ry="10"/>
    <circle cx="100" cy="100" r="50" fill="#e74c3c"/>
    <text x="100" y="105" text-anchor="middle" fill="white" font-size="14" font-weight="bold">SVG</text>
  </svg>
</body>
</html>

代码里的几个关键点:

写法含义
width="200"画布宽度 200 像素
rect x="20" y="20"矩形左上角在坐标 (20, 20)
rx="10" ry="10"圆角半径 10 像素
circle cx="100" cy="100"圆心在 (100, 100)
text-anchor="middle"文字水平居中

坐标原点在左上角,x 向右增大,y 向下增大。这个和 Canvas 是一样的。


外部 SVG 文件:像图片一样用

SVG 文件可以保存成 .svg 后缀的独立文件,然后用 <img> 标签加载。这样做的好处是方便复用,多个页面都能引用同一个文件。

成功图标

用 img 标签加载的 SVG

HTML 写法:

<img src="success.svg" alt="成功图标" width="100" height="100">

success.svg 文件内容:

<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
  <circle cx="50" cy="50" r="45" fill="#2ecc71"/>
  <path d="M30 50 L45 65 L70 35" stroke="white" stroke-width="6" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

注意几点:

  • xmlns="http://www.w3.org/2000/svg" 必须写,否则浏览器不认识
  • 保存文件时用 UTF-8 编码
  • 作为 <img> 加载时,SVG 内部的动画和交互会失效

SVG 当背景用

CSS 的 background-image 也能用 SVG。这种方式适合做装饰性图案,比如圆点背景、斜线背景等。

SVG 背景图案

CSS 写法:

.pattern-box {
  background-color: #3498db;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Ccircle cx='10' cy='10' r='2' fill='rgba(255,255,255,0.3)'/%3E%3C/svg%3E");
}

这里用了 Data URI 格式,把 SVG 代码编码后直接写在 URL 里。特殊字符要转义:

  • < 变成 %3C
  • > 变成 %3E
  • # 变成 %23

也可以把 SVG 存成文件,然后用 url('pattern.svg') 引用。


SVG 文档的基本结构

一个完整的 SVG 文件长这样:

展示 SVG 基本结构 SVG 结构示例 SVG 基本图形元素

完整代码:

<svg width="300" height="200" viewBox="0 0 300 200" xmlns="http://www.w3.org/2000/svg">
  <defs>
    <linearGradient id="myGradient" x1="0%" y1="0%" x2="100%" y2="100%">
      <stop offset="0%" style="stop-color:#3498db"/>
      <stop offset="100%" style="stop-color:#e74c3c"/>
    </linearGradient>
  </defs>
  <desc>展示 SVG 基本结构</desc>
  <title>SVG 结构示例</title>
  <g id="shapes">
    <rect x="20" y="20" width="80" height="60" fill="url(#myGradient)" rx="5"/>
    <circle cx="160" cy="50" r="30" fill="#2ecc71"/>
    <ellipse cx="250" cy="50" rx="40" ry="25" fill="#9b59b6"/>
    <line x1="20" y1="120" x2="280" y2="120" stroke="#34495e" stroke-width="2"/>
    <polygon points="100,180 130,140 160,180" fill="#f1c40f"/>
    <polyline points="200,180 220,140 240,180 260,140 280,180" fill="none" stroke="#e67e22" stroke-width="2"/>
  </g>
  <text x="150" y="170" text-anchor="middle" font-size="12" fill="#333">SVG 基本图形元素</text>
</svg>

结构说明:

元素作用
<svg>根元素,定义画布尺寸
<defs>存放可复用的定义,如渐变、滤镜
<desc>文档描述,提升无障碍访问性
<title>文档标题,屏幕阅读器会读出来
<g>分组元素,把多个图形打包在一起

viewBox:SVG 的缩放魔法

viewBox 是 SVG 里最容易让人困惑的属性,但也是最强大的。它决定了 SVG 内容如何映射到画布上。

格式是 viewBox="min-x min-y width height",四个值分别代表:视口左上角的 x 坐标、y 坐标、视口宽度、视口高度。

viewBox="0 0 100 100"

viewBox="0 0 50 50"(放大)

viewBox="0 0 200 200"(缩小)

viewBox="25 25 50 50"(偏移)

代码:

<div style="display: flex; gap: 20px;">
  <!-- 正常显示 -->
  <svg width="100" height="100" viewBox="0 0 100 100">
    <circle cx="50" cy="50" r="40" fill="#3498db"/>
  </svg>
  
  <!-- viewBox 较小,内容放大 -->
  <svg width="100" height="100" viewBox="0 0 50 50">
    <circle cx="25" cy="25" r="20" fill="#e74c3c"/>
  </svg>
  
  <!-- viewBox 较大,内容缩小 -->
  <svg width="100" height="100" viewBox="0 0 200 200">
    <circle cx="100" cy="100" r="80" fill="#2ecc71"/>
  </svg>
  
  <!-- viewBox 偏移,只显示部分区域 -->
  <svg width="100" height="100" viewBox="25 25 50 50">
    <circle cx="50" cy="50" r="40" fill="#9b59b6"/>
  </svg>
</div>

怎么理解?把 viewBox 想象成一个"取景框":

  • viewBox 比画布小 → 取景框小,内容被放大
  • viewBox 比画布大 → 取景框大,内容被缩小
  • viewBox 有偏移 → 取景框移动,显示不同区域

这个特性让 SVG 天生支持响应式。只要设置 width="100%",配合合适的 viewBox,图形就能自动适应容器大小。


写在最后

这篇文章介绍了 SVG 的几种使用方式:

  1. 内联 SVG:代码直接写在 HTML 里,适合简单图形
  2. 外部文件:用 <img> 加载,方便复用
  3. CSS 背景:做装饰性图案很方便
  4. viewBox:控制缩放和显示区域,响应式必备