Thursday, 4 April 2013

jQuery: Slideshow sample for asp.net master page


Simple JQuery Slideshow

In this tutorial we're going to use jQuery to make a slideshow

Part 1 | Part 2 | Part 3
Today I'm going to take you through a simple jQuery slideshow and by going through the process step by step, hopefully show you just how easy it is to come up with an idea and achieve it with jQuery.

A little bit about jQuery

JQuery is JavaScript library that lets you link JavaScript to your HTML. Basically it lets you do things that you might have once done with Flash, but without the associated SEO implications. You can learn more at thejQuery site.

Our Slideshow

Lets imagine that we want a simple slideshow that cycles through slides at a time interval that we can set. We also want forward and back buttons so we can jump around between slides and each slide has a title, a description and a link associated with it.
View the finished slideshow

How our slideshow will work

The most important thing to grasp when using jQuery is that most of the work is done by our CSS. JQuery allows you to add and remove style elements and animate between the changes. This is the basis for making a simple slideshow with jQuery. And since you're already a CSS master, this is going to be really easy!
Basically, our slideshow is just a bunch of images, lined up side by side with the float attribute and viewed through a 'window', which is just a div with it's overflow set to hidden. All the jQuery does is move the slides back and forth by adjusting the left margin on a div that contains all the slides.
Lets start making our slide show. As always when doing something new, break the problem down into steps. The first thing I'm going to do is set up my html and css and then use jQuery to get the images moving. Later on I'll worry about adding text and links and then after that I'll add some buttons so we can navigate forwards and backwards through the slides.
Let's start with the HTML.




<div id="slideshow"><div id="slideshowWindow"><div class="slide"><p><img data-blogger-escaped-src="slide1.jpg" /> </p></div><p><!--/slide--> </p><div class="slide"><p><img data-blogger-escaped-src="slide2.jpg" /> </p></div><p><!--/slide--> </p><div class="slide"><p><img data-blogger-escaped-src="slide3.jpg" /> </p></div><p><!--/slide--> </p></div><p><!--/slideshowWindow--> </p></div> <!--/slideshow-->
You could do this with an unordered list no problem, but because I don't know what we're going to add later, I think it might be prudent to use divs, so I do.
Lets add some css:




#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; }
I haven't included any styling here for the outer #slideshow div but you can add whatever you need to position the slideshow on your page. The slideshowWindow div is essentially the 'window' through which we will view our slideshow. The important thing to notice here is that the overflow is set to hidden. And of course the slide div holds a single slide and later on whatever content will be associated with it like the title, description and link.
Now we need to add some jQuery to make our slides move. If you haven't got it already, you need to download jQuery. Once you've got it, you'll need to include the file in the head section of your page, making sure that you've got the path correct:




<script type="text/javascript" src="jquery.js"></script>
Now we can start writing the jQuery code that'll make out slides move.
The first thing we need is our document.ready function. In the head, below where you called the jQuery file, add the following:




<script type="text/javascript"> $(document).ready(function() { //our code will go here }); </script>
Now we're set up and ready to go. First we're going to need some variables. Type the following in the document.ready function:




var currentPosition = 0; var slideWidth = 500; var slides = $('.slide'); var numberOfSlides = slides.length;
The first variable records which slide we're currently viewing. The slideWidth variable is self explanatory. Next we have a variable called slides which lets us refer to our slides in the jQuery code and the last variable gives us the number of slides in our slideshow. As you can see, it automatically calculates the number of slides by counting the number of divs that are of the class slide.
To get the slides to line up across the page, we need to add another div. We're going to do this with jQuery. This div will hold all the slides and allow the float:left property to work. Add the following code:




slides.wrapAll('<div id="slidesHolder"></div>')
Now we need to float the slides so they line up side by side.




slides.css({ 'float' : 'left' });
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.
Your jQuery code should look like this:




<script type="text/javascript"> $(document).ready(function() { var currentPosition = 0; var slideWidth = 500; var slides = $('.slide'); var numberOfSlides = slides.length; var slideShowInterval; var speed = 3000; slideShowInterval = setInterval(changePosition, speed); slides.wrapAll('<div id="slidesHolder"></div>') slides.css({ 'float' : 'left' }); $('#slidesHolder').css('width', slideWidth * numberOfSlides); function changePosition() { if(currentPosition == numberOfSlides - 1) { currentPosition = 0; } else { currentPosition++; } moveSlide(); } function moveSlide() { $('#slidesHolder') .animate({'marginLeft' : slideWidth*(-currentPosition)}); } }); </script>
Run the script and see what happens. You should have a working slideshow:

Just out of interest, remove the overflow:hidden from the slideshowWindow style. This will give you a good indication of what is really happening.

Note:

.wrapAll() descriptions:
.wrap(): Wrap an HTML structure around each element in the set of matched elements. .wrapAll(): Wrap an HTML structure around all elements in the set of matched elements.
.wrap() wraps every element individually, but .wrapAll() wraps all of them as a group.
For example:
<div class="foo"></div>
<div class="foo"></div>
<div class="foo"></div>
With $('.foo').wrap('<div class="bar" />');, this happens:
<div class="bar"><div class="foo"></div></div>
<div class="bar"><div class="foo"></div></div>
<div class="bar"><div class="foo"></div></div>
But with $('.foo').wrapAll('<div class="bar" />');, this happens:
<div class="bar">
  <div class="foo"></div>
  <div class="foo"></div>
  <div class="foo"></div>
</div>

No comments:

Post a Comment