アニメーションを順番に動かすときに $.Deferred がちょっと便利
fuzz-jpn−
なんとも今さら感のある話題ですが、知らない人もいるかもしれないので備忘録。
アニメーションを順番に動かすやり方には色々ありますが、僕はさくっと便利に使える $.Deferred がお気に入りです。
$(element).animate() だけ使って複数のアニメーションを順番に動かそうとすると、コールバック関数の入れ子地獄になるんですよね。
3つのアニメーションだけでもこのありさまです。
$("#elem_1").animate({width: "30px"}, {duration: 800, complete:function(){ $("#elem_2").animate({width: "40px"}, {duration: 400, complete:function(){ $("#elem_3").animate({width: "50px"}, {duration: 200}); }}); }});
delay使って頑張っちゃうパターンもたまーに見ますが、ちょっとタイミング変えたいときにとても不便でイケてない。
$("#elem_1").animate({width: "30px"}, {duration: 800}); $("#elem_2").delay(800).animate({width: "40px"}, {duration: 400}); $("#elem_3").delay(1200).animate({width: "50px"}, {duration: 200});
$.Deferred を使うとこんな感じにすっきりします。
$deferred = $.Deferred(function(deferred){ deferred.then(function(){ return $("#elem_1").animate({width: "30px"}, {duration: 800}); }).then(function(){ return $("#elem_2").animate({width: "40px"}, {duration: 400}); }).then(function(){ return $("#elem_3").animate({width: "50px"}, {duration: 200}); }) }); $deferred.resolve();
それぞれのアニメーションタイミングが依存しあわないし、入れ子にもならないので順番の入れ替えもとても簡単。
可読性と保守性が高いですね。
サンプルは以下よりどうぞ
http://jsbin.com/qoxoqihotifa/1/watch
詳しい使い方は公式ドキュメント見るなりしてみてください。
$.Deferred、便利です。