2013-04-18 133 views
0

長序列我不得不做出的長篇動畫以jQuery的,充滿fadeOuts的,fadeIns,slideIns,...動畫jQuery中

我遇到的問題是,我的代碼看起來醜陋,它是充滿回調。
另外,如果我想停止一段時間的動畫,如: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的,甚至可能是一些偉大的插件的任何其他方式來幫助我解決這個問題?

謝謝!

+1

我建議嘗試隊列方法:http://api.jquery.com/queue/ –

回答

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元素列表上下遍歷的過程抽象出來,以便除之外的其他內容和fadeOut。如果你覺得冒險,我會讓你試試看。

0

試試這個:

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

$(function(){ 

     slide.each(function(k){ 

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

hm .. fadeOut:P – intelis

+0

它是作弊,假設你知道默認的動畫延遲。你可以使用相同的假設,並添加一個不同的向後調用'fadeOut'的循環。 –

-1

JQuery的動畫需要兩個參數(最大),持續時間和完整的,持續時間是多久你想你的動畫來完成,也可以使用以毫秒爲單位的時間「慢」或「快」,第二個參數完成,這是回調函數。

如果不想使用延遲,可能會使以前的動畫變慢。

例如

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

這與延遲不一樣。這隻會在5秒鐘內「拉伸」動畫。 – intelis

+0

這是真的,這就是我的意思如果不想使用延遲! –

+1

即使我不想使用延遲,這仍然是不一樣的。延遲和持續時間是兩回事。延遲在一段時間內停止函數的執行,其中持續時間參數僅在一段時間內延長動畫。如果我使用你的代碼,淡入淡出後的下一個函數將會立即運行:) – intelis