jsfiddleを50〜100回更新するたびに、私が作成した新しい問題の解決に役立つstackoverflowコミュニティにアクセスできるようです。ほんとありがと!
背景:アニメーションを含むいくつかの関数があります。関数は、前の関数が完了した後に起動されます。いくつかの助けと調査により、私は$ .whenと.promise()を使用して、各関数の最初の非常に醜いコールバック文字列とsetTimeoutsを制御し始めました。
私のジレンマは次のとおりです。ある時点で、ユーザーはすべてを一時停止して、暇なときに再開したいと思うかもしれません。この機能を追加できないようです!
$('div:animated')。stop()を使用してすべてのアニメーションを一時停止できますが、.promise()はまだ解決されるため、これは一時的なものです。その動作をオーバーライドする方法はありますか?一時停止と再開を実装しやすくするのに役立つ可能性のあるリストラはありますか?
明日は、すべてのアニメーションをプロキシオブジェクトキューに追加する予定ですが、新しいオブジェクトでグローバルキューを作成すると、既存の構造でどれだけうまく機能するかわかりません。また、値がオフになっているかどうかを確認するためにブール値を追加することも検討します。関数を呼び出したり、アニメーション化したりしないでください。これらの解決策のいずれかが私が取るべき適切な方向性であるかどうかわかりませんか?
この投稿をプレビューした後、ネストされたスタートボタン機能をリファクタリングする方法も学びたいと思います。
一時停止および再開機能の実装に関するあらゆる指示をいただければ幸いです。
以下のコードは非常に単純化されており、各関数にはより多くの要素とアニメーションが含まれています。
JS:
$('#start').click( function() {
// run a and wait one second, when done run b and wait 1 second...
a().delay(100).promise().done( function(){
b().delay(100).promise().done( function(){
c().delay(100).promise().done( function(){
d().delay(100).promise().done( function(){
e().delay(100).promise().done( function(){
f().delay(100).promise().done( function(){
alert('all done!');
});
});
});
});
});
});
});
$('#reset').click( function() {
$('.box').css({
top: '0px'
});
});
$('#pause').click( function() {
$('div:animated').stop();
});
function a() {
return $('.box1').animate({top: '100px'}, 1000, function(){
$('.box1').animate({top: '50px'}, 1000);
});
return $('.box6').animate({top: '200px'}, 4000);
}
function b(){
return $('.box2').animate({top: '100px'}, 1000);
}
function c(){
return $('.box3').animate({top: '100px'}, 1000, function(){
$('.box3').animate({top: '50px'}, 1000);
});
}
function d(){
return $('.box4').animate({top: '100px'}, 1000);
}
function e(){
return $('.box5').animate({top: '100px'}, 1000, function(){
$('.box5').animate({top: '50px'}, 1000);
});
}
function f(){
return $('.box6').animate({top: '100px'}, 1000);
}
htmlとCSS
<button id='start'>animate</button>
<button id='reset'>Reset</button>
<button id='pause'>pause</button>
<div class='boxes'>
<div class='box box1'></div>
<div class='box box2'></div>
<div class='box box3'></div>
<div class='box box4'></div>
<div class='box box5'></div>
<div class='box box6'></div>
</div>
.boxes{position: relative}
.box{width: 40px; height: 40px; background-color: green; position:absolute;}
.box1{left: 0px;}
.box2{left: 60px;}
.box3{left: 120px;}
.box4{left: 180px;}
.box5{left: 240px;}
.box6{left: 300px;}
編集 あなたの答えは私が探していた学習体験を提供してくれました。マインドシェアに本当に感謝しています!私の考案した例では、提示された回答では複数のアニメーションを同時に起動できないため、現実の問題を十分に示していない可能性がありますか?少なくとも思いませんか?たとえば、box1とbox2が同時に移動する場合や、box3が起動するとbox6も移動する場合があります。私が実装した最初の非常に醜いpromiseシステムは、各関数が多くのアニメーションで構成されていたため、多くの関数を使用していました。提案された回答でこれをどのように達成しますか?
EDIT2 2つの答え、charlietflを使用すると、同時に起動する2次関数を簡単に追加できます。非常に重要です。Alnitak'sには、配列を作成してアニメーションに適用するエレガントな方法があり、アニメーションの種類を非常に簡単に変更できます(fadeOut()、fadeIn())。
したがって、私がやろうとしているのは、Alnitaks配列形式を使用するセカンダリアニメーション用のネストされた配列を作成できるように、2つを組み合わせることです。
['.box1', 'animate', { top: '50px'}, 1000],
つまり、私はまだすべての答えに取り組んでいますが、charlietflsに近づいています。Alnitakの配列を彼に追加するか、charlietflのネストをAlnitakに追加します。
これは私が今まで意図していたよりも激しくなりました。私はあなたの貢献と学ぶためのコードに感謝します....非常に有益です!