我已经使用JQuery的一个小动画作品:一台#photos
包含9张照片,我想增加宽度和高度使用animate
鼠标悬停功能。 但同时,如果用户移动鼠标到另一张照片,它会自动触发下一个动画,所以它是完全糊涂了在动画运行。 我该怎么办? 我的代码是:
$(function(){
$("#photos tr td img").mouseover(function(){
$(this).animate({"width":"1000px","height":"512px"},2000)
});
$("#photos tr td img").mouseout(function(){
$(this).animate({"width":"100px","height":"50px"},2000)
});
});
jQuery提供回调动画完成时。 然后,它可能是这样的,例如:
var animating = false;
$(function(){ $("#photos tr td img").mouseover(
function()
{
if(!animating)
$(this).animate({"width":"1000px","height":"512px"},2000, easing, function() { animating = true; });
});
$("#photos tr td img").mouseout(
function()
{
$(this).animate({"width":"100px","height":"50px"},2000, easing, function() { animating = false; })
});
});
开始一个新的,以避免陷入困境之前,您应该停止所有正在运行的动画。 这可能是这一特定问题的最好的和简单的解决方案。
$(function(){
$("#photos tr td img").mouseover(function(){
$(this).stop();
$(this).animate({"width":"1000px","height":"512px"},2000)
});
$("#photos tr td img").mouseout(function(){
$(this).animate({"width":"100px","height":"50px"},2000)
});
});
除了其他的答案我会考虑使用hoverIntent插件。 这正好避免了当用户扫动鼠标的所有照片掀起了大规模的动画队列。 你只有真正想要的动画,如果用户实际上徘徊。
我想,答案取决于你想在第二mousover发生(而第一个还是动画)什么。
1)如果你想什么事情发生,你可以有你的第一个悬停设置“动画效果”的状态,对整个TR,也许是这样的:
$tr = $(this).closest("tr");
if ($tr.data("animating") != true) {
$tr.data("animating",true);
$(this)
.stop(true,false)
.animate({"width":"1000px","height":"512px"},2000, function(){
$tr.data("animating",false);
});
}
2)如果你想在原来的结束动画让你新的图像可以动画,你需要.stop()旧的设置为true的clearQueue和goToEnd参数。 这将确保额外的排队事件(从一大堆悬停的)不只是不停发生几分钟,它会做动画,立即跳到它的最终状态:
$(this).closest("tr").find("img:animated").stop(true,true);
$(this).animate({"width":"1000px","height":"512px"},2000});
经常检查元素的队列动画和从来没有从现在得到的冲突:
$(function(){
$("#photos tr td img").mouseover(function(){
if($(this).queue("fx").length == 0)
$(this).animate({"width":"1000px","height":"512px"},2000)
});
$("#photos tr td img").mouseout(function(){
$(this).animate({"width":"100px","height":"50px"},2000)
});
});