I was recently asked to quote for a proof of concept HTML5 alternative to a flash carousel, specifically to run on iPad. I said I’d do it, but the agency later decided that others had tried to create a HTML5 version and had not been able to create a version that performed well enough for the client. From my point of view they were under the impression I couldn’t do any better. So naturally, I spent a few hours of my spare time proving this wrong, just for the fun of it.
Step 1 was to build a version of the carousel in HTML5. I chose to use the jQuery framework because…well, I felt like it. The fruits of my labour are here:
http://freestyle-developments.co.uk/demo/public/portsurf/
Now, you can view this on any browser. All that is happening is that there are a set of list items absolutely positioned in a container, when you click/touch an item on the left/right jQuery animates the top, left, width, height and opacity CSS values for each item.
Fantastic, but, it feels really sluggish on iPad and iPhone 4. Go on, try it out.
Fair enough, they are resource constrained devices. What to do though? I’ve already used all the tricks I could think of fast loops, select operation caching etc. etc. So what now?
Luckily, in iOS, transitions and animations of the -webkit-transform and opacity properties are performance-enhanced. Sweet! These correspond exactly to the two CSS properties I’m trying to manipulate for each item in my carousel. Implementation was a simple case of swapping out the jQuery animate function, for the css function. Passing in the webkit transition, webkit transform and opacity values in its place.
For example:
items[itemIndex - 3].css({ opacity:1, '-webkit-transform':'translate3d(' + carousel.itemPosition.medium.left.x + 'px, ' + carousel.itemPosition.medium.left.y + 'px, 0) scale(0.5)', '-webkit-transition':'opacity 0.4s linear, -webkit-transform 0.4s linear' });
The webkit transition property is saying “transition these CSS properties from what they were previously to their new values, using these transition parameters (0.4s linear)”. The webkit transform property is saying “move this element to the following coordinates, and scale it by a factor of 0.5″.
Check out the hardware accelerated version on your iPad/iPhone and compare it with the other:
http://freestyle-developments.co.uk/demo/public/portsurf/?ha=1 (Note: webkit only)
Here is a video demonstrating the performance differences those of you without iPads.
Lookin’ good!
Pingback: » Blog Archive » Update: Hardware accelerated alternative to jQuery animate() top, left, width, height and opacity CSS properties for iPhone/iPad
It works well =] Although I did notice that it does not work nicely with the slicedown effect of Nivo slider (top row slices down but the second and third rows remain showing the previous slide)
Are you sure opacity is hardware accelerated as well? I have the impression it is not.
I didn’t say it was.
Impying so: “Luckily, in iOS, transitions and animations of the -webkit-transform and opacity properties are performance-enhanced.”
“Hardware accelerated alternative to jQuery animate() top, left, width, height and opacity CSS properties for iPhone/iPad
Posted on 2010.09.10 by Alan”
You appear to claim that the opacity transition (your alternative) is hardware accelerated. And I would ask the Same question. – just a comment, tour article is interesting
Cool, this just saved me a whole lot of hassle!
You actually created many superb stuff inside
your post, “Hardware accelerated alternative to jQuery animate() top, left, width, height and opacity CSS properties for iPhone/iPad | freestyle
developments”. I’ll end up returning to your web site soon enough. Thx -Earnest