Simple JQuery Image Slide Show with Semi-Transparent Caption

Written by Kevin Liew on 30 Mar 2009
380,000 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
Daveed 16 years ago
Great tutorial, Kevin thank you.
All browsers are working fine, including IE6 (when will we be able to stop making things work for this old clunker?). Have not run into any issues myself.
Reply
thiagonasc 16 years ago
@kevin
Thanks for attention to answer!
Sorry for my english, i\\'m a brazilian guy!
My question is: How I add link in \\"black box\\"? Like you said, I can add a link in text (and text-box), but the CSS give error.
Can you help me please?
So thank you! A lot! Bye.
Reply
Jay 16 years ago
Fantastic Script, but is it possible to have the comment box clickable? - if so, how would i go about doing it?
Reply
kevin Admin 16 years ago
@thiagonasc: yes, you can put it in the img rel attribute:


yea, that's it.

@Jay: yep, that can be done. but it will require some modification.

you need to store the link somewhere in the img tag.

1. you need to add anchor tag after the img tag and hide it.
2. create a click event for the caption class, and write the code so that if the user click on it, it will grab the anchor tag of the current item.

hope u understand it. sorry for not providing the code.
Reply
kevin Admin 16 years ago
Hi Patrick, yes, it's very basic,
I can guide you how to do it,
But, definitely not with this script.

I will send u email soon, in case i reply lately, drop me a message in contact form to remind me. Thanks!
Reply
kash 16 years ago
Hi, great script you have here. Just exactly what I wanted.

I do have a suggestion.

Can you make the parameter settings simpler? Because in this case, I have to go back and forth the css and the script itself just to change a few things. For instance the height of the caption, size of image, etc. Having one place that change the setting on all place would do wonders in term of user friendliness.

Again, great script and many thanks :)
Reply
Patrik 16 years ago
Hi,

I need your help. I\\'m trying to recreate the effect that are in flash in following links,

http://www.carmeda.se/
http://www.carmeda.se/

As you can see the effect is quite basic. Once reloading the site I want the text to \\"fly in\\" basicly.

Can I do this with this script?

I appreciate your help.

/ Patrik
Reply
Patrik 16 years ago
Thanks Kevin, I would appreciate it.
I've tried to modify the script but it ended up messy :-)

Note: I want to have the slide show, but with the effect I described in my previous post.

/ Patrik
Reply
hasfa 16 years ago
Thanks Guys. Ur article really solve my problem. Good and nice work.
Reply
Harsha 16 years ago
thanks a lot dude
its working
Reply
PacificBen 16 years ago
Incredibly easy! Incredibly awesome! Thank you so much for putting this up Man!
Reply
benoit 16 years ago
@ Elaine this will add a pause/play button

function slideShow() {
$('#gallery a').css({opacity: 0.0});
$('#gallery a:first').css({opacity: 1.0});
$('#gallery .caption').css({opacity: 0.6});
$('#gallery .caption').css({width: $('#gallery a').find('img').css('width')});
$('#gallery .content').html($('#gallery a:first').find('img').attr('rel'))
.animate({opacity: 0.6}, 400);
run = setInterval('gallery()',6000);
//stop button
$('#btn-pause').click(function () {
clearInterval(run);
return false;
});
//play button
$('#btn-play').click(function () {
run = setInterval('gallery()',6000);
return false;
});
}
Reply
Bluefusion 16 years ago
Great script - but what do I need to change so that I can control the width of the caption box rather than it going full width of the image, I want it go to exactly 500 pixels wide?
Reply