2011-06-15 15 views
13

Por lo tanto, me gustaría un elemento a desaparecer y esperar medio segundo, luego se desvanecen en la siguiente etc ...jQuery cada uno() con un retraso

Mi código:

$('.comment').each(function() {     
        $(this).css({'opacity':0.0}).animate({ 
         'opacity':1.0 
        }, 450).delay(500); 
       }); 

I Obviamente estoy haciendo algo realmente tonto .... (Espero) ... Mi pregunta es: ¿esto es posible? si no, ¿alguien puede señalarme en la dirección correcta?

¡Gracias!

+0

Lo que está haciendo su código, a diferencia de lo que quiere que haga? – Matt

+0

posible duplicado de [Cómo agregar pausa entre cada iteración de jQuery .each()?] (Http://stackoverflow.com/questions/5202403/how-to-add-pause-between-each-iteration-of-jquery -cada uno) – Alnitak

+0

Nunca vi esa pregunta ... Sin embargo, esta pregunta tiene respuestas diferentes ... Vale la pena mantenerla para que otros tengan diferentes sugerencias –

Respuesta

38

O algo así:

$.each($('.comment'), function(i, el){ 

    $(el).css({'opacity':0}); 

    setTimeout(function(){ 
     $(el).animate({ 
     'opacity':1.0 
     }, 450); 
    },500 + (i * 500)); 

}); 

demostración =>http://jsfiddle.net/steweb/9uS56/

+0

¡Perfecto, gracias! –

+0

¡De nada! :) – stecb

+0

¡Eres un héroe! –

5

Trate de hacer esto:

var time = 500; 
$('.comment').each(function() {     
    var $this = $(this); 
    function delayed() { 
     $this.css({'opacity':0.0}).animate({ 
        'opacity':1.0 
       }, 450); 
    } 
    setTimeout(delayed , time); 
    time += 500; 
}); 
3

Esta función se repetirá a través de cada elemento de la colección (en este ejemplo $comments) y se desvanecen en todos ellos. Cada animación comenzará cuando la anterior haya terminado.

var $comments=$('.comment'); 

(function fadeIterator($collection, index) { 
    $collection.eq(index).fadeIn(1000, function() { 
     fadeIterator($collection, index++); 
    }); 
}($comments, 0)); 

jsFiddle Demo

2

o el uso de .next() y una función de devolución de llamada:

// create a function to fade in the comment block 
function showit(item){ 

    // animate the fade effect (and any other required) 
    item.animate({opacity:1},450,function(){ 

     // after completing the animation, call the 
     // showit function with the next comment block 
     showit(item.next('.comment')) 

    }) 

} 

// set the opacity of comment blocks to 0 and 
// select the first one, then call showit to 
// initialise animation loop 
showit($('.comment').css({opacity:0}).eq(0)) 

violín aquí: http://jsfiddle.net/rJnnZ/

Creo que esta es una mejor solución, porque se espera hasta que la animación anterior finaliza, antes de pasar al siguiente, en lugar de calcular el temporizador de antemano, que puede convertirse en un-s se ha sincronizado con un uso intensivo de la CPU u otras circunstancias.

12

intentar algo como esto

$(this).find('#results').children().each(function(index){ 
     $(this).delay(500 * index).slideDown(500); 
}) 
+2

Awesome answer. Intentaba hacer lo mismo y el truco de multiplicar el retraso con el índice funcionó muy bien. ¡Gracias! – sh4

+0

Para otros que solo vieron el título incompleto "jQuery each() con un retraso" (se trata de animaciones). Solo con animaciones puedes usar delay. Si revisas a tus hijos y quieres, por ejemplo, ** activar un clic, la demora no funcionará **. Ver también http://stackoverflow.com/q/4544126/1066234 –

Cuestiones relacionadas