2010-11-16 11 views
15
$(document).ready(function() { 
    $("#div1").fadeIn("slow"); 
    $("#div2").delay(500).fadeIn("slow"); 
    $("#div3").delay(2000).fadeIn("slow"); 
    $("#div4").delay(8000).fadeIn("slow"); 
}); 

Esta es mi configuración actual, pero creo que esta no es la mejor manera de escribir esto. No puedo encontrar ejemplos sobre cómo escribirías esto mejor para el tiempo. ¿Alguna ayuda? Lo apreciaría.Encadenamiento de animaciones jQuery que afectan a diferentes elementos

También debo agregar que el tiempo de cada elemento no es constante.

Respuesta

26

fadeIn toma una devolución de llamada como su segundo parámetro. Esa devolución de llamada se ejecuta tan pronto como se completa la animación. Si desea que los elementos que se desvanecen en forma secuencial, se puede encadenar las devoluciones de llamada:

$(document).ready(function() { 
    $("#div1").fadeIn("slow", function(){ 
     $("#div2").fadeIn("slow", function(){ 
      $("#div3").fadeIn("slow", function(){ 
       $("#div4").fadeIn("slow"); 
      }); 
     }); 
    }); 
}); 

Esto podría ser reescrita usando una matriz de selectores y un solo método, si se daba la gana:

var chain = function(toAnimate, ix){ 
    if(toAnimate[ix]){ 
     $(toAnimate[ix]).fadeIn('slow', function(){ chain(toAnimate, ix + 1)}); 
    } 
}; 

$(document).ready(function(){ 
    chain(['#div1', '#div2', '#div3', '#div4'], 0); 
}); 

See this last one in action at JSBin.

+0

Esta fue la solución que estaba a punto propongo, salvo que yo no entiendo por qué se repite el # DIV4 fadeIn en la parte inferior. ¿Es solo un error tipográfico? –

+0

Si bien esto es válido, creo que el objetivo de la demora del OP es crear el comportamiento secuencial según el tiempo que tomará la animación. Con eso, las referencias de retraso podrían ser arrancadas, ya que se llevará a cabo secuencialmente a través de la devolución de llamada ahora –

+0

ambos puntos buenos; corregido –

6

Lo haré en un bucle, siempre y cuando esté hablando de un incremento constante (y siempre que aparezcan en el mismo orden en la página).

$("#div1,#div2,#div3,#div4").each(function(idx) { 
    $(this).delay(idx * 1000).fadeIn("slow"); 
}); 

Ejemplo:http://jsfiddle.net/km66t/

Este utiliza el índice aprobada por .each() para incrementar el retardo.

Así que estás haciendo con eficacia:

$("#div1").delay(0).fadeIn("slow"); 
$("#div2").delay(1000).fadeIn("slow"); 
$("#div3").delay(2000).fadeIn("slow"); 
$("#div4").delay(3000).fadeIn("slow"); 

EDIT: Para abordar el tema es de esperar en el comentario a continuación, en su lugar podría almacenar una matriz de los retrasos que desea utilizar, y acceda al índice apropiado de la matriz usando el índice de .each().

var delays = [0, 1000, 2000, 4000]; 

$("#div1,#div2,#div3,#div4").each(function(idx) { 
    $(this).delay(delays[ idx ]).fadeIn("slow"); 
}); 
+0

Muy simple. Bien hecho. – bozdoz

+0

¿Qué sucede si no quiero que sea consistente? – Tom

+0

@Tom - ¿Estás diciendo que te gustaría que sean aleatorios, o tendrías un conjunto de retrasos específicos que querrías? Además, ¿le gustaría que la duración de la animación sea aleatoria o variable? Le daré una actualización antes de su respuesta. – user113716

0

No contento con las respuestas proporcionadas, esto es lo que solía:

var $steps = $('#div1, #div2, #div3'); 
    // iterate throught all of them 
    $.each($steps,function(index,value){ 
     $stage.fadeIn('slow', function(){ 
      // You can even do something after the an animation step is completed placing your code here. 
      // run the function again using a little introspection provided by javascript 
      arguments.callee 
     }); 
    }) 

De esta manera usted no tiene que declarar los retrasos.

11

Esto se puede hacer con elegancia desde 1,8:

$("div").toArray().map(function(e){ 
    return function(){ 
     return $(e).fadeIn(600).promise() 
    }; 
}).reduce(function(cur, next){ 
    return cur.then(next); 
}, $().promise()); 

http://jsfiddle.net/f3WzR/

+0

Hermosa solución. Gracias. – thatidiotguy

Cuestiones relacionadas