2012-06-22 40 views
5

我正在尝试编写一些jquery,它将通过指定的无序列表/ dom元素并为每个列表项目/子项分配一个CSS(动画)类。我也想在.addClass之间做一个可调整的延迟时间。添加带有延迟的CSS动画到每个列表项

我试过的一切都惨败了。

例如:

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

变为:

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

有什么想法?

回答

14

这这里工作:

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

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

+1

聪明! Upvoting。 – Cranio

+0

@Cranio为什么谢谢你,先生! :] –

+0

谢谢!正是我需要的。很棒。 – apttap

0

虽然上面的回答也接近<ul><li>场景的好工作,也不会为一个更详细的情况很好地工作。要真正拨入此功能,应将功能封装在接受目标元素和延迟作为输入的功能中。该函数会采取这一元素,并设置与...叹息延迟超时,这太参与,我应该只是它的代码:

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

考虑一下:

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

见琴:http://jsfiddle.net/DZPn7/2/

虽然这既不简洁也不高效,但它是一个jQuery纯粹者的解决方案。

+0

不错,但我想setTimeout方法比使用jQuery的queye和dequeue函数更快。对于移动网站+ CSS动画,这非常重要。 – andreszs

1

我有2种动画方式(使用jQuery和CSS3转换+ .addClass)。

所以,你可以尝试的jQuery例如:

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

,并使用CSS3过渡:

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

享受!