2009-05-06 7 views
3

J'élimine les éléments un par un, mais il semble que tout disparaisse à la fois.Opération synchrone jQuery

Comment estomper les éléments un à un. Seulement si l'un disparaît complètement, le second devrait commencer à s'estomper.

boucle I et se fanent comme ça

$(ele).fadeIn('slow'); 

Répondre

3

J'ai fait ce plugin jQuery rapide/facile pour vous de faire exactement ce que vous voulez. :-)

$.fn.extend({ 
    serial_fade: function(o) { 
     if(!o.speed || o.speed == undefined || o.speed == null) { o.speed = 'slow'; } 
     if(!o.fade || o.fade == undefined || o.fade == null) { o.fade = 'in'; } 
     if(!o.index || o.index == undefined || o.index == null) { o.index = 0; } 
     var s = this.selector; 
     if(o.fade.toLowerCase() == 'in') { 
      return this.eq(o.index).fadeIn(o.speed, function() { 
       o.index++; 
       if($(s).eq(o.index).length > 0) { 
        $(s).serial_fade({speed:o.speed,fade:o.fade,index:o.index}); 
       } 
      }); 
     } else { 
      return this.eq(o.index).fadeOut(o.speed, function() { 
       o.index++; 
       if($(s).eq(o.index).length > 0) { 
        $(s).serial_fade({speed:o.speed,fade:o.fade,index:o.index}); 
       } 
      }); 
     } 
    } 
}); 

// To call it just do this: 
$(ele).serial_fade({speed:'slow',fade:'in'}); 

// Optionally, you can pass which element you want to start with (0-based): 
$('a').serial_fade({speed:'slow',fade:'in',index:2}); 

// If you want to start with element 2 (3, really) and fade all the rest *out* 
// sequentially, verrry slowly: 
$(ele).serial_fade({speed:5000,fade:'out',index:2}); 

Il devrait fonctionner avec tout type de sélecteur comme toute autre méthode jQuery fait. J'espère que cela fonctionne pour vous.

Edit: Je l'a étendu de manière à pouvoir faire ins fondu et fondu outs maintenant. Il semble juste plus utile de cette façon ...

+0

brillant! Merci. – Hitz

+0

De rien. J'ai ajouté de nouvelles fonctionnalités ... juste pour que vous sachiez. – KyleFarris

+0

Pourquoi ma réponse est-elle rejetée? C'est une réponse parfaitement légitime, flexible et fonctionnelle à ce problème de personnes. Cela n'a aucun sens. Est-ce que quelqu'un est aigri à ce sujet ou quelque chose? J'aimerais au moins savoir pourquoi cela a été rejeté. :-( – KyleFarris

4

fadeIn a un rappel qui exécute lorsque la décoloration est terminée. Ajoutez à chaque élément la classe elemX, où x est l'ordre des évanouissements. Ensuite, utilisez le code suivant:

startFading(1); 

function startFading(order) { 
    $(".ele" + order).fadeIn('slow', function() { 
     if (order < orderMax) { 
      startFading(order+1); 
     } 
    }); 
} 
+0

Récursivité en JavaScript! Très agréable. – montrealist

+0

merci peut-il être remplacé pour les éléments de même classe. Je vois que vous utilisez un ordre. Cependant, cela peut-il être fait en utilisant la classe – Hitz

+0

Si vous voulez appliquer ceci sur des éléments avec la classe 'fade', alors vous ajoutez les classes 'fadeorder1', 'fadeorder2', ... pour eux. Un élément peut avoir plus d'une classe, donc cette classe = 'fade fadeorder1', est parfaitement OK. – kgiannakakis

0

Vous pouvez rendre cela générique et ne pas le forcer à être seulement pour les évanouissements.

function depth(collection, fun, i) { 
    if (i === undefined) 
     depth(collection, fun, 0); 
    else 
     if (i < collection.length) 
      fun(collection[i], function(){ 
       depth(collection, fun, i + 1); 
      }); 
}; 

depth($("a"), function(elem, fun) { 
    $(elem).fadeIn('slow', fun); 
});