2012-06-22 10 views
5

Estoy tratando de escribir algunos jquery que pasarán por un elemento de lista/dom no ordenado y asignar una clase de CSS (animación) a cada elemento de la lista/hijo. También quiero establecer un tiempo de retardo ajustable entre .addClass.Agregar animación CSS con demora a cada elemento de la lista

Todo lo que he probado ha fallado miserablemente.

Por ejemplo:

<ul> 
    <li>Item 1</li> 
    <li>Item 2</li> 
    <li>Item 3</li> 
    <li>Item 4</li> 
</ul> 

se convierte en:

<ul> 
    <li class="animation">Item 1</li> 
    (50ms delay) 
    <li class="animation">Item 2</li> 
    (50ms delay) 
    <li class="animation">Item 3</li> 
    (50ms delay) 
    <li class="animation">Item 4</li> 
    (50ms delay) 
</ul> 

¿Alguna idea?

Respuesta

14

Esto funciona aquí:

$('ul li').each(function(i){ 
    var t = $(this); 
    setTimeout(function(){ t.addClass('animation'); }, (i+1) * 50); 
}); 

http://jsfiddle.net/GCHSW/1/

+1

¡Inteligente! Voto ascendente. – Cranio

+0

@Cranio por qué gracias señor! :] –

+0

Gracias! Exactamente lo que necesitaba. Funciona genial. – apttap

0

Aunque la respuesta anterior hace un buen trabajo de acercarse al escenario <ul> y <li>, no va a funcionar muy bien para una situación más detallado. Para realmente marcar esto, la funcionalidad debe estar envuelta en una función que acepte el elemento objetivo y la demora como una entrada. La función tomará entonces ese elemento, y establecer un tiempo de espera con el retraso de ... suspiro, esto es demasiado complicado vez debería codificaré:

function applyAnimation(element, delay){ 
setTimeout(function(){ $(element).addClass('animation'); }, delay); 
var children = document.getElementById(id).children; 
for(var i = 0; i < children.length; i++){ 
    applyAnimation(children[i],(2+i) * delay);//2+i:0 fails, 1 would be parent, 2 is child 
} 
} 
1

Considera:

HTML:

<ul id="myList"> 
    <li>Item 1</li> 
    <li>Item 2</li> 
    <li>Item 3</li> 
    <li>Item 4</li> 
</ul> 

Javascript:

$("#myList li").each(function(i, li) { 
    var $list = $(this).closest('ul'); 
    $list.queue(function() { 
     $(li).addClass('animation'); 
     $list.dequeue(); 
    }).delay(50); 
}); 

Ver violín: http://jsfiddle.net/DZPn7/2/

Aunque esto no es ni conciso ni eficiente, es una solución de jQuery purist.

+0

Bueno, pero supongo que el método setTimeout es más rápido para el navegador que usar las funciones queear y dequeue de jQuery. Para sitios móviles + animaciones css, esto es muy importante. – andreszs

1

Tengo 2 maneras para animaciones (con jQuery y CSS3 Transitions + .addClass).

Por lo tanto, puede intentar jQuery por ejemplo:

$('#myList li').each(function(i){ 
    $(this).delay(50*i).animate({opacity: 1},250); 
}); 

y el uso de CSS3 transiciones:

$('#myList li').not('.animation').each(function(i){ 
    setTimeout(function(){ 
     $('#myList li').eq(i).addClass('animation'); 
    },50*i); 
}); 

disfrutar!

Cuestiones relacionadas