过去我在javascript中做了很多,包括一些DOM操作。 从那里我了解到,在某些情况下,回流/重新喷涂可能是一个很大的性能问题,通常应该限制在最低限度。例如,在添加一组div时,您应该一次添加所有div(将它们附加到DOM外部的div,然后附加它),而不是逐个添加它们。重绘也是如此,可以通过更改元素的CSS属性来触发重绘。虽然我必须承认我从未考虑过那么多的重绘,所以我可能在最后一部分上错了。
这是否也适用于SVG(看到它使用一种看似合理的DOM)?不同的SVG元素有区别吗?例如,动画元素不会创建回流是有意义的,因为它不是新的SVG元素,而更像是属性。
我不确定的是重新修改SVG,它们的存在方式与CSS / HTML相同吗?所有的SMIL动画都已经创建了框架,所以像#"重绘"可能没有任何区别,因为无论如何都要渲染新的框架。
任何对SMIL内部运作有更深入了解的人都可以为我澄清这些事情吗?
答案 0 :(得分:3)
您的信息已过期。这些天UAs批量回流,因此您不再需要在DOM之外附加div。
SVG并没有真正的回流,因为它基本上都是绝对定位的,所以改变一个元素的位置只会对该元素和任何后代产生影响。 SVG DOM更改只会导致重新绘制。如果适当的数据在图形内存中,有时甚至不需要重新绘制,因为instand翻译变换通常几乎完全由图形硬件渲染器处理,而不会重新绘制这些天。 SMIL动画也融入了这种机制。
如果SVG内容具有翻译属性,则将其存储在单独的图层中。在许多情况下,可以更新图层而无需重新渲染,例如翻译为图形系统只需绘制他们需要去的图层。
有关于how this works in Firefox here的更多文档,但其他UA也以类似的方式工作。