動畫似乎同時運行的原因是jQuery的動畫都是異步執行的。所以你的代碼正在做的是基本上開始所有的動畫,然後你的瀏覽器幾乎同時處理實際的動畫。
但是,jQuery的動畫函數確實支持使用在動畫完成後調用的回調函數。通過確保後面的動畫在這個回調中發生,我們可以強制動畫順序執行。
這裏,你可以實現你的要求(jsfiddle here)的一種方法:
$('#button').click(function(){
var i;
var $elems = [];
for (i = 1; i < 4; ++i) {
$elems.push($('#img' + i));
}
var animate = function() {
var $elem;
if ($elems.length) {
$elem = $elems.shift();
$elem.fadeIn("slow").delay(1000).fadeOut("slow", animate);
}
// if the $elems has been cleared out, we're done and this function won't be requeued
};
animate();
});
請注意,我排隊再次調用animate()
的回調.fadeOut
。然後該函數將重新執行,但數組的狀態將在每個函數調用中發生變化,以便每個元素都按順序執行一次動畫。當數組被清除時,函數將只運行一次以驗證元素全部是動畫的,在這種情況下,它將返回而不重新排隊。
爲什麼你會想到什麼? fadeIn是一個同步調用,所以它不一定等待它完成。 – dchhetri
@ user814628,我認爲你的意思是說「異步調用」,而不是「同步調用」 – Brad
@ user814628:也許是因爲用戶真的不知道'.fadeIn'或jQuery中的其他效果函數是異步的。異步執行在JavaScript中很常見,特別是在現代JS框架中,但每個人都必須在某個時候第一次瞭解它。這是一個很好的問題,不僅適用於jQuery中的動畫效果,也適用於理解AJAX和Backbone.js模型拾取(這實際上也是AJAX的抽象,但不必介意)。不要因爲不知道而反感用戶;相反,提供一個答案並教:-) –