Reputation: 25
I am trying to figure out why it is that when my jQuery slideshow gallery cycles between images and captions, the first chunk of information (image, caption) shows up twice in a row the first time through the loop. Every subsequent loop alternates the images properly.
<script type="text/javascript" src="js/jquery-1.3.1.min.js"></script>
<script type="text/javascript">
$(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 .cont').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()',5000);
}
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 firstimage
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},10 ).animate({height: '60px'},500 );
//Display the content
$('#gallery .content').html(caption);
}
</script>
<style type="text/css">
.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:60px;
width:100%;
position:absolute;
bottom:0;
}
#gallery .caption .content {
margin:5px;
}
#gallery .caption .content h3 {
margin:0;
padding:0;
color:#1DCCEF;
}
</style>
Any ideas? Thanks,-qs
Upvotes: 1
Views: 258
Reputation: 2406
The issue is here:
var current = $('#gallery a.show') ? $('#gallery a.show') : $('#gallery a:first');
The empty list is truthy, so even if $('#gallery a.show')
does not match anything the expression will always evaluate to $('#gallery a.show')
.
A simple fix would be something like this:
var current = $('#gallery a.show').length ? $('#gallery a.show') : $('#gallery a:first');
However I think it is nicer to add $('#gallery a:first').addClass('show');
in slideShow()
and forget about the case that $('#gallery a.show')
does not match.
http://jsfiddle.net/bkdf9q7j/10/
Upvotes: 1