Simple JQuery Image Slide Show with Semi-Transparent Caption

Written by Kevin Liew on 30 Mar 2009
380,006 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
poongkodi 15 years ago
whether i can add this slide show in my website ?thier is any problem with w3c validity?
Reply
RT 15 years ago
Nice slideshow, however, am trying to make decrease the caption width, but not able to do so, any help on this?
Reply
Kevin Liew Admin 15 years ago
Sorry, we are no longer support this post, please look at the new version:

http://www.queness.com/post/1450/jquery-photo-slide-show-with-slick-caption-tutorial-revisited
Reply
Rafael Perin 15 years ago
nice tutorial, thanks.
Reply
riffbird 15 years ago
nice post. thank you very much…….but i want a slideshow which have background slider and after one slider then new slideshow over that slider and again new background slider and again on this slider foreground slideshow start.
can u help me.
<a href="http://riffbird.in/jquery-slideshow">Jquery Slideshow, Jquery Slider, jquery Image Slideshows</a>
Reply
Scott 15 years ago
how can I put it in the middle of a page (html)
I try with <center></center> but,not work
Reply
Allan Kendall 15 years ago
If you have the #gallery div you can simply put margin: auto in the css to align it to the center of the page or a parent element.
Reply
Astraar 14 years ago
Yea,

left:50%; margin-left:-(complete width : 2)px

; )
Reply
Jim 15 years ago
I have the slideshow just below a top navigation that has drop-downs. The drop-downs are going BEHIND the slideshow making them not visible. Any ideas? Problem at: http://www.rewater.com
Reply
Allan Kendall 15 years ago
You need to sort out your Z-Indexing to get the correct layer order.
Reply
kiki 15 years ago
Do you know how to make the captions pop up when one put a mouse over an image and then make the caption disapper when the mouse move away from the image? Here's the example: http://www.forbes.com/2011/03/23/honda-toyota-mercedes-ford-business-autos-fuel-efficient-cars_slide.html
Reply
Neil 15 years ago
Nice!
Is it possible to reduce the height of the caption box? At the moment it is about twice the height I need it to be. Thanks in advance.
Reply
Astraar 14 years ago
Yea, just loot in the code ...

//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 );
and
#gallery .caption {
z-index:600;
background-color:#000;
color:#ffffff;
height:>>100px<<;
width:100%;
position:absolute;
bottom:0;

really obvious dude :p
Reply
Sam 14 years ago
is it possible to remove the html links and just have it as stand alone??
Reply
Matt 14 years ago
Very sharp image rotator. Thanks for the good work!
Reply
Katrina 14 years ago
I am so green at this website stuff and wanted to use this slide show put not sure where to put the java script in Dreamweaver can you help?
Reply
Kevin Liew Admin 14 years ago
The correct way is to create a file, put in all the javascript and link it into your webpage. like this:
http://www.tizag.com/javascriptT/javascriptexternal.php
Reply
Curtis 14 years ago
How do i make the size of the whole image box smaller?
Reply
aditya 14 years ago
the speed of change of slide becomes high with time. i mean when u keep it open for 5-10 minutes the speed becomes high from seconds to less than 1 second.. can you reason it out and help...
Reply
Anas Ather 14 years ago
Yes same thing is happening to me.....I check it from DOM, Opcaity speeds up switching at the rate of 1 sec between img elements
Reply
brian 14 years ago
how is this fixed? does anyone know?
Reply
Kasun 14 years ago
same thing for me, have any solution? :(
Reply
Kevin Liew Admin 14 years ago
guys, it's something to do with animate, a bug that haunted me until now. Please visit this tutorial,
http://www.queness.com/post/1450/jquery-photo-slide-show-with-slick-caption-tutorial-revisited
Reply