我有这个盒子,在悬停时播放加载器动画,然后在2秒后展开:
http://jsfiddle.net/frank_o/WwD5V/23/embedded/result/
但是,如果我将鼠标移动到下面的V形动作中,它怎么会立即扩展(没有加载器动画)?
var timeout;
$('.wrapper').bind('mouseenter', function () {
if(!$('.wrapper').hasClass('expanded')) {
$('.loader').show();
// http://stackoverflow.com/questions/23922264/jquery-animate-goes-bananas-despite-stop
var timeoutHandle = $(this).data('timeout') || 0;
if (timeoutHandle > 0) clearTimeout(timeoutHandle);
timeoutHandle = setTimeout(function () {
$('.wrapper').animate({
width: '100%'
}, 200);
$('.wrapper').addClass('expanded');
}, 2000);
$(this).data('timeout', timeoutHandle);
}
}).mouseleave(function () {
$('.loader').hide();
$('.wrapper').animate({
width: '120px'
}, 200);
$('.wrapper').removeClass('expanded');
});
答案 0 :(得分:1)
当您mouseover
时,设置超时。当您mouseleave
时,超时继续运行。您似乎需要在mouseleave
上清除超时。
我做了几件事来实现这个目标:
1)增加脚本顶部变量timeoutHandle
的范围:
var timeoutHandle;
2)从var
中的超时定义中删除mouseenter
:
timeoutHandle = $(this).data('timeout') || 0;
3)清除mouseleave
上的超时:
clearTimeout(timeoutHandle);
正如您所提到的,不再需要expanded
类。我把它放在下面的小提琴里。
另外,我添加了代码来停止mouseleave
上的任何当前动画,以防盒子处于动画中间。我放慢了"扩展"动画可以更清楚地说明这一点。
$('.wrapper').stop(true,false).animate({
width: '120px'
}, 200);