2012-01-14 280 views
4

我在freakyleaf.co.uk/hoverfade/上有以下活动示例,在悬停在一个图块上时,图块背景图像在600毫秒(.tile_img)上形成1到0.25不透明度,然后文本从0到1不透明度过滤500ms(.overlay)。在鼠标移出时,会发生相反的情况。jQuery悬停鼠标悬停/鼠标退出计时

只要鼠标一旦鼠标悬停动画完成,这一切都可以正常工作。如果在鼠标悬停动画期间鼠标离开,平铺图像将淡出为完全不透明状态,但文本不会褪色,从而使其可见。

我有以下代码:

$(document).ready(function(){ 
$(".tile").hoverIntent(function() { 

$(".tile_img", this).animate({"opacity": "0.25"}, 600, 
function() { $(this).next(".overlay").animate({"opacity": "1"}, 500); } 
    ); 
}, 
function() { 
$(".overlay", this).animate({"opacity": "0"}, 500, 
function() { $(this).prev(".tile_img").animate({"opacity": "1"}, 600); } 
    ); 
}); 
}); 

和HTML:

<div class="wrapper"> 
    <ul id="service_boxes"> 
    <li id="sb_recording" class="tile" onClick="location.href='recording.php';" style="cursor: pointer;"> 
     <h2><a href="recording.php">Recording</a></h2> 
     <div class="tile_img"></div> 
     <div class="overlay"><p>Vintage analogue warmth and cutting-edge digital technology working in perfect harmony - That's the SoundARC sound!</p></div> 
    </li> 
    </ul> 
</div> 

我明白,我也许应该使用.stop功能,但如此在一些地方已经尝试过,但只有到目前为止破碎的代码。

我甚至不确定我拥有的是实现我想要的最佳方式;我只是偶然的,因为我是一个完全的新手。

任何帮助将不胜感激。

非常感谢。

回答

1

您还可以通过使用setInterval的检查,如果动画仍然在,当它完成火新的动画..

$(document).ready(function(){ 
    $(".tile").hoverIntent(function() { 
    $(".tile_img", this).animate({"opacity": "0.25"}, 600, function() { 
     $(this).next(".overlay").animate({"opacity": "1"}, 500); 
    }); 
    }, function() { 
    var self = this; 
    var inter = setInterval(function(){ 
     if(!$(".overlay", self).is(':animated') && !$(".overlay", self).prev(".tile_img").is(':animated')){ 
     clearInterval(inter); 
     $(".overlay", self).animate({"opacity": "0"}, 500, function() { 
      $(this).prev(".tile_img").animate({"opacity": "1"}, 600); 
     }); 
     } 
    },100); 
    }); 
}); 
+0

我认为一个解决方案可能涉及'setInterval',但不确定如何实现。我放弃了你的代码建议,它似乎打破了鼠标事件,即动画在中途停住了一半,即使当鼠标离开了平铺时... – 2012-01-15 12:53:25

+0

对不起!我在代码中犯了一个错误。当你做.overlay动画时,你指的是这个,但我忘记了这将在setInterval的范围内。通过分配一个变量,比如self,并赋予它这个值,你可以在setInterval中使用它。代码在我的电脑上运行:) – jonepatr 2012-01-15 17:46:19

+0

感谢您的快速回复...尝试了新代码,但仍然遇到问题,如果在鼠标悬停动画结束之前鼠标离开了tile,则“overlay”div不会褪色('.tile_img'不过)...任何你可以摆脱这一点的灯将非常感激! :) – 2012-01-15 18:48:43

1

通过使用stop方法停止动画并传递对应于clearQueuejumpToEmd的2个参数(false,true)来尝试此操作。

$(document).ready(function(){ 
$(".tile").hoverIntent(function() { 

$(".tile_img", this).stop(false, true).animate({"opacity": "0.25"}, 600, 
function() { $(this).next(".overlay").animate({"opacity": "1"}, 500); } 
    ); 
}, 
function() { 
$(".overlay", this).stop(false, true).animate({"opacity": "0"}, 500, 
function() { $(this).prev(".tile_img").animate({"opacity": "1"}, 600); } 
    ); 
}); 
}); 
+0

我试过这个,因为它似乎很符合逻辑,但不幸的是没有做任何改变行为。不管怎么说,还是要谢谢你! :) – 2012-01-15 12:11:05

0

我能看到的主要问题是解决问题运行动画后半部分的回调意味着,如果您试图实现和.stop()功能,则只有在动画完成后才能运行。这是我相信是什么导致问题,我下面有什么似乎工作;虽然它仍然有一些粗糙的边缘问题已经消失。

我甩掉了hoverIntent的用法,因为我没有看到它的必要性,如果我错过了这一点,我很抱歉。我也发现悬停有点不可靠,所以我更喜欢不同的状态。我还将动画换成了fadeTo函数(做同样的事,但读起来有点整齐),并抛出了一些出列(),虽然这大部分都是习惯性的。有些人可能会认为这是毫无意义的,但在某些时候,对我来说,这是一种很好的做法。

$(".tile").mouseenter(function() { 

    $(".overlay", this).stop(false,true) 
    $(".tile_img", this).dequeue().fadeTo(600, 0.25,function(){ 

     $(this).parent().find(".overlay").dequeue().fadeTo(500,1); 

    }) 

}); 

$(".tile").mouseleave(function(){ 

    $(".tile_img", this).stop(false,true) 
    $(".overlay", this).dequeue().fadeTo(500,0,function() { 

     $(this).parent().find(".tile_img").dequeue().fadeTo(500,1); 

    }); 
}); 
+0

谢谢队友! :)这确实工作得很好......确实如此,唯一的障碍是'mouseleave'函数本质上会激发一个新的动画,所以可能会出现一些抖动...... – 2012-01-16 19:50:02