Simple JQuery Image Slide Show with Semi-Transparent Caption

Written by Kevin Liew on 30 Mar 2009
371,340 Views • Tutorials

Introduction

Update 17 Dec 2009: I have created a new version of this image slide show. It's more efficient, clean and simple. Please visit: jQuery Photo Slide Show with Slick Caption Tutorial Revisited

I will no longer provide support for this old tutorial

Image Slide Show is one of the famous components in web design and development. A lot of the websites display news headlines in an image slide show to attract viewers attention, of course, with caption/excerpt. No doubt about it, this is a clever method not only to gain attentions, but it also makes the website more alive (not too static, dull).

Before we start, check out this industry-leading, unrivaled email security and anti-spam appliance hardware - Anti spam for Exchange.

So, here we go again, I separated my codes into 3 sections: html, css and javascript and I will explain how it works in each section.

Advertisement

1. HTML

My ultimate objective is - to keep the html as simple as possible. So, the final product is as following. The first image has a class called "show". Class show has higher z-index, so image with this class will display on top, thus image with this class will always display on top of the rest. The second thing you need to know is the DIV with "caption" class. It has the highest z-index. That DIV will be used to display the caption. The caption is retrieve from the REL attribute in the img element. You can put html element in the REL attribute. Be aware of extra padding and margin of the html elements you used. (eg h1, p).

Have a look at the html code:

<div id="gallery">

	<a href="#" class="show">
	<img data-src="images/flowing-rock.jpg" alt="Flowing Rock" alt="" title="" width="580" height="360" rel="<h3>Flowing Rock</h3>You can put html element 
	inside the REL attribute."/></a>
	</a>
	
	<a href="#">
		<img data-src="images/grass-blades.jpg" alt="Grass Blades" alt="" title="" width="580" height="360" rel="<h3>Grass Blades</h3>description"/>
	</a>
	
	......
	......
	......

	<div class="caption"><div class="content"></div></div>
</div>
<div class="clear"></div>

2. CSS

In this section, I declared a container #gallery for this image slide show. The CSS for this tutorial is pretty straight foward, the most importance thing is the z-index. You have to make sure the "show" class z-index is lower than the "caption" z-index.

body{
	font-family:arial
}

.clear {
	clear:both
}

#gallery {
	position:relative;
	height:360px
}
	#gallery a {
		float:left;
		position:absolute;
	}
	
	#gallery a img {
		border:none;
	}
	
	#gallery a.show {
		z-index:500
	}

	#gallery .caption {
		z-index:600; 
		background-color:#000; 
		color:#ffffff; 
		height:100px; 
		width:100%; 
		position:absolute;
		bottom:0;
	}

	#gallery .caption .content {
		margin:5px
	}
	
	#gallery .caption .content h3 {
		margin:0;
		padding:0;
		color:#1DCCEF;
	}
	

3. Javascript

Finally, the Javascript code. I have added comments in each line to explain what it does. My concept for this image slide show:

  • Hide all the images
  • Display the first image and caption
  • Find the image with "show" class, and grab the next image using next() method
  • Add "show" class to next image
  • Animate the image (fadeout the current image, fadein next image)
  • And, it repeats above steps over and over again
$(document).ready(function() {		
	
	//Execute the slideShow
	slideShow();

});

function slideShow() {

	//Set the opacity of all images to 0
	$('#gallery a').css({opacity: 0.0});
	
	//Get the first image and display it (set it to full opacity)
	$('#gallery a:first').css({opacity: 1.0});
	
	//Set the caption background to semi-transparent
	$('#gallery .caption').css({opacity: 0.7});

	//Resize the width of the caption according to the image width
	$('#gallery .caption').css({width: $('#gallery a').find('img').css('width')});
	
	//Get the caption of the first image from REL attribute and display it
	$('#gallery .content').html($('#gallery a:first').find('img').attr('rel'))
	.animate({opacity: 0.7}, 400);
	
	//Call the gallery function to run the slideshow, 6000 = change to next image after 6 seconds
	setInterval('gallery()',6000);
	
}

function gallery() {
	
	//if no IMGs have the show class, grab the first image
	var current = ($('#gallery a.show')?  $('#gallery a.show') : $('#gallery a:first'));

	//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().hasClass('caption'))? $('#gallery a:first') :current.next()) : $('#gallery a:first'));	
	
	//Get next image caption
	var caption = next.find('img').attr('rel');	
	
	//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 current image
	current.animate({opacity: 0.0}, 1000)
	.removeClass('show');
	
	//Set the opacity to 0 and height to 1px
	$('#gallery .caption').animate({opacity: 0.0}, { queue:false, duration:0 }).animate({height: '1px'}, { queue:true, duration:300 });	
	
	//Animate the caption, opacity to 0.7 and heigth to 100px, a slide up effect
	$('#gallery .caption').animate({opacity: 0.7},100 ).animate({height: '100px'},500 );
	
	//Display the content
	$('#gallery .content').html(caption);
		
}

Conclusion

Finally, you will have a nice and simple jQuery image slide show with a semi-transparent caption. Make sure you check out the demo and download the source code to play with it. Last but not least, I need your support :) If you like this article, please help me to promote it by adding this post into your bookmark. Or you can subscribe to my RSS for more posts. Thanks!

Update

14-4-2009: Fixed caption problem. Thanks to one of the readers kpastore.

Update 17 Dec 2009: I have created a new version of this image slide show. It's more efficient, clean and simple. Please visit: jQuery Photo Slide Show with Slick Caption Tutorial Revisited

I will no longer provide support for this old tutorial

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.

291 comments
Raj 13 years ago
Great!! it just took me less than 5min to make it work..great stuff.!! But when ever i load page first time..first image is appearing twice before slide show starting.. but i will try to handle it myself & let others know if i can find fix..
Reply
Gert-Jan Mekenkamp 13 years ago
Thanks alot for this!!! Really, I love this slideshow!
When I saw this i directly downloaded it, and I'm including this one in my site.
Reply
Alex McCallum 13 years ago
Hi. I have been inserted the html and css. However i am having trouble with the java script. I am trying to insert the slidshow into my current index page. The page heading uses the shopscript.js so if i try to use the jsquery.js it cancels out the shop js. I then tried to add the .ready function the the shop java script but cannot get it to work. I am a bit of newb any help would be greatful.
Reply
Simon 13 years ago
In the html code with all the links and img src within th gallery div, I get a warning, It is: code not valid; double caracter
What to do.
Reply
Kevin Liew Admin 13 years ago
is the html validation, wrap your javascript with CDATA script.
Reply
rhumz 13 years ago
it say's invalid markup.....marked invalid because it contains a duplicate attribute....<img ....remove the duplicate attribute in code view.
Reply
Emlyn Vaughan 13 years ago
Fantastic work, awesome peice of code and have used it in my website.

I have added the slider into my site, but how do you stop the caption slider from being visible outside the image prior to completing its...well...slide?

Reply
shreenivas 13 years ago
Fantastic.!! I am thankful to you.

But there is a problem. It works if there is only one slideshow. If there are two slideshows in a single page(JSP), it does not work correctly. It shows first slideshow correctly with no problem. But in second slideshow first image of the slideshow will not be displayed. Also it doesn't repeat once all images shown.

Please suggest solution.

Thanks regards
Reply
Nguyen Minh Dieu 13 years ago
Thankou for share
Reply
Glenn 13 years ago
Looks good. Can I use it for my Non profit Lions web page? Also, anything I need to do to ensure no one
can break into my webpage using this code. I wrote a simple jscript slide show and some moron immediately
spotted a hole in what I did and used my website as a remailer.
Reply
Kevin Liew Admin 13 years ago
Hi Glenn, you can use it in whatever way you want. This is javascript, I don't anyone can break your website with that.
Reply
Marielle 13 years ago
Looks nice! Is it possible to use this in combination with Lightbox? Because some sliders create conflict problems...
Reply
Kevin Liew Admin 13 years ago
Pretty sure you can. I recommend fancybox.
Reply
zenisberg 13 years ago
Hello guys...
I am working on JSP project. This j query works for me; bt,with 2problems
1)JSP does understand the 'rel' tag for my sideshow caption
2)Images appear sliding down ward which is disgusting!
TQVM..btw
Reply
sad 13 years ago
nice job but how about grabbing an image from a folder
Reply
Fahim 13 years ago
It is simple nice and very useful.Thanks to you.
Reply