SVG与Canvas
- canvas 是一个画布,绘制出来的图形是位图
- svg 绘制的是矢量图。不会失真
SVG与Canvas比较
-
svg 是一种矢量图,而 canvas 依赖于分辨率。所以 svg 放大不会失真,但是 canvas 绘制的图形会失真。
-
svg 支持事件处理器,而 canvas 不支持事件处理器。
-
svg 中的文字独立于图像,文字可保留,可编辑和可搜索,canvas 的文本渲染能力弱。
-
canvas 适合图像密集型的游戏,频繁地重绘图像,svg 绘制的复杂度高时减慢渲染的速度。
-
canvas 绘制的图形可以多种格式 (jpg、png) 保存图片,但是 svg 绘制的只能以 .svg 格式保存,使用时可以引入 html 文件。
-
canvas 适合开发游戏,svg 不适合游戏应用。
什么是Canvas污染?
Canvas污染
将一张跨域的图片绘制到 canvas 上,这个 canvas 就是被污染的,此时无法读取该 canvas 的数据
- 目的:禁止使用
canvas随意从另一个网站加载图片再转换成数据的强盗行为。
如何解决 canvas 污染的问题?
- 1、可以把所有图片都重定向到同一个域名下
- 2、可以把图片转换成base64,然后放到img标签里面,再绘制到canvas
canvas如何进行局部刷新(局部重绘)
局部重绘 简单来说 就是就是只绘制变化的部分,不变化的部分就不用绘制了
- 不需要清空 Canvas 的全局区域,而是根据运动的元素的范围来清空部分区域
canvas性能分析/优化
- 哪些因素会影响canvas的性能
- canvas优化的几种方式
浏览器的刷新频率是 60赫兹
-
绘制的图形的数量和大小会影响canvas的性能
-
图形数量过多,但是只刷新部分 可以使用局部渲染
-
如果某些长时间的逻辑影响主线程,可使用WebWorker
-
利用分层渲染复杂场景
canvas分层渲染
https://www.codingsky.com/doc/2021/12/12/98.html
有时候全量绘制是没有必要的,只渲染发送变化的内容,降低渲染的开销,提高渲染性能
- Canvas 画布自身并不支持分层,为了实现分层需要我们引入多个
<canvas />元素。每个<canvas />元素就是一个分层
SVG与Canvas如何选择?
- 事件处理问题:canvas 绘制的图形,只能给 canvas 整个画布添加事件,而不能给某个图形或文件添加事件处理器,但是 svg 支持事件绑定,如果需要添加带有事件的动画效果时,就需要选择 svg。
- svg 绘制的是矢量图,放大后不会失真,比较适合地图
svg动态颜色设置
- 如果需要css动态设置svg颜色,不要写死svg颜色,否则无法通过css来设置
- fill、stroke都指定
currentColor currentColor是一个 CSS 关键字,会取当前元素或者父元素的color值