Canvas与SVG的区别

173 阅读1分钟

SVG

SVG 指可伸缩矢量图形 (Scalable Vector Graphics)。 SVG 是使用 XML 来描述二维图形和绘图程序的语言

<svg width="400" height="110">
  <rect
    width="150"
    height="75"
    style="fill: rgb(0, 0, 255); stroke-width: 3; stroke: rgb(0, 0, 0)"
  />
</svg>

Canvas

HTML [canvas] 标签用于通过脚本(通常是 JavaScript)动态绘制图形。

<canvas id="myCanvas" width="200" height="100"></canvas>
<script type="text/javascript">
  var c = document.getElementById("myCanvas");
  var cxt = c.getContext("2d");
  cxt.fillStyle = "#FF0000";
  cxt.fillRect(0, 0, 150, 75);
</script>

Canvas优势

  • 绘制出来的图形是位图具有很好的渲染性能
  • 适合数据量比较大 >1000
  • 大量图形高频率交互
  • 适合游戏
  • 可以导出jpg/png图片
Echarts中的热力图

28cd8e2e6b2c48db84557b10584aef63_tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.awebp

Echarts中的炫光拖尾

f7b19e2067b740b69b96238d1f0b3238_tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.awebp

SVG优势

  • 矢量图放大不失真
  • 支持事件处理器
  • 文字独立、可编辑可搜索 案例选择了一个vue3中的一个demo,通过响应式数据直接渲染svg
<g>
  <polygon :points="points"></polygon>
  <circle cx="100" cy="100" r="80"></circle>
  <axis-label
              v-for="(stat, index) in stats"
              :stat="stat"
              :index="index"
              :total="stats.length">
  </axis-label>
</g>
function valueToPoint (value, index, total) {
  var x     = 0
  var y     = -value * 0.8
  var angle = Math.PI * 2 / total * index
  var cos   = Math.cos(angle)
  var sin   = Math.sin(angle)
  var tx    = x * cos - y * sin + 100
  var ty    = x * sin + y * cos + 100
  return {
    x: tx,
    y: ty
  }
}

对比表格

CanvasSVG
大数据量
高交互场景
可导出图片
放大不失真
支持事件处理
文字可编辑