即时创建元素并能够移动元素的最佳方法是什么?例如,假设我要创建一个矩形,圆形和多边形,然后选择这些对象并四处移动。
我了解HTML5提供了三个使之成为可能的元素:svg,canvas和div。对于我想做什么,这些元素中的哪一个将提供最佳性能?
为了比较这些方法,我正在考虑创建三个视觉上相同的网页,每个网页中都有页眉,页脚,小部件和文本内容。第一页中的小部件将完全使用canvas
元素创建,第二页中的完全使用svg
元素创建,而第三页中的使用简单div
元素HTML和CSS创建。
出于您的目的,我建议您使用SVG,因为您会获得DOM事件,例如包含鼠标操作(包括拖放)在内的DOM事件,因此您不必实现自己的重绘,也不必跟踪状态。你的对象。当您需要进行位图图像处理时,请使用Canvas;而当您要处理用HTML创建的内容时,请使用常规div。在性能方面,您会发现现代浏览器现在正在加速这三种浏览器,但是到目前为止,canvas是最受关注的。另一方面,JavaScript编写的好坏对于使画布发挥最大性能至关重要,因此我仍然建议您使用SVG。
了解SVG和Canvas之间的差异将有助于选择正确的产品。
帆布
SVG
我同意Simon Sarris的结论:
我将Protovis(SVG)中的某些可视化与Processingjs(Canvas)进行了比较,后者显示> 2000点,并且processingjs比protovis快得多。
使用SVG处理事件当然要容易得多,因为您可以将事件附加到对象上。在“画布”中,您必须手动进行操作(检查鼠标位置等),但是对于简单的交互而言,这并不难。
还有dojo工具箱的dojo.gfx库。它提供了一个抽象层,您可以指定渲染器(SVG,Canvas,Silverlight)。尽管我不知道额外的抽象层会增加多少开销,但这可能也是一个可行的选择,但是它使交互和动画编码变得容易,并且与渲染器无关。
以下是一些有趣的基准:
关于divs选项,只有我2美分。
著名/臭名昭著和SamsaraJS(可能还有其他)使用绝对定位的非嵌套div(具有非平凡的HTML / CSS内容),结合matrix2d / matrix3d进行定位和2D / 3D转换,并在中等移动硬件上实现稳定的60FPS ,因此我反对divs是一个缓慢的选择。
Youtube和其他地方有很多屏幕录像,浏览器中运行着高性能2D / 3D素材,所有内容都是DOM元素,您可以以60FPS的速度检查元素(与WebGL混合以获得某些效果,但不适用于渲染的主要部分)。
尽管上面的大多数答案仍然有些道理,但我认为它们值得更新:
多年来,SVG的性能有了很大提高,现在,SVG的硬件加速CSS过渡和动画完全不依赖JavaScript性能。当然,JavaScript的性能也得到了改善,并且Canvas的性能也得到了改善,但并没有SVG得到改善。另外,今天几乎所有浏览器中都提供了一个“新手”,那就是WebGL。使用与Simon相同的词语:它击败了Canvas和SVG。但是,这并不意味着它应该成为首选技术,因为它是一种野兽,并且只能在非常特定的用例中更快。
在当今大多数用例中,恕我直言,SVG提供了最佳的性能/可用性比。可视化必须非常复杂(就元素数量而言),同时又必须非常简单(每个元素),以便Canvas甚至更多,WebGL才能真正发挥作用。
在谷歌搜索时,我在http://teropa.info/blog/2016/12/12/graphics-in-angular-2.html中找到了有关SVG和Canvas的使用和压缩的很好的解释。
希望能帮助到你: