2012-06-22 9 views
5

Sto provando a scrivere un jquery che passerà attraverso un elenco/dom non specificato specificato e assegnerà una classe CSS (animazione) a ogni elemento di elenco/figlio. Voglio anche impostare un tempo di ritardo regolabile tra .addClass.Aggiunta dell'animazione CSS con ritardo a ciascuna voce di elenco

Tutto quello che ho provato è fallito miseramente.

Ad esempio:

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

diventa:

<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> 

Qualche idea?

risposta

14

Questo qui funziona:

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

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

+1

Intelligente! Upvoting. – Cranio

+0

@ Cranio perché grazie signore! :] –

+0

Grazie! Esattamente quello di cui avevo bisogno. Funziona alla grande. – apttap

0

Anche se la risposta di cui sopra fa un buon lavoro di avvicinarsi scenario <ul> e <li>, non funzionerà molto bene per una situazione più dettagliato. Per comporlo davvero, la funzionalità dovrebbe essere racchiusa in una funzione che accetta l'elemento target e ritarda come input. La funzione sarà poi prendere quell'elemento, e impostare un timeout con il ritardo per ... sigh, questo è troppo coinvolto dovrei Code It:

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

Considerate questo:

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); 
}); 

See violino: http://jsfiddle.net/DZPn7/2/

Anche se questo non è né conciso né efficiente, è la soluzione di un purista di jQuery.

+0

Bello, ma suppongo che il metodo setTimeout sia più veloce per il browser rispetto all'uso delle funzioni queye e dequeue di jQuery. Per i siti mobili + le animazioni CSS, questo è molto importante. – andreszs

1

Ho 2 modi per le animazioni (con transizioni jQuery e CSS3 + .addClass).

Così, Si può provare jQuery per esempio:

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

e utilizzando CSS3 Transitions:

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

Enjoy!

Problemi correlati