Simple JQuery Slideshow
Simple JQuery Slideshow
The Slideshow
Requirements:
#slideshow #slideshowWindow {
width:500px;
height:257px;
margin:0;
padding:0;
position:relative;
overflow:hidden;
}
#slideshow #slideshowWindow .slide {
margin:0;
padding:0;
width:500px;
height:257px;
float:left;
position:relative;
}
currentPosition = 0;
slideWidth = 500;
slides = $('.slide');
numberOfSlides = slides.length;
Explanation:
currentPosition: records which slide we're currently viewing.
If you remove the overflow:hidden from the slideshowWindow div and run the
code now, you'll see what this achieves.
Next we want to set the width of #slidesHolder div. This needs to be set to
the width of all the slides added together. We can do this easily in jQuery:
$('#slidesHolder').css('width', slideWidth * numberOfSlides);
We're just using jQuery to change the width set in our css. So now we need
to move the slides from one to the other. We will require two functions. The
first function will determine how far along we are along our sequence of
slides, so we know where to go next and so that when we reach the last
slide, we know to jump back to the beginning. Here is the function:
function changePosition() {
if(currentPosition == numberOfSlides) {
currentPosition = 1;
} else {
currentPosition++;
}
moveSlide();
}
The first part of the if/else statement deals with when reach the end of the
slide show. When we come to the last slide we want to jump back to the
beginning, otherwise the currentSlide variable is simply incremented by 1
and then another function moveSlide is called.
function moveSlide() {
$('#slideHolder').animate({'marginLeft' : slideWidth*(-currentPosition)});
}
This is the business end of the jQuery code, this function sets the left margin
of the slidesHolder div to the width of the slide multiplied by the slide
number and then animates to that from the current left margin. But if you
run your code now you'll notice that nothing is happening. That's because we
haven't called the changePosition function yet.
We want the slide to change every few seconds so we'll set a timer that calls
the function periodically.
First we need to set a variable to hold the timer. Below the other variables,
add the following:
var slideShowInterval;
var speed = 6000;
As you can see we've also added a variable to control the speed. This is the
speed in milliseconds, so 6000 is equal to 6 seconds.
So now we need to set up our timer:
slideShowInterval = setInterval(changePosition, speed);
We're using the jQuery setInterval function. It takes two parameters, the
function that it calls and the speed. So this will call the changePosition
function (which in turn calls the moveSlide function) every 6 seconds.
currentPosition = 0;
slideWidth = 500;
slides = $('.slide');
numberOfSlides = slides.length;
slideShowInterval;
speed = 3000;
Run the script and see what happens. You should have a working slideshow:
This code puts in a couple of span tags which then get replaced by our
button images:
.nav {
display:block;
text-indent:-10000px;
position:absolute;
cursor:pointer;
}
#leftNav {
top:223px;
left:780px;
width:94px;
height:34px;
background-image:url(previous.png);
background-repeat:no-repeat;
z-index:999;
}
#rightNav {
top:225px;
left:910px;
width:53px;
height:26px;
background-image:url(next.png);
background-repeat:no-repeat;
z-index:999;
If you run the slideshow now you still won't see them because we haven't
told our code to display them. We'll write a function to do that now. Note that
if we're on the first slide, we don't want the back button to display, likewise if
we're on the last slide, we don't want to see the forward button.
function manageControls(position) {
//hide left arrow if position is first slide
if(position==0){ $('#leftNav').hide() }
else { $('#leftNav').show() }
//hide right arrow is slide position is last slide
if(position==numberOfSlides-1){ $('#rightNav').hide() }
else { $('#rightNav').show() }
}
If you run the slideshow now you still won't see the buttons because we
haven't called the function. Below where you added the buttons to the DOM,
add the following:
manageNav(currentPosition);
Now our slideshow has forward and back buttons that display at the correct
time but they still don't do anything if you click them. We have to tell them
what to do when clicked:
$('.nav').bind('click', function() {
//determine new position
currentPosition = ($(this).attr('id')=='rightNav')
? currentPosition+1 : currentPosition-1;
//hide/show controls
manageNav(currentPosition);
clearInterval(slideShowInterval);
slideShowInterval = setInterval(changePosition, speed);
moveSlide();
});
This code is a little bit complicated but basically when a button is clicked it
works out which one and then either adds or subtracts 1 from the
currentPosition variable. The moveSlide function is then called, which uses
the new currentPosition variable. You'll notice that the timer is reset when a
button is clicked.
The complete jQuery code should look like this:
$(document).ready(function() {
var
var
var
var
var
var
currentPosition = 0;
slideWidth = 500;
slides = $('.slide');
numberOfSlides = slides.length;
slideShowInterval;
speed = 3000;
? currentPosition+1 : currentPosition-1;
//hide/show controls
manageNav(currentPosition);
clearInterval(slideShowInterval);
slideShowInterval = setInterval(changePosition, speed);
moveSlide();
});
function manageNav(position) {
//hide left arrow if position is first slide
if(position==0){ $('#leftNav').hide() }
else { $('#leftNav').show() }
//hide right arrow is slide position is last slide
if(position==numberOfSlides-1){ $('#rightNav').hide() }
else { $('#rightNav').show() }
}
/*changePosition: this is called when the slide is moved by the
timer and NOT when the next or previous buttons are clicked*/
function changePosition() {
if(currentPosition == numberOfSlides - 1) {
currentPosition = 0;
manageNav(currentPosition);
} else {
currentPosition++;
manageNav(currentPosition);
}
moveSlide();
}
//moveSlide: this function moves the slide
function moveSlide() {
$('#slidesHolder')
.animate({'marginLeft' : slideWidth*(-currentPosition)});
}
});
Slide 1
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua.
Slide 2
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua.
Slide 3
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua.