CSS keyframe animation CPU usage is high, should it be this way?
Yes, this is normal because you have several infinite-loop animations on the page. The CPU is therefore continually doing work while these elements are rendered. There is a "magic" property that will significantly cut-down the CPU usage and that is:
transform: translateZ(0);
This will composite the elements into their own layers (by tricking the browser into thinking it will be doing 3D transforms) and the browser should, in most cases, take advantage of GPU acceleration, lessening the burden on the CPU. For me this cut it down by about 20% (almost half).
To read more about this technique take a look at: http://ariya.blogspot.com/2011/07/fluid-animation-with-accelerated.html
Additionally, the more keyframes you have in the animation, the more taxing it will be as well. Just try the animation with the middle keyframe cut out and you will see another substantial (~10-12%) drop in CPU usage.
Lastly, not all properties are equal -- box-shadow is much harder for the browser to animate smoothly than, say, background-color. Leaving all of the keyframes intact but dropping the box-shadow property, using the translateZ(0) trick had my CPU usage hovered at only 10-11%.
As much as it pains me to say this, for infinite-loop animations an animated .gif is going to perform much, much better than CSS3 in the current state of browser animation, especially if you plan for many of them to remain rendered on the page for some time.
Update 2017:
For those still finding their way to this question and answer, translate3d(0, 0, 0)
provides the same benefit as translateZ(0)
, you're just also setting translateX()
and translateY()
at the same time. Please ignore the comment by @Farside as he uses translate3d(X, Y, Z)
in his demo but does not compare it to translate(X, Y)
, which would show that using this technique still makes a significant difference.
According to this question, some people have found better performance across all browsers, especially Chrome, with transform: rotateZ(360deg)
.
100% CPU usage long after CSS3 keyframe animation has finished - how can it be avoided?
The cause of the 100% CPU usage is due to the -webkit-animation-fill-mode: forwards
declaration, if my suspicion that you're doing your primary testing on Chrome is correct.
It looks like it's a current bug with Chrome (tested on version 30.0.1599.101), according to an article by Wercker and my own research:
For this animation we use animation keyframes and the
-webkit-animation-fill-mode: forwards; so that the sidebar retains its position from the last frame of the animation. An animation normally
would snap back to its original setting after it is finished playing.This is great for us, but not for Chrome. The CSS animations using
-webkit-animation-fill-mode: forwards; are causing the 100% CPU load bug. It actually only occurs when the CSS animation ends and the tab
is inactive.
This seems to be corroborated by this issue on the Chromium project page.
As Lindsey Bateman says in the article, the bug is fixed in Chrome Beta and Chrome Canary (33.0.1706.0 canary), so we shouldn't be waiting for very long to get this into current Chrome.
Related Topics
Twitter Bootstrap - Border Pushing Contents Down
Bootstrap Cards with 100% Height and Margin Bottom
How to Make Text Run Top-To-Bottom in CSS
Add "Watermark" Effect with CSS
Min-Width and Max-Width with the Same Value
CSS Hell Simulating Table with Div
How to Compensate for Vertical Scrollbar When It Is Not Yet Present
Bootstrap: Center Some Navbar Items
How to Use a Data Attribute to Set a Background-Image in CSS
Has the ::-Webkit-Selection Selector Ever Been Supported
:Last-Child Pseudo Class Selector in CSS and Internet Explorer
Svg + CSS3 Animation Not Working with Link Markup
Bootstrap Change Carousel Height
Cssrules/Rules Are Null in Chrome