likes
comments
collection
share

Day26 - Canvas 与 SVG的区别

作者站长头像
站长
· 阅读数 34

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中的热力图

Day26 - Canvas 与 SVG的区别

Echarts中的炫光拖尾

Day26 - Canvas 与 SVG的区别

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
大数据量
高交互场景
可导出图片
放大不失真
支持事件处理
文字可编辑
转载自:https://juejin.cn/post/7057410984914190350
评论
请登录