1. HTML
Yes, I'm using list this time :) This is how it should have been afterall. No more REL attribute, we wil be using TITLE Attribute to store the heading and ALT attribute to store the description. For the caption elements, it will be added using jQuery. So, this is it - a clean and simple HTML code.
2. CSS
CSS code is rewritten completely. I guarantee it's cross browser compliant. They all look identical and it works great :) I did learn a lot of CSS technique through this blog. We all can improve our skills through tips, tricks, trials and errors. Read these posts to learn more about CSS:
- body {
- font-family:arial;
- font-size:12px;
- }
- ul.slideshow {
- list-style:none;
- width:450px;
- height:200px;
- overflow:hidden;
- position:relative;
- margin:0;
- padding:0;
-
- }
- ul.slideshow li {
- position:absolute;
- left:0;
- right:0;
- }
- ul.slideshow li.show {
- z-index:500;
- }
- ul img {
- border:none;
- }
- #slideshow-caption {
- width:450px;
- height:70px;
- position:absolute;
- bottom:0;
- left:0;
- color:#fff;
- background:#000;
- z-index:500;
- }
- #slideshow-caption .slideshow-caption-container {
- padding:5px 10px;
- z-index:1000;
- }
- #slideshow-caption h3 {
- margin:0;
- padding:0;
- font-size:14px;
- }
- #slideshow-caption p {
- margin:5px 0 0 0;
- padding:0;
- }
3. Javascript
We will going to use call back function to display caption. This will solve the "Caption Is Appearing Before The Next Slide Syndrome" :). Not too much of changes in javascript but I do added a feature though. On mouse over the slide will pause, and resume it back on mouse out. I think it's a good touch.
- $(document).ready(function() {
-
-
- slideShow(2000);
- });
- function slideShow(speed) {
-
- $('ul.slideshow').append('
'); //Set the opacity of all images to 0 $('ul.slideshow li').css({opacity: 0.0}); //Get the first image and display it (set it to full opacity) $('ul.slideshow li:first').css({opacity: 1.0}).addClass('show'); //Get the caption of the first image from REL attribute and display it $('#slideshow-caption h3').html($('ul.slideshow li.show').find('img').attr('title')); $('#slideshow-caption p').html($('ul.slideshow li.show').find('img').attr('alt')); //Display the caption $('#slideshow-caption').css({opacity: 0.7, bottom:0}); //Call the gallery function to run the slideshow var timer = setInterval('gallery()',speed); //pause the slideshow on mouse over $('ul.slideshow').hover( function () { clearInterval(timer); }, function () { timer = setInterval('gallery()',speed); } ); } function gallery() { //if no IMGs have the show class, grab the first image var current = ($('ul.slideshow li.show')? $('ul.slideshow li.show') : $('#ul.slideshow li:first')); //trying to avoid speed issue if(current.queue('fx').length == 0) { //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().attr('id') == 'slideshow-caption')? $('ul.slideshow li:first') :current.next()) : $('ul.slideshow li:first')); //Get next image caption var title = next.find('img').attr('title'); var desc = next.find('img').attr('alt'); //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 caption first, and then set and display the caption $('#slideshow-caption').slideToggle(300, function () { $('#slideshow-caption h3').html(title); $('#slideshow-caption p').html(desc); $('#slideshow-caption').slideToggle(500); }); //Hide the current image current.animate({opacity: 0.0}, 1000).removeClass('show'); } }
Updates
2010-09-10: Thanks to Rezzie who nailed the IE8 issue! :)
Updated the article and scripts, the link issue is fixed. :) Sorry for the delay.
Speed Issue
This is one of the issue that has been haunted me for a while, but thanks to Sam, one of our reader, he pointed out this would solve the issue, but with mixed result in IE.
Sam's solution, you need to add this:
- $(window).focus(function () {
- timer = setInterval('gallery()', speed);
- });
- $(window).blur(function () {
- clearInterval(timer);
- });
James Burnett's solution, you modify the gallery function():
- function gallery() {
- var current = ($('ul.slideshow li.show')? $('ul.slideshow li.show') : $('#ul.slideshow li:first'));
- if(current.queue('fx').length == 0) {
-
-
- ......
- ......
- ......
-
- }
- }
Also, did some research, found the reason why it's doing it: From jQuery Animate Documentation: Because of the nature of requestAnimationFrame(), you should never queue animations using a setInterval or setTimeout loop. In order to preserve CPU resources, browsers that support requestAnimationFrame will not update animations when the window/tab is not displayed. If you continue to queue animations via setInterval or setTimeout while animation is paused, all of the queued animations will begin playing when the window/tab regains focus. To avoid this potential problem, use the callback of your last animation in the loop, or append a function to the elements .queue() to set the timeout to start the next animation.
Sorry guys, I don't have time to put all these together. Please let me know it works.
Randomize Slides
Simple yet effective solution from another reader - Blastos
Before the ending of function slideShow(), put this in:
- var randNum = Math.floor(Math.random() * $('ul.slideshow li').length);
- $('ul.slideshow li:eq('+randNum+')').addClass('show');
Caption doesn't appear for the first slide
I think it has to be the ommitted A tag for some users. Ammended the script, it should be fixed now.
Conclusion
I have made a lot of tutorials, and I think it's good to do a revisit to make it more efficient and solve some of the annoying bugs instead of quick fixes. So, yea, from now on, I will check my previous tutorials and rewrite them. :)
Like this tutorials? You can express your gratitude by visiting my sponsors on the sidebar, bookmark it and help me to spread this tutorial to our friends! :) Thanks!