jQuery Slideshow Image Transition

J’ai un problème avec mon diaporama jQuery et je n’arrive pas à le comprendre. Au cours de la transition des images, le diaporama clignote en blanc au lieu de passer progressivement à l’image suivante. Je crois que cela a quelque chose à voir avec les lignes de code suivantes:

$('#slideshow img:first').fadeOut(1000).next().fadeIn(1000).end().appendTo('#slideshow'); 

Cliquer sur les boutons précédent et suivant provoque le même problème.

Voici un jsFiddle du diaporama.

Merci!

vous devez afficher l’image suivante avant de commencer à masquer l’image actuelle, vous devez également le faire en même temps, il suffit de remplacer le fadeIn(1000) de l’image .next () par show() , comme ceci http: //jsfiddle.net/nyXUt/6/

J’ai re-factorisé votre code et l’a posté ici:

http://jsfiddle.net/salman/nyXUt/44/

Les principales modifications sont les suivantes:

Solution de contournement en flash blanc : vous utilisiez un fondu en sortie et un fondu en entrée. Lorsque les deux animations sont démarrées ensemble, les deux images deviennent 50% transparentes en un point et la diapositive apparaît blanchâtre (ou couleur d’arrière-plan). J’ai utilisé une autre approche. En utilisant z-index, je place l’image “masquer” devant l’image “afficher”, puis estompe l’image “masquer”:

 #slideshow .current { display: block; z-index: 1; } #slideshow .animate { display: block; z-index: 2; } 
 nextItem.addClass("current"); prevItem.removeClass("current").addClass("animate").fadeOut(animDuration, function () { $(this).removeClass("animate").css("display", ""); }); 

setInterval vs setTimeout : J’ai utilisé setTimeout au lieu de setInterval qui donne plus de contrôle sur le timing. La transition automatique est reprogrammée lorsque l’utilisateur l’interrompt avec les boutons Précédent / Suivant.

.stop() d’animation: j’ai ajouté des rappels et .stop() à l’animation pour éviter le chevauchement des animations.

peut-être minimiser fadeOut() , et fadeIn() time ou fadeOut(slow)

Lorsque vous cliquez sur suivant ou précédent, vous devez arrêter l’intervalle et les animations précédentes, à savoir:

 clearInterval(run); $('#slideshow img').stop(); 

Lorsque le fondu de l’image suivante est terminé, vous redémarrez l’intervalle, c’est-à-dire:

 $('#slideshow img:last').fadeIn(1000, function() { run=setInterval("switchSlide()", speed);}) 

edit: Si vous cliquez 10 fois sur un bouton dans la seconde. Environ 20 animations se dérouleront simultanément.

edit: Si vous cliquez sur suivant ou précédent pendant que l’image bascule (automatiquement ou autrement) et que le fondu est déjà en cours, le fondu passera de presque fondu à complètement fondu en une période d’un effet entier (donc 1 seconde) . Dans ce temps, l’image sera principalement blanche.

Il serait peut-être préférable de régler le fondu sur la commutation manuelle plus rapidement (300 ms ou même moins). Cela améliorera également l’expérience des utilisateurs.

edit: Voici le violon

Voici le code:

 var speed = 4000; run = setTimeout("switchSlide()", speed); $(document).ready(function() { $('#caption').html($('#slideshow img:last').attr('title')); $('#previous').click(switchBack); $('#next').click(switchSlide); }); function switchSlide() { clearInterval(run); $('#slideshow img').stop(true,true); var jq=$('#slideshow img'); jq.first().css({'opacity':0}).appendTo('#slideshow').animate({'opacity':1}, 1000, function() { run = setTimeout("switchSlide()", speed); } ); $('#caption').html(jq.last().attr('title')); } function switchBack() { clearInterval(run); $('#slideshow img').stop(true,true); var jq=$('#slideshow img'); jq.last().animate({'opacity':0},1000, function() { $(this).prependTo('#slideshow').css({'opacity':1}); run = setTimeout("switchSlide()", speed);}); $('#caption').html(jq.get(1).title); } 

Vous pouvez essayer d’utiliser la fonction de délai qui fonctionne (uniquement) avec les animations jQuery.

 $('#slideshow img:first').fadeOut(1000).next().delay(1000).fadeIn(1000).end().appendTo('#slideshow'); 

Mais la meilleure façon si vous utilisez les rappels fournis comme indiqué par d’autres commentateurs ici.

Le problème est que vous effectuez un fondu en même temps que le fondu. À l’aide des fonctions d’accélération standard, il y a un point au milieu où les deux images sont à peine visibles et où il rest un espace blanc.

Pour résoudre ce problème, j’ai inversé l’ordre des images afin que l’image visible se trouve au-dessus de la stack. Nous pouvons maintenant placer la nouvelle image par-dessus l’image actuellement visible et la faire apparaître en fondu. Une fois la nouvelle image entièrement visible, nous masquons l’image précédente. Cela rend la transition beaucoup plus douce.

 $('#slideshow img:first').appendTo('#slideshow'); $('#slideshow img:last').fadeIn(1000, 'swing', function() { $('#slideshow img:last').prev().hide(); }); 

Voici un jsfiddle: http://jsfiddle.net/nyXUt/52/