I'm trying to build a parallax site, which will move few elements while scrolling the site.
But instead of using a scroll event listener I'm using requestAnimationFrame
, after reading this post by Paul Irish, and this video which said that scroll listener is a bit buggy. My questions are:
- It looks quite smooth in Chrome, but it's flickering badly in Firefox. Did I do something wrong here?
- Does my code actually taking up more resources than using normal scroll event listener? I can hear my laptop fan blazing every time I'm playing with this code.
My file is located at http://www.socialbuzz.com.au/index.html, and please scroll to the bottom of the page to see the element that's being manipulated from javascript.
I have had a similar experience and after much playing around with mouse move listeners and
setInterval
to increase the frequency of the animation steps, I have gone back to just usingonscroll
and find that on FF10 and FF 15 it is working great.Maybe my requirements are not the same as yours - it is an element that tracks the scrollbar so onscroll was the cue to change the position of the box. It lagged behind and was jerky on FF, but worked fine on WebKit and IE. What I found was that
onscroll
did not fire as often on FF as on Chrome/IE.When I initially tried this it would be on FF 5 or 6 though. Using a mouse move listener or a frequent interval, I was able to increase the frequency with which my handle scroll function go called - but this actually had the effect of making the positioning appear choppier. Just using onscroll seems to be working for me now on 10 ESR and 15, maybe they fixed something.
You are not performing an animation; that is, you are not modifying your graphics continuously without user interaction. Your manipulation of the page happens only when the user scrolls and does not continue after the user stops scrolling. Therefore, there is no benefit to using
requestAnimationFrame
, and you should stick to a simple event handler.The purpose of
requestAnimationFrame
is to provide optimal behavior for continuous animation; none of its advantages apply here. A loopedrequestAnimationFrame
which does nothing inside the loop, as you currently have, is entirely appropriate if each step of the loop updates the graphics in some way, but since here nothing changes when the user is not scrolling, the loop does nothing but waste CPU time.An example of when you should use
requestAnimationFrame
is if you had elements which deliberately lagged behind the scrolling and caught up after a moment. The catch-up animation should be done in arequestAnimationFrame
loop which is started from the scroll event handler, and that loop should stop itself when the catch-up finishes.You should have a the scroll event trigger a requestAnimationFrame loop. Do not have requestAnimationFrame triggered by the scroll event itself. You should have something like a var scrolling = true; While this is happening run your requestAnimationFrame loop which references event data from the scroll event. You'll need to debounce the scroll event to turn to loop off once you are finished, it's a chore but the results are worth it. Hope this helps.