问题在于这样一个事实,for循环调用.transition
连续10次。 jQuery队列中的调用是queued
(这是通过transit.js在幕后完成的),但它们是而不是按您期望的顺序排队。
采取下面的例子:
$(function() {
$('#test').transition({x:40}, function() {
$(this).transition({y:40});
})
$('#test').transition({scale:0.5}, function() {
$(this).transition({skewX:"50deg"});
});
});
#test {
width: 10em;
height: 10em;
background-color: gray;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="http://ricostacruz.com/jquery.transit/jquery.transit.min.js"></script>
<div id="test"></div>
在这个例子中,第一过渡x:40
将被立即因为没有队列执行。尽管它是即时执行的,因为它是一个动画,所以它将使用某种形式的setTimeout
或setInterval
和将不会在transition
方法调用中完成。因此,将调用scale:0.5
转换,而x:40
转换仍在进行动画处理,这会在y:40
放入队列之前将其放入队列中。
因此,队列顺序是
x:40 -> scale:0.5 -> y:40 -> skewX:50deg
同样的,你的代码产生以下队列:
rotateY:90deg -> ... -> rotateY:90deg -> rotateY:180deg -> ... -> rotateY:180deg
因此你的代码的行为。它首先旋转图像90deg
,然后它再做9次,这不会在视觉上改变任何东西(因此“暂停”)。然后它改变图像并旋转它180deg
并且再做9次。
一个解决方案可能是使用.transition
函数的回调来创建递归函数。
$(function() {
FlipMe($('#test_flip'), "http://i.imgur.com/tYYtwbi.jpg", "http://i.imgur.com/G4CvJpc.jpg", 10)
});
function FlipMe($el, image1, image2, times) {
$el.css('background-image', 'url("'+image1+'")')
.transition({rotateY: '90deg'}, function() {
$el.css('background-image', 'url("'+image2+'")')
.transition({rotateY: '180deg'}, function() {
if(times > 0) {
FlipMe($el, image2, image1, times - 1);
}
});
});
}
更新小提琴这里:http://jsfiddle.net/ce9b9aja/1/
上面的代码只使用回调函数来决定事件的顺序的例子如下实施。当第一次转换完成时,回调函数将“排队”下一个转换,由于没有其他任何东西在队列中,所以将立即执行。等等。
甜美的男人。这是一个很好的解决方案! – tomc 2014-09-02 23:53:54