CSS 过渡与 JS 动画包的性能

Posted

技术标签:

【中文标题】CSS 过渡与 JS 动画包的性能【英文标题】:Performance of CSS Transitions vs. JS animation packages 【发布时间】:2011-03-01 07:05:28 【问题描述】:

我想知道使用 CSS 过渡与使用各种 javascript 动画库的性能有什么不同吗? (script.aculo.usscripty2jsAnimMooTools$fx 等)。

我在 SafariChrome 中尝试了各种测试,但实际上我并没有发现任何区别。我认为 CSS 过渡应该是硬件加速的。


更新

我尝试在 5 个不同的 DIV 上使用 Scriptaculous'Effect.Fade(每个 DIV 都包含一个带有一些线条的画布)。使用 CSS 转换做同样的事情,我看不出性能上有什么不同。使用一个 DIV/Canvas 时,两者都非常流畅,但当我一次执行 2 个以上时,两者都非常慢。

我已经在 Safari 4、5 (OSX)Google Chrome 5FireFox 3.7pre 中尝试过。全面的结果相同。

在回答 UpHelix 的回复时,您不仅限于 hover 等。您可以通过更改任何 transitionable 样式来触发转换。例如,在 JavaScript 中设置元素的不透明度(之后,您为该元素指定了 transitionProperytransitionDuration)。

【问题讨论】:

需要考虑的一件事(未来 3 年) - 也许您的计算机功能强大,可以轻松运行两者。正如你所说,“两者都非常顺利”。也许尝试一些更边缘的测试,或者在速度较慢的计算机上进行测试。 但还有另一面 - 跨浏览器支持。我有旧网站不能在 FF 中运行,但可以在所有其他浏览器中运行。我认为这是一个严重的问题。 【参考方案1】:

是的,有一点不同,CSS 要快得多。在您同时运行许多人或他们做的更多之前,可能很难看到。不过 CSS 动画是有限的。在大多数情况下,它们实际上只对:hover 事件起作用。使用 JavaScript,您可以在任何情况下执行动画:clickmouseovermousemovemouseoutkeyupkeydown 等。

在我看来,jQuery 是 2010 年最好的 JavaScript 动画。见jQuery Demos

【讨论】:

您可以使用 JS 事件处理程序来触发 CSS 动画(例如,通过向元素添加类名,或直接设置相关样式属性),从而获得两全其美。 @Swordfish0321 不,它没有。你只需使用 JS 来触发 CSS 动画。然后动画本身使用 CSS 过渡完成。 “Jquery 是迄今为止最好的 js 动画”——恐怕需要引用 “查询是迄今为止最好的 JavaScript 动画”。你这个说法的依据是什么? @Mircea 我认为人们认为该声明有效的唯一原因是它是在 2010 年编写的。从那时起情况发生了很大变化。如果有的话,jQuery 动画库是迄今为止最慢的(比其他 JavaScript 动画包慢 20 倍)。【参考方案2】:

CSS 动画具有由浏览器处理的优势。可以进行快速计算和优化。在我看来,网络动画的性能应该从“整体”​​的角度来看。毕竟动画,就FPS而言,不能比浏览器刷新快。

真正的性能水平由整体 UI 性能给出。 JS 和 CSS 动画看起来很相似。然而,CSS 动画获胜,因为它们不会阻塞 UI 线程。

Stoyan Stefanov 编写并演示了如何将 CSS 动画从 UI 线程中取出: http://www.phpied.com/css-animations-off-the-ui-thread/

【讨论】:

【参考方案3】:

补充 Uphelix 的(正确)答案:JavaScript 是一种解释性语言,浏览器的 JS 引擎必须在运行时解析和执行每条指令(我知道存在 JS 编译器,如 V8(在 Chrome 中使用) ,但原理不变)。

另一方面,浏览器可以原生实现 CSS 过渡,例如在 C/C++ 或其他东西中。此代码将被编译为机器语言。

CSS 过渡是否是硬件加速的,取决于浏览器使用的技术、浏览器运行的平台等。

【讨论】:

这听起来很合理,但完全相反的答案(每秒运行 60 次 JS 代码的开销可以忽略不计)也是合理的。解决它的唯一方法是找到与用户拥有的硬件相当的硬件并运行实验。根据这个问题,desau 的实验发现了与这个答案相反的结果——两种方案在实践中的表现是一样的。【参考方案4】:

您会注意到移动浏览器(iPhone、android 等)的差异。

【讨论】:

以上是关于CSS 过渡与 JS 动画包的性能的主要内容,如果未能解决你的问题,请参考以下文章

CSS过渡与动画

CSS3过渡,不再为JS动画而犯愁

CSS 过渡与 CSS 动画

09《Vue 入门教程》Vue 过渡 & 动画

CSS3热身实战--过渡与动画(实现炫酷下拉,手风琴,无缝滚动)

如何触发css3过渡动画