jQuery Photo Slide Show with Slick Caption Tutorial Revisited

Written by Kevin Liew on 16 Dec 2009
266,248 Views • Tutorials

Introduction

If you have been reading my website from the start you would have read this tutorial:

Simple jQuery Image Slide Show with Semi Transparent Caption

It's a very famous post because it has been showcased in several major web design blogs so many times and I received a lot of traffic from it. Thanks guys. I get a lot of comment and as I replied to those comments and do some quick fixes, I realized that this script has a caption bug and inefficient and not up to standard (oh well, that's the time when I was start picking up jQuery :)), so I have decided to do revisit to solve all those problems discovered by readers. I rewrote the html structure and modify the script.

Mission Objectives:

  • Restructure the HTML, more semantic
  • Fix the caption bug, it displays the next caption too fast
  • W3C standard compliant, using appropriate attribute to store title and description
  • Cross Browser - Chrome, Safari, IE6, 7, 8 and Firefox.

However, one thing though, it needs javascript, if your browser is javascript disabled, sorry, there is no graceful degradation for this script, it will just display the first item.

Advertisement

1. HTML

Yes, I'm using list this time :) This is how it should have been afterall. No more REL attribute, we wil be using TITLE Attribute to store the heading and ALT attribute to store the description. For the caption elements, it will be added using jQuery. So, this is it - a clean and simple HTML code.

<ul class="slideshow">
	<li class="show"><a href="#"><img data-src="images/s1.gif" width="450" height="200" title="Slide 1" alt="Short Description"/></a></li>
	<li><a href="#"><img data-src="images/s2.gif" width="450" height="200" title="Slide 2" alt="Short Description"/></a></li>
	<li><a href="#"><img data-src="images/s3.gif" width="450" height="200" title="Slide 3" alt="Short Description"/></a></li>
</ul>

2. CSS

CSS code is rewritten completely. I guarantee it's cross browser compliant. They all look identical and it works great :) I did learn a lot of CSS technique through this blog. We all can improve our skills through tips, tricks, trials and errors. Read these posts to learn more about CSS:

body {
	font-family:arial;	
	font-size:12px;
}

ul.slideshow {
	list-style:none;
	width:450px;
	height:200px;
	overflow:hidden;
	position:relative;
	margin:0;
	padding:0;
	
}	

ul.slideshow li {
	position:absolute;
	left:0;
	right:0;
}

ul.slideshow li.show {
	z-index:500;	
}

ul img {
	border:none;	
}

#slideshow-caption {
	width:450px;
	height:70px;
	position:absolute;
	bottom:0;
	left:0;	
	color:#fff;
	background:#000;
	z-index:500;
}

#slideshow-caption .slideshow-caption-container {
	padding:5px 10px;	
	z-index:1000;	
}

#slideshow-caption h3 {
	margin:0;
	padding:0;	
	font-size:14px;
}

#slideshow-caption p {
	margin:5px 0 0 0;
	padding:0;
}

3. Javascript

We will going to use call back function to display caption. This will solve the "Caption Is Appearing Before The Next Slide Syndrome" :). Not too much of changes in javascript but I do added a feature though. On mouse over the slide will pause, and resume it back on mouse out. I think it's a good touch.

$(document).ready(function() {		
	
	//Execute the slideShow, set 4 seconds for each images
	slideShow(2000);

});

function slideShow(speed) {


	//append a LI item to the UL list for displaying caption
	$('ul.slideshow').append('
  •  
'); //Set the opacity of all images to 0 $('ul.slideshow li').css({opacity: 0.0}); //Get the first image and display it (set it to full opacity) $('ul.slideshow li:first').css({opacity: 1.0}).addClass('show'); //Get the caption of the first image from REL attribute and display it $('#slideshow-caption h3').html($('ul.slideshow li.show').find('img').attr('title')); $('#slideshow-caption p').html($('ul.slideshow li.show').find('img').attr('alt')); //Display the caption $('#slideshow-caption').css({opacity: 0.7, bottom:0}); //Call the gallery function to run the slideshow var timer = setInterval('gallery()',speed); //pause the slideshow on mouse over $('ul.slideshow').hover( function () { clearInterval(timer); }, function () { timer = setInterval('gallery()',speed); } ); } function gallery() { //if no IMGs have the show class, grab the first image var current = ($('ul.slideshow li.show')? $('ul.slideshow li.show') : $('#ul.slideshow li:first')); //trying to avoid speed issue if(current.queue('fx').length == 0) { //Get next image, if it reached the end of the slideshow, rotate it back to the first image var next = ((current.next().length) ? ((current.next().attr('id') == 'slideshow-caption')? $('ul.slideshow li:first') :current.next()) : $('ul.slideshow li:first')); //Get next image caption var title = next.find('img').attr('title'); var desc = next.find('img').attr('alt'); //Set the fade in effect for the next image, show class has higher z-index next.css({opacity: 0.0}).addClass('show').animate({opacity: 1.0}, 1000); //Hide the caption first, and then set and display the caption $('#slideshow-caption').slideToggle(300, function () { $('#slideshow-caption h3').html(title); $('#slideshow-caption p').html(desc); $('#slideshow-caption').slideToggle(500); }); //Hide the current image current.animate({opacity: 0.0}, 1000).removeClass('show'); } }

Updates

2010-09-10: Thanks to Rezzie who nailed the IE8 issue! :)

Updated the article and scripts, the link issue is fixed. :) Sorry for the delay.

Speed Issue

This is one of the issue that has been haunted me for a while, but thanks to Sam, one of our reader, he pointed out this would solve the issue, but with mixed result in IE.

Sam's solution, you need to add this:

$(window).focus(function () {
	timer = setInterval('gallery()', speed); 
});
$(window).blur(function () {
	clearInterval(timer);
});

James Burnett's solution, you modify the gallery function():

function gallery() {
	var current = ($('ul.slideshow li.show')? $('ul.slideshow li.show') : $('#ul.slideshow li:first'));

	if(current.queue('fx').length == 0) {
		
		// grab next image and animate code in here
		......
		......
		......
		
	}
}

Also, did some research, found the reason why it's doing it: From jQuery Animate Documentation: Because of the nature of requestAnimationFrame(), you should never queue animations using a setInterval or setTimeout loop. In order to preserve CPU resources, browsers that support requestAnimationFrame will not update animations when the window/tab is not displayed. If you continue to queue animations via setInterval or setTimeout while animation is paused, all of the queued animations will begin playing when the window/tab regains focus. To avoid this potential problem, use the callback of your last animation in the loop, or append a function to the elements .queue() to set the timeout to start the next animation.

Sorry guys, I don't have time to put all these together. Please let me know it works.

Randomize Slides

Simple yet effective solution from another reader - Blastos

Before the ending of function slideShow(), put this in:

//Generate a random number
var randNum = Math.floor(Math.random() * $('ul.slideshow li').length);

//Randomly pick up a slide
$('ul.slideshow li:eq('+randNum+')').addClass('show');

Caption doesn't appear for the first slide

I think it has to be the ommitted A tag for some users. Ammended the script, it should be fixed now.

Conclusion

I have made a lot of tutorials, and I think it's good to do a revisit to make it more efficient and solve some of the annoying bugs instead of quick fixes. So, yea, from now on, I will check my previous tutorials and rewrite them. :)

Like this tutorials? You can express your gratitude by visiting my sponsors on the sidebar, bookmark it and help me to spread this tutorial to our friends! :) Thanks!

Demo Download
Join the discussion

Comments will be moderated and rel="nofollow" will be added to all links. You can wrap your coding with [code][/code] to make use of built-in syntax highlighter.

488 comments
Hendra 15 years ago
How to install it to my blog header? http://u-mart.blogspot.com
Reply
Laura 15 years ago
Great script, thanks for sharing! It is working fine, except that the text from the first caption does not appear at the beginning. When the cycle begins again it displays with no problems. Any ideas? Thanks !
Reply
francois 15 years ago
Laura, I had the same problem, first slide caption not showing, but scroling through the comments, someone has answered the problem, place a link tag with an " " empty link on the first slide and it works!
Thanks, for such a great script and tutorial, by the way, haven't done much coding, but managed to get this working! hopefully my brother will be suitably impressed...
Reply
Raul 15 years ago
I couldn't fix this yet, can you give more detail on What you did to show the first caption on the first image that is displayed ?

Thanks in advance.
Reply
Kevin Liew Admin 15 years ago
Please download the latest, I think I've fixed this issue.
Reply
aaron 15 years ago
Amazing script. Exactly what i was looking into implementing for a news script with different images displaying headlines.

I am having one problem however that i thought z-index would fix, but is not. I have a drop down css menu. its displaying BEHIND the images even though i gave them z-index of 1 and your script has z-index of 500 and 1000 respectively. how do i go about fixing this?

im new to CSS.
Reply
Kevin Liew Admin 15 years ago
You need to give it higher value. Try 2000.
Reply
Zstack 15 years ago
Awesome tutorial, really helped me out when I was building my website.

Question though, I have tried and tried to get the slideshow to the right hand side of my site instead of the left. Nothing I try seems to work though. Any thoughts?
Reply
Kevin Liew Admin 15 years ago
Try to wrap it with another div. I'm not sure how's your layout but it shouldn't affect by it.
Reply
Nan 15 years ago
Hi,
Great slide show! Thanks for this tutorial.

Is there a way to get rid of the rolling text and just have it appear when the image swops?
Hope you can help.

Thanks!
Reply
Ryan 15 years ago
I love the slideshow, but the slideshow is skipping the second image. Th first image is fine but when it goes two the second it treats it as if it is a transition or something and goes to the last image. How to fix?
Reply
Denise 15 years ago
I love this and got it working in less than 2 hours.... it's my first slide show ever!... just learned css. Thanks a million!

I tried your suggestion below to make the text bar stay stationary and that worked great, but the text shows up briefly before the image does because the image fades in and the text just appears. Is there any way to make the text fade in too or, better yet, show up a bit later so both text and image appear at the same time?

This is what I did so far. I changed this

$('#slideshow-caption').slideToggle(300, function () {
$('#slideshow-caption h3').html(title);
$('#slideshow-caption p').html(desc);
$('#slideshow-caption').slideToggle(500);
});

to

$('#slideshow-caption h3').html(title);
$('#slideshow-caption p').html(desc);

So now what can I do?
Denise
Reply
Kevin Liew Admin 15 years ago
Try this:

next.css({opacity: 0.0}).addClass('show').animate({opacity: 1.0}, 1000, function () {

$('#slideshow-caption h3').html(title);
$('#slideshow-caption p').html(desc);

});

call back function, so only display the caption once the current image is fully displayed.
Reply
Mark 15 years ago
How do you change the height of the caption? I want to make the transparent section smaller from top to bottom.
Reply
Kevin Liew Admin 15 years ago
it's in the CSS, line 31 based on the tutorial.
Reply
SS 15 years ago
I dont want to display the caption. I just want to display the images only. How can I do that?
Reply
Kevin Liew Admin 15 years ago
remove these lines 20-25, 51-53, 58-63
Reply
Andy 15 years ago
Love this slider but have a problem. The code as slider.html works fine but exactly the same code as slider.asp runs strangely for the first couple of slides. I see; first slide and 1st caption. Then whitespace with 1st caption. Then 1st slide with first caption and it all works well thereafter. What is the ASP engine doing do you think?
Reply
Abdul RaFy Siddiqui 15 years ago
Want 2 or more slideshow in single page...
any possibility?
Reply
David 15 years ago
I'm having an issue with the bullet points next to the images not being hidden as described in the CSS as written. Both as "list-style-type:none;" and "list-style:none;" The LI items are displaying the same bullet as elsewhere in the site, but this should be overwritten with the DIV tag specification. It would be fantastic if you could help me with this -- I'm familiar with HTML and CSS, but this for some reason is haunting me.

http://myerspr.com/index3.html.

Thanks!
Reply
Joe 15 years ago
Is there anyway to include linked text in the caption?
Reply
Kevin Liew Admin 15 years ago
Hmm, yes you can, you can put html tag in the image ALT attribute, not pretty but it will work. Make sure you use single quote instead of double quote though.
Reply
Nick 14 years ago
This code is great, very neat and it seems to work in FF8, Chrome15, Safari5 and even IE8&9 (on Windows7) !

Is there a neat way to make the caption link to the same href as used for the image by extending the javascript instead of adding anchor tags to the alt tag? Wish my knowledge of js was better.
Reply