jQuery Infinite Carousel
Posted on 11th June 2009 — With jQuery for Designer‘s redesign I decided to add a scrolling carousel that worked in the same way the carousel worked on the Apple Mac ads page. This tutorial will walk through the fundamentals of the effect and how to recreate it.

Watch
Watch jQuery Infinite Carousel screencast (Alternative flash version)
QuickTime version is approximately 70Mb, flash version is streaming.
View the demo used in the screencast
Understanding the Effect
As with any complicated effect, I always start by looking at the DOM in Firebug and interact with the effect, watching for what changes take effect in the DOM.
What I noticed was the (rendered) DOM structure for the list of images was different to the delivered DOM (i.e. the original markup sent). This means that there’s some significant initialisation code running. This isn’t unexpected for an Apple effect, but there were big clues in to how to create this effect in the difference.
Most importantly the list of images (in a
<ul>element) had additional<li>elements at the start of the list and at the end of the list. There were two types: clone and empty.The second big clue was the number of cloned elements on the end of the list: it matched the number of visible items in the carousel.
In the diagram below I’ve tried to outline what’s cloned in the list, and show what’s visible. You can see how the list shows 3 items at once, but there’s 5 items in total. So the first cloned section (at the start of the list) contains two clones and a single empty clone. The end of the list has 3 clones – which represents real items 1-3:
The Trick
Aside from building the DOM with the cloned nodes, the real trick is in the final panel of list items appearing. Because we’ve cloned the start of the list to the end of the list, when we scroll off the last items, it looks like we’ve looped back round. Once the animation completes, we change the
scrollLeftposition back to the real first items.This
scrollLeftisn’t visible to the user since the overflow is hidden, and so it creates the effect of being infinitely sliding from left or right (since it also works the other way around).Markup
Remembering that we want the effect to work without JavaScript turned on, we’re going to use a pattern that we use fairly often for effects that scroll: overflows.
The default will be the overflow is visible, and we’ll use JavaScript to change the element to
overflow: hidden.The CSS has been marked up in a way that the overflow is visible to start off with, and that the individual
<li>elements are the same fixed width. This is necessary to ensure that we always show complete images in the visible part of the carousel.jQuery
Replicating the Effect
This is a reasonably advanced effect so we need to plan carefully what we’re trying to achieve:
The completed example is also available if you want to skip through each step.
Initialisation
We’re going to write the code as a plugin so we can release it out to the wild at some later point. So this follows the typical plugin pattern:
This step is used to initialise the plugin and capture all the variables we need to create this effect. This includes:
Math.ceil)Padding with Empty Items
During the screencast I said that we’re making use of the
repeatfunction from another tutorial – however that was wrong! I must have used it for something else! None the less, here is the repeat function, which we put outside of the plugin since it’s a utility function:The repeat function simple uses and array hack to repeat any string n times.
When we create the empty padding, we need to use modulus to work out how many new empty items we need to fill every page of our carousel with an item:
Notice that we reinitialise the
$itemsvariable. This is to ensure it contains all of the items, including our newly created empty items.Generating Clones
As per the diagram in the introduction, we need to clone the last page of items to the start of the list, and the first page of items to the end of the list. These will be the items that we slide on to before we flip the
scrollLeftposition (as per the trick above).We’re making using the
slicemethod that jQuery has. Notice that we first use it with a negative number:This means to take the last n items off the end of $items. Otherwise we have to pass the start and end point, so the second instance we’re saying from the start, 0, and the third as the method is zero-based indices.
Reset Scroll Left
Since we’ve created the clones at the start of the list, we need to shift the scroll left back to the real element, otherwise it would look like the carousel is sitting on the last page.
Go To Method
The
gotoPagemethod will handle going forward and backwards and handle jumping several pages at a time.We’re going to use the
animatemethod and only animate thescrollLeftso that it smoothly scrolls. We could add custom easin if we wanted at a later date.We need to establish the following:
Once the animation has completed, we also need to maintain the
currentPagevariable we created on initialisation.If the page number is greater than the number of pages (i.e. we’re on our cloned first page), then reset the scroll left to the real first page, and set the page number to 1.
Equally if we have hit the beginning of the list (i.e. we’re showing the cloned last page), then we reset the scroll left to the real last page, and set the page number to the total number of pages.
Navigation buttons
Finally we need to add the buttons or links to page through the carousel and bind the
gotoPagecall.We’re also going to create a custom goto event that allows us to also jump to any page:
Demo
That’s it. It’s a fairly complicated plugin as J4D demos go. There is also the jCarousel plugin that you could use (though I’m not sure if it has infinite scrolling) – but obviously the idea here is to show you how it all comes together.
Check out the demo, view the source, have a play!
You should follow me on Twitter here I tweet about jQuery amongst the usual tweet-splurges!