在jQuery中动画长序列

时间:2013-04-18 16:45:17

标签: javascript jquery animation

我必须使用jQuery制作一个长动画,充满了fadeOuts,fadeIns,slideIns,......

我遇到的问题是我的代码看起来很丑,并且充满了回调。
另外,如果我想在一段时间内停止动画,例如:slideOut->wait 5 seconds->slideIn我必须使用延迟,我不确定这是否是最佳做法。

示例

/* Slides */
var slide1 = $('div#slide1'),
    slide2 = $('div#slide2'),
    slide3 = $('div#slide3');

$(document).ready(function(){
    slide1.fadeIn(function(){
        slide2.fadeIn(function(){
            slide3.fadeIn().delay(3000).fadeOut(function(){
                slide2.fadeOut(function(){
                    slide1.fadeOut();
                });
            });
        });
    });
});

JSFIddle: http://jsfiddle.net/ZPvrD/6/

问题:有没有其他方法可以在jQuery中构建动画,甚至可能是一些很好的插件来帮助我解决这个问题?

谢谢!

3 个答案:

答案 0 :(得分:2)

以下是您要查找的插件:)完全相同,但比现有代码更灵活http://jsfiddle.net/ZPvrD/11/

(function($){
    $.fn.fadeInOut = function(middleDelay) {
        middleDelay = middleDelay || 0; 
        var index = 0,
            direction = 1, // 1: fading in; -1: fading out        
            me = this,
            size = me.size();
        function nextAnimation() {
            // Before the first element, we're done
            if (index === -1 )  { return; }

            var currentEl = $(me.get(index)),
                goingForward = direction === 1,
                isLastElement = index === (size - 1);

            // Change direction for the next animation, don't update index
            // since next frame will fade the same element out
            if (isLastElement && goingForward) {
                direction = -1;
            } else {
                index += direction;
            }

            // At the last element, before starting to fade out, add a delay 
            if ( isLastElement && !goingForward) {
                currentEl.delay(middleDelay);
            }
            if (goingForward) {
                currentEl.fadeIn(nextAnimation);
            } else {
                currentEl.fadeOut(nextAnimation);                    
            }
        }
        nextAnimation();
        return this;
    }        
})(jQuery);

你称之为

$('div.slideWrapper>div.slide').fadeInOut(3000);

这个遍历等待每个动画完成的jQuery元素列表的过程可以被抽象出来,这样它就可以用于除fadeInfadeOut之外的其他东西。如果你有冒险的话,我会留给你试试。

答案 1 :(得分:0)

试试这个:

 /* Slides */
 var slide = $('div[id*="slide"]');

 $( function(){

      slide.each( function( k ){

            $( this ).delay( 500 * k ).fadeIn();
      });
  });

答案 2 :(得分:-1)

JQuery动画有两个参数(最大值),持续时间和完整,持续时间是你希望动画完成多长时间的时间(以毫秒为单位),或者你可以使用“慢”或“快”,第二个参数完成哪个是回调函数。

如果不想使用延迟,则可能会使上一个动画变慢。

e.g。

slide1.fadeIn(5000, function(){
    slide2.fadeIn();
};