Simple JQuery Image Slide Show with Semi-Transparent Caption

Written by Kevin Liew on 30 Mar 2009
380,022 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
anadikt 16 years ago
thanks for this slideshow plugin
Reply
kevin Admin 16 years ago
Hi Colby, you can either put the jQuery code in between <HEAD></HEAD> or put it in an external file.

In the demo, I put it between <HEAD></HEAD> You can click on the demo and view source.
Reply
Colby 16 years ago
I was looking for an easy slideshow for my website. This looks easy, but I'm not sure where to put the jQuery code. I put the css between <STYLE></STYLE> and everything else between <BODY></BODY>. I just need to know where to put the jQuery code. Thanks.
Reply
bugra ozden 16 years ago
Thanks
Reply
Lindsayanng 16 years ago
I am working on a website for a client and I am trying to add this slider but it just is NOT working. I basically gave up and tried to just take the source code right off of your demo and stick it in but still it's a no go.

I am trying to add this inside of a wordpress page.. So i added the CSS to my style sheet but changed the #gallery to #slider. Then I added the script to the head between the two script tags and changed all instances of #gallery to #slider so that they matched.

Then I went to the page and inserted the basic HTML structure that you had on your demo.. You'd THINK something like this would work!! BUT ITS NOT.

Clearly some parts are working, and others are not.

I'd be psyched if you could take a look and give me some insights. I am pretty good with understanding code, but I am new to javascript, so i really just need some direction

Here is the website in question:
http://thegirlspotct.com
Reply
Nico 16 years ago
@Lindsayanng
Lindsay, What part of this plugin isn't working for you? I visited the page and it appears to be changing slides correctly.

I noticed two things though:
1. It appears you're using the older version of this plugin. At the top of this article you'll see that the author has actually updated this plugin as of 17 Dec. 2009. This original plugin is from March 2009.

2. It looks like you're running both prototype.js and jquery on the same page. This is fine in most cases, but you must put jQuery into noConflict mode in order for it to play nicely with prototype. You then must replace "$" with "jQuery" in any of your jQuery script.

I'm not affiliated with the author but I had a little trouble getting this going originally and thought I'd help steer you in the right direction. Hope that helps.
Reply
Miguel Costa 16 years ago
I made something like this using Cycle plugin for jQuery and CSS.

The demo:
http://redebiz.net/

Explained how I did it (in Portuguese with the CSS code included):
http://redebiz.net/
Reply
Freeman85 16 years ago
Hey there..
The image slider i very great, but is it possible to change the direction of the image and the text? If, how to?

Reply
schedule software 16 years ago
Awesome! Some really helpful information in there. Bookmarked. Excellent source.
Reply
Nick 16 years ago
How would i go about adding this to an exiusiting Html page. What is the script I would use to point to the gallery?

Example I want to replace my Flash Image at the top of my site with urs.
Reply
amsikelek 16 years ago
Great, simple and efficient! Thanks for this. I do notice a slight issue with the caption though, and wondered if you had a fix.
Reply
amsikelek 16 years ago
<a href="http://www.amsikelek.com " title="am">am</a>
<a href="http://www.amsikelek.com " title="sik">sik</a>
Reply
Web Design Services 16 years ago
Hi, That is really such a great stuff, i was just passing by to this post. This blog is really nice.
Reply