可以使用setTimeout
功能延迟MouseLeave事件:
setTimeout(function() {
$('div.slidebox').animate({width: '+=17px', marginLeft: '-=14px'}, {duration: '2000',easing: 'swing',queue: true});
}, 800);
你想要什么,不过,因为如果用户从移动鼠标,匆忙回到这不会做的相当,那么div会进一步萎缩,然后重新长出其超时到期后的预期大小。 (重复执行此操作可能会导致div简短地缩小为无)。为防止出现此情况,您需要防止在“取消的mouseleave”情况下触发悬停事件。这需要多一点代码:
var hovered = false;
$('li.activated').hover(function() {
if(hovered) return;
hovered = true;
$('div.slidebox').animate({width: '-=17px', marginLeft: '+=14px'}, {duration: '800',easing: 'swing',queue: true});
}, function() {
var element = this;
setTimeout(function() {
if($(element).is(':hover') || !hovered) return;
hovered = false;
$('div.slidebox').animate({width: '+=17px', marginLeft: '-=14px'}, {duration: '2000',easing: 'swing',queue: true});
}, 800);
});
的jsfiddle:http://jsfiddle.net/uUjhJ/2/
这主要是工作,但也有一些勤奋老鼠挥舞着,有可能使动画“破解”,并开始抽水,像波纹管(直到它通过动画队列)。这是通过在mouseleave动画播放过程中将鼠标移回来开始的,而且我唯一可以找到解决此问题的方法是将“队列”选项设置为false,并将动画值更改为固定值(而不是比相对值使用+ =和 - =):
var hovered = false;
$('li.activated').hover(function() {
if(hovered) return;
hovered = true;
$('div.slidebox').animate({width: '83px', marginLeft: '14px'}, {duration: '800',easing: 'swing',queue: false});
}, function() {
var element = this;
setTimeout(function() {
if($(element).is(':hover') || !hovered) return;
hovered = false;
$('div.slidebox').animate({width: '100px', marginLeft: '0px'}, {duration: '2000',easing: 'swing',queue: false});
}, 800);
});
的jsfiddle:http://jsfiddle.net/uUjhJ/3/
理论上应该可以通过保持状态的仔细跟踪和使用回调的调用,使原来的方法正常工作到animate
,但它非常挑剔,我还没有能够使其工作。
编辑:啊,错过了你还想在悬停事件中添加/删除div。这样做的工作:
var hovered = false;
$('li.activated').hover(function() {
if(hovered) return;
hovered = true;
if(!$('div.slidebox').length)
$('ul.actilist').prepend($('<div> </div>').addClass('slidebox'));
$('div.slidebox').animate({width: '83px', marginLeft: '14px'}, {duration: '800',easing: 'swing',queue: false});
}, function() {
var element = this;
setTimeout(function() {
if($(element).is(':hover') || !hovered) return;
hovered = false;
$('div.slidebox').animate({width: '100px', marginLeft: '0px'}, {duration: '2000',easing: 'swing',queue: false,complete: function() {
if($(element).is(':hover')) return;
$('ul.actilist').find('div.slidebox').remove();
}});
}, 800);
});
注意,该元素在“完整”的回调去除,以确保它的动画,而不是之前后取出,并同时添加代码和删除代码仔细检查,他们不会与任何内容冲突(重新显示时重复添加或删除)。
的jsfiddle:http://jsfiddle.net/uUjhJ/4/
你为什么有两个不同的'.hover()'方法/实例都瞄准同一个'$( 'li.activated')'? – Sparky
你可以发布[jsfiddle](http://jsfiddle.net)吗? – Eric
至少也发布你的HTML。 – Sparky