跟月影学可视化
月影
前奇虎 360 奇舞团团长,可视化 UI 框架 SpriteJS 核心开发者,《JavaScript 王者归来》作者
30206 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 54 讲
跟月影学可视化
15
15
1.0x
00:00/00:00
登录|注册

03 | 声明式图形系统:如何用SVG图形元素绘制可视化图表?

Canvas对图形元素的用户交互较复杂
SVG的用户交互简单
SVG的渲染性能相对较低
SVG的友好性
声明式 vs. 指令式
SVG生成层级关系图,再用Canvas绘制的不同
使用CSS设置SVG元素样式
SVG与Canvas的区别
SVG的基本用法、优点和局限性
SVG作为图像格式使用
解决方案:虚拟DOM方案
节点数量增加导致DOM树渲染性能瓶颈
用户交互实现上的不同
写法上的不同
添加文字元素
使用g元素建立层级结构
使用createElementNS创建SVG元素
获取SVG对象
使用viewBox属性改变坐标系
坐标系和单位
SVG声明示例
作为图片格式独立使用
可以通过CSS和JavaScript操作
与HTML相似
基于XML语法的图像格式
Scalable Vector Graphics
小试牛刀
要点总结
绘制大量几何图形时SVG的性能问题
SVG和Canvas的不同点
绘制层次关系图
绘制几何图形
SVG
声明式图形系统

该思维导图由 AI 生成,仅供参考

你好,我是月影。今天,我们来讲 SVG。
SVG 的全称是 Scalable Vector Graphics,可缩放矢量图,它是浏览器支持的一种基于 XML 语法的图像格式。
对于前端工程师来说,使用 SVG 的门槛很低。因为描述 SVG 的 XML 语言本身和 HTML 非常接近,都是由标签 + 属性构成的,而且浏览器的 CSS、JavaScript 都能够正常作用于 SVG 元素。这让我们在操作 SVG 时,没什么特别大的难度。甚至,我们可以认为,SVG 就是 HTML 的增强版
对于可视化来说,SVG 是非常重要的图形系统。它既可以用 JavaScript 操作绘制各种几何图形,还可以作为浏览器支持的一种图片格式,来 独立使用 img 标签加载或者通过 Canvas 绘制。即使我们选择使用 HTML 和 CSS、Canvas2D 或者 WebGL 的方式来实现可视化,但我们依然可以且很有可能会使用到 SVG 图像。所以,关于 SVG 我们得好好学。
那这一节课,我们就来聊聊 SVG 是怎么绘制可视化图表的,以及它的局限性是什么。希望通过今天的讲解,你能掌握 SVG 的基本用法和使用场景。

利用 SVG 绘制几何图形

在第 1 节课我们讲过,SVG 属于声明式绘图系统,它的绘制方式和 Canvas 不同,它不需要用 JavaScript 操作绘图指令,只需要和 HTML 一样,声明一些标签就可以实现绘图了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

SVG是一种基于XML语法的图像格式,对于前端工程师来说,使用SVG的门槛很低。它可以用于绘制各种几何图形,并且可以作为浏览器支持的一种图片格式独立使用。本文介绍了SVG的基本用法,包括利用SVG绘制几何图形和层次关系图。与Canvas相比,SVG的写法更类似于HTML,但在动态场景中的渲染性能相对较低。读者通过本文可以快速了解SVG的基本用法和与Canvas的不同之处。 在用户交互实现上,SVG的一个图形对应一个元素,因此像处理DOM元素一样,很容易地给SVG图形元素添加对应的鼠标事件。通过事件冒泡可以处理每个圆上的鼠标事件,实现用户交互功能。但是在绘制大量几何图形时,SVG的性能问题也需要考虑,因为节点数量多会增加DOM树渲染和重绘所需的时间。对于SVG的性能问题,可以使用虚拟DOM方案来减少重绘,但在节点数太多时,仍需依靠Canvas和WebGL来绘图。 总的来说,SVG作为一种浏览器支持的图像格式,具有简单易用、用户交互实现简单等优点,但在绘制大量图形时会面临性能问题。读者可以通过本文了解SVG的基本用法、优点和局限性,以及与Canvas的区别,从而更好地选择合适的技术方案。 在小试牛刀中,读者可以尝试使用CSS设置SVG元素的样式,以及思考SVG和Canvas分别绘制图形的不同之处。欢迎读者在留言区讨论和分享答案和思考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《跟月影学可视化》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(18)

  • 最新
  • 精选
  • Link
    1. 使用 CSS 设置样式的好处:可以将样式和节点解耦,有利于样式的模块化和复用,比如多种主题色,一键换色等。 2. 先用 SVG 生成层级关系图,再用 Canvas 来完成绘制,此时 SVG 将作为一张静态图片被绘制在 Canvas 中。和单独使用 Canvas 绘图相比,这种混合方式代码量更少,代码更加可读,易维护。

    作者回复: 赞~说得挺好的

    2020-06-27
    4
    36
  • Geek_3469f6
    if(target.nodeName === 'text') target = target.parentNode; 请问,这句代码是不是有问题?找到文本节点的父节点,是group节点。设置了fill,有什么用处?

    作者回复: 对,看得非常仔细,这里的确是有问题,应该要设置这个节点之前的那个circle节点而不是group节点,你可以试着把github示例代码里面这块修复一下,然后提交一个pr

    2020-06-26
    4
    7
  • Frojan
    canvas绘制svg,和单独用svg对比,好处是可以规避svg节点过多时的性能瓶颈,但是也失去了svg方便的可交互性。和单独用canvas对比,写法就由写一堆绘制指令变成了写声明式svg加一句绘图指令,单纯绘制性能在绘制指令多且复杂的情况貌似有比较大的提升?(这个不确定svg的解析时间是不是可以忽略) ,但是交互还得使用canvas的方式实现,如果要做动画也会变得麻烦。

    作者回复: 对,有得就有失

    2020-09-06
    5
  • Geek_00734e
    SVG画出来的效果看着更加清晰,canvas画出来的好模糊,这是什么原因啊。尺寸都是一样的

    作者回复: 因为屏幕像素密度问题,根据devicePixelRate不同要将canvas设置对大小

    2021-01-10
    2
    4
  • Cailven
    关于svg,我补充一点,如今微信公众号互动图文支持使用svg制作交互和动画,但不支持js语言,因此掌握原生svg语言非常重要,并不是任何场景都可以使用js来声明和调用该系统的。

    作者回复: 很棒

    2020-06-28
    2
    4
  • coder
    做可视化组件,从性能的角度来讲,是SVG好一些,还是Canvas好一些?

    作者回复: 一般Canvas更好,但也不是绝对的,还需要看具体做什么。绘制图形越多,Canvas相比SVG的性能优势会越明显。

    2020-07-03
    3
  • Geek_07ad60
    还是不太理解声明式和指令式,请老师再详解一下,谢谢!

    作者回复: 之所以说声明式是说svg只要声明一个元素添加到DOM树上就能绘制出来,而canvas则需要调用绘图指令,两者机制有区别。

    2020-06-29
    2
    3
  • 特异型大光头
    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> </svg> <script> const svgroot = document.querySelector('svg'); const circle = document.createElementNS('http://http://www.w3.org/2000/svg', 'circle'); circle.setAttribute('cx', 100); circle.setAttribute('cy', 100); circle.setAttribute('r', 50); circle.setAttribute('fill', '#ff0000'); svgroot.appendChild(circle); </script> </body> </html> 老师为何我创建后,控制台也生成了svg,和circle,但就是页面上显示不出来...

    作者回复: document.createElementNS('http://http://www.w3.org/2000/svg', 'circle'); 这里写错了,应该是http://www.w3.org/2000/svg,你多写了一个http:

    2020-06-26
    2
    2
  • 姚凯伦
    最近也遇到过用svg绘制元素太多导致渲染卡顿问题,后来改用使用一条 path 绘制所有元素,但是 path 一长也同样存在渲染卡顿问题,不知道老师有没有遇到过类似的问题

    作者回复: 是的,path长导致图形绘制得太复杂也会有问题,具体要看你的数据量,如果达到瓶颈,不太好彻底解决,只能换成canvas2d或者webgl。在后续课程性能篇中会有详细的介绍。

    2020-06-26
    2
  • 段亚东
    这两个案例,为什么不直接用div css画呢?

    作者回复: 这节课讲svg呀

    2020-12-09
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部