全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-17 10 分钟 ✍️ juanwangdev

HTML SVG与矢量图形

SVG是矢量图形标准,支持无损缩放、CSS样式和JavaScript交互。

SVG嵌入方式

内联SVG

HTML
<svg width="100" height="100" viewBox="0 0 100 100">
  <circle cx="50" cy="50" r="40" fill="blue"/>
</svg>

img标签引用

HTML
<img src="icon.svg" alt="图标" width="50" height="50">

CSS背景

CSS
.icon {
  background-image: url('icon.svg');
  background-size: contain;
}

嵌入方式对比

方式样式控制JS交互适用场景
内联CSS可控支持动态图形、图标
img不可控不支持静态图片
CSS背景不可控不支持装饰图案
object部分可控有限独立SVG文件

基本图形元素

矩形

HTML
<rect x="10" y="10" width="80" height="60" rx="5" fill="#336699"/>

圆形

HTML
<circle cx="50" cy="50" r="40" fill="orange"/>

椭圆

HTML
<ellipse cx="50" cy="50" rx="60" ry="30" fill="green"/>

线条

HTML
<line x1="0" y1="0" x2="100" y2="100" stroke="black" stroke-width="2"/>

折线

HTML
<polyline points="0,0 50,50 100,25" fill="none" stroke="red"/>

多边形

HTML
<polygon points="50,0 100,50 50,100 0,50" fill="purple"/>

路径

HTML
<path d="M10,10 L90,10 L50,90 Z" fill="teal"/>

path路径详解

路径命令

命令说明示例
M移动到M10,20
L直线到L50,60
H水平线H80
V垂直线V40
C三次贝塞尔C20,20 80,20 50,50
S平滑三次贝塞尔S80,80 100,50
Q二次贝塞尔Q50,0 50,50
T平滑二次贝塞尔T100,50
A弧线A30,30 0 1,1 100,50
Z闭合路径Z

大写为绝对坐标,小写为相对坐标。

路径示例

HTML
<!-- 心形 -->
<path d="M50,30 C20,0 0,30 50,70 C100,30 80,0 50,30" fill="red"/>

<!-- 箭头 -->
<path d="M10,25 L40,25 L40,10 L70,30 L40,50 L40,35 L10,35 Z" fill="#333"/>

渐变

线性渐变

HTML
<defs>
  <linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="0%">
    <stop offset="0%" stop-color="#ff0000"/>
    <stop offset="100%" stop-color="#0000ff"/>
  </linearGradient>
</defs>
<rect width="100" height="50" fill="url(#grad1)"/>

径向渐变

HTML
<defs>
  <radialGradient id="grad2" cx="50%" cy="50%" r="50%">
    <stop offset="0%" stop-color="white"/>
    <stop offset="100%" stop-color="black"/>
  </radialGradient>
</defs>
<circle cx="50" cy="50" r="40" fill="url(#grad2)"/>

滤镜效果

模糊

HTML
<defs>
  <filter id="blur">
    <feGaussianBlur stdDeviation="3"/>
  </filter>
</defs>
<circle cx="50" cy="50" r="30" fill="blue" filter="url(#blur)"/>

阴影

HTML
<defs>
  <filter id="shadow" x="-20%" y="-20%" width="140%" height="140%">
    <feDropShadow dx="3" dy="3" stdDeviation="2" flood-opacity="0.5"/>
  </filter>
</defs>
<rect width="80" height="50" fill="white" filter="url(#shadow)"/>

动画

SMIL动画

HTML
<circle cx="50" cy="50" r="20" fill="orange">
  <animate attributeName="r" from="20" to="40" dur="1s" repeatCount="indefinite"/>
  <animate attributeName="fill" values="orange;red;orange" dur="2s" repeatCount="indefinite"/>
</circle>

CSS动画

HTML
<style>
  @keyframes rotate {
    from { transform: rotate(0deg); }
    to { transform: rotate(360deg); }
  }
  svg.icon { animation: rotate 2s linear infinite; }
</style>
<svg class="icon" width="50" height="50">
  <rect width="50" height="50" fill="blue"/>
</svg>

JavaScript动画

JavaScript
const circle = document.querySelector('circle');
let r = 20;
setInterval(() => {
  r = r >= 40 ? 20 : r + 1;
  circle.setAttribute('r', r);
}, 50);

viewBox与坐标系统

HTML
<svg width="100" height="100" viewBox="0 0 200 200">
  <!-- viewBox定义内部坐标系统,width/height定义显示尺寸 -->
</svg>
  • viewBox: "min-x min-y width height" 定义SVG内部坐标
  • preserveAspectRatio: 控制viewBox如何适配viewport
HTML
<svg viewBox="0 0 100 100" preserveAspectRatio="xMidYMid meet">
  <!-- meet: 保持比例,slice: 裁剪填充 -->
</svg>

SVG与Canvas对比

特性SVGCanvas
类型矢量位图
缩放无损有损
DOM可访问不可访问
事件原生支持需手动计算
性能大量元素差大量绘制好
适用图标、图表游戏、图像处理

要点总结

  • 内联SVG可被CSS样式化和JS操作
  • path是最强大的图形元素
  • 渐变和滤镜定义在defs中
  • viewBox控制内部坐标系统
  • 三种动画方式:SMIL、CSS、JavaScript
  • 图标/图表用SVG,游戏/图像处理用Canvas

📝 发现内容有误?点击此处直接编辑

← 上一篇 HTML表单高级控件
下一篇 → HTML iframe与嵌入内容
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库