我正在开发一个网络应用程序;其中一个设计要求是几个大型CSS3动画。
具体来说 - 它有一个很大的<div>
,它将在屏幕上转换以响应用户输入。
由于应用程序的设计方式,<div>
的“内容”可以实现为设置为<div>
的大型静态图形(例如,.jpg或.png)背景
或者,内容也可以使用标准HTML实现。 (内容布局本身是一个“小”的棘手 - 它需要几个浮动或定位的嵌套div元素和跨度,但没有什么疯狂。)
我的问题是 - 哪个选项可能会产生最好(最流畅)的动画?
(我显然可以自己测试一下,但通常很难判断动画的流畅程度,特别是在各种设备上的十几种不同的浏览器中。我也意识到还有其他考虑因素 - 例如维护。但是在这种情况下,我完全专注于动画表现。)
我想知道浏览器是否通常更好地动画/渲染简单的DOM元素 WITH 图形背景,或更复杂的DOM元素(有很多孩子) 没有 图形元素?
另外 - 还有其他指导方针吗?如,
position:absolute
,子元素浮动时,或子元素的位置是否由常规文档流确定时,浏览器是否更好地为元素设置动画?我对这些事情有直觉(深层嵌套的DOM元素将比简单元素更不容易动画),但我的直觉常常是错误的。所以,我想知道是否存在关于浏览器或多或少有用的“规则”。
当具有大量子元素的大元素被动画化时,我还应该考虑什么呢?
答案 0 :(得分:2)
您的答案将取决于每个实施所使用的具体呈现策略,但如果您可以将WebKit的策略用作“常规”策略,那么您的所有答案都在本文档中:
http://www.chromium.org/developers/design-documents/gpu-accelerated-compositing-in-chrome
首先创建DOM树的“RenderObject”克隆
在此之后,遍历树并将每个RenderObject合并到其最近祖先的RenderLayer中 如果其中一个对RenderObject是真的,请转到一个新的RenderLayer中:
<canvas>
元素<video>
元素在此之后,遍历树并将每个RenderLayer合并到其最近祖先的GraphicsLayer中 如果其中一个是关于RenderLayer的,那么或者进入一个新的GraphicsLayer:
<video>
元素使用加速视频解码来使用图层<canvas>
元素使用因此,我知道这通常如何工作并在这里采取预感,我不得不说首先最小化导致创建新GraphicsLayer的事情然后最小化导致创建新RenderLayer的事情。只要额外的节点不会导致新的RenderLayers或GraphicsLayers的创建,你就可以逃脱大量的DOM节点嵌套或者你正在讨论的任何东西。
还有关于发送DOM元素向量的位图图像而不是向量本身的想法。我真的怀疑它会更快。对我来说,PNG或JPEG以某种方式表示DOM节点比向量更有效的方式对我没有任何意义。但是,嘿,我没有编写Webkit代码,所以我想真正知道的唯一方法就是对它进行分析。