これが実用的な解決策です:私もステップイベントを使用しました
HTML
<div id="#wrapper">
<div class="left"></div>
<div class="right"></div>
<div class="dot"></div>
</div>
<button class="go">GO!</button>
CSS
#wrapper {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
.left, .right {
position: absolute;
top: 25px;
width: 100px;
height: 100px;
}
.left {
z-index: 1;
left: 25px;
background-color: red;
}
.right {
right: 25px;
background-color: green;
}
.dot {
position: absolute;
top: 72.5px;
width: 5px;
height: 5px;
left: 50%;
margin-left: 2.5px;
background-color: blue;
}
button.go {
display: block;
position: absolute;
top: 150px;
left: 25px;
}
jQuery
var $left = jQuery('.left');
var $right = jQuery('.right');
var $button = jQuery('button.go');
var $dot = jQuery('.dot');
var rightPos = $right.offset().left;
var dotPos = $dot.offset().left;
var thread = undefined;
var animationStarted = false;
$button.click(function() {
$left.animate({
'left': rightPos
}, {
duration: 1000,
specialEasing: {
'left': 'easeOutQuad'
},
step: function(now, fx) {
if (!animationStarted && now +$left.width() > dotPos) {
if (thread) { clearTimeout(thread); }
thread = setTimeout(function() {
animation();
animationStarted = true;
}, 0);
}
},
complete: function() {
$(this).after('<div>Animation complete.</div>');
}
});
});
function animation() {
$right.animate({
'background-color': '#0000ff'
}, {
specialEasing: {
'background-color': 'easeOutQuad'
}
});
};
step-function内でsetTimeoutを使用して、別のコンテキストで2番目のアニメーションを呼び出したことに注意してください。実行中の1つのアニメーション内で.animate()呼び出しを実行するのが適切かどうかはわかりません。スムーズに保つためには、こうする方がいいと思います。誰かがそれを正確に知っていますか?
もう1つのポイントは、変数animationStartedです。2番目のアニメーションを呼び出したかどうかを覚えているだけです。これは、他のアニメーションのステップイベント内で複雑なアニメーションを呼び出さないようにするためのもう1つのことです。このように、私たちは確かにそれを一度だけ呼びます。
デモ