あなたは私の好奇心をピークにしたので、それが可能かどうかを確認する必要がありました:)
これを試して:
$(".cube").bind('transitionend', function() {
// Reversing the animation flag for the mouse-leave
if ($(this).data("animating")) {
$(this).data("animating", false);
} else {
$(this).data("animating", true);
}
});
$('.cube').mouseenter(function(event){
$(this).data('animating', true);
$(this).toggleClass('show-back',true);
});
$('.cube').mouseleave(function(event){
$that = $(this);
if ($that.data("animating")) {
setTimeout(function () {
$that.toggleClass('show-back',false);
}, 1000);
} else {
$that.toggleClass('show-back',false);
}
});
JSFiddle
ここでの秘訣は 2 つあります。
- 最初に、アニメーションが進行中であるかどうかを知る方法があることを確認する必要がありました (つまり、transitionend での上記のサンプル バインディング)。
- 次に、このトランジション エンドがアニメーション バックでも発生することを知っておく必要があります。そのため、アニメーション フラグを切り替えました。
次に、マウスを離すイベント (アニメーション フラグが設定されている場合) に 1 秒の遅延が追加され、逆方向のアニメーションが完了したことを確認します。
これは大まかな解決策ですが、それで十分です。
編集:
上記のコードはアニメーションを反転しますが、継続しません。同じ方向に継続するために必要なものは次のとおりです。注: 少しハックで、Chrome でのみテストされています。
JavaScript
$(".cube").bind('transitionend', function() {
// Reversing the animation flag for the mouse-leave
if ($(this).data("animating")) {
$(this).data("animating", false);
} else {
$(this).data("animating", true);
}
});
$('.cube').mouseenter(function(event){
$(this).data('animating', true);
$(this).toggleClass('show-back',true);
});
$('.cube').mouseleave(function(event){
$that = $(this);
if ($that.data("animating")) {
setTimeout(function () {
$that.toggleClass('show-back',false);
$that.toggleClass('show-back-again',true);
setTimeout(function () {
$that.toggleClass('show-back-again',false);
}, 50);
}, 1000);
} else {
$that.toggleClass('show-back',false);
$that.toggleClass('show-back-again',true);
setTimeout(function () {
$that.toggleClass('show-back-again',false);
}, 50);
}
});
CSS
#cube.show-back-again {
-webkit-transform: translateZ( -100px ) rotateY( -360deg );
-moz-transform: translateZ( -100px ) rotateY( -360deg );
-o-transform: translateZ( -100px ) rotateY( -360deg );
transform: translateZ( -100px ) rotateY( -360deg );
}
更新された JSFiddle