标准答案

  1. canvas 通过脚本在画布上绘制像素,绘制完成后图形本身不是 DOM 节点。
  2. svg 用 XML/DOM 描述矢量图形,每个图形元素都可以被选择、绑定事件和用 CSS 控制。
  3. canvas 适合大量点线、游戏、图片处理、粒子动画和高频重绘。
  4. svg 适合图标、流程图、低到中等复杂度图表、可缩放图形和需要无损缩放的场景。
  5. canvas 的可访问性和事件命中需要额外实现,svg 的节点语义和样式控制更直接。

题目解析

核心差异是 retained mode 和 immediate mode。SVG 保留图形结构,canvas 只保留像素结果。

选型时看图形数量、交互粒度、缩放质量、可访问性和重绘频率。

代码示例

SVG 元素可以直接成为可样式化和可交互的节点。

HTML
<svg viewBox="0 0 100 100" aria-label="完成进度">
  <circle cx="50" cy="50" r="40" fill="none" stroke="#35ad72" />
</svg>

<canvas width="100" height="100"></canvas>

常见误区

  • 认为 canvas 一定比 svg 性能好,忽略图形数量和交互方式。
  • 用 canvas 做少量图标,反而增加适配和可访问性成本。
  • 用 svg 渲染海量图形节点,导致 DOM 和样式计算压力过大。

作者信息