已编辑
我想我知道这里发生了什么。问题是您正在发生相互冲突的事件。
- Flexslider 通过执行
setInterval
间隔 ID 并将其存储在内部状态变量 ( slider.animatedSlides
) 中来启动动画。
- 当您将鼠标悬停在幻灯片上时,Flexslider 会暂停。它通过清除动画间隔来做到这一点
clearInterval()
。
roi
通过清除现在不存在的间隔,您单击幻灯片中的链接,该链接再次暂停。
- 该页面上有一个覆盖,这意味着您
mouseleave
在 Flexslider 上执行了一个,因此它再次启动动画setInterval()
并存储间隔 ID。
- 您可以通过单击关闭按钮或覆盖来关闭覆盖,此时您调用
resume()
,它也会执行setInterval()
,覆盖存储的间隔 ID。所以,现在你有两个动画,因此速度加倍。 另外,下次您调用时pause()
,它只能清除您设置的最后一个时间间隔,因为它会覆盖存储的 ID。因此,您无法再从第 3 步清除间隔。因此,您将在一个间隔动画(慢)mouseenter
和两个mouseleave
(快)之间切换。
您可以在鼠标悬停时暂停,而不是在单击时暂停#ovrly
,然后在单击时恢复,因为 Flexslider 的鼠标退出将在覆盖层的鼠标悬停之前。
$w('#slider-frame').flexslider({
animation: 'fade',
directionNav: false,
slideshowSpeed: 4000,
controlNav: true,
pauseOnHover: true,
manualControls: '#indicator-dots li',
start: function(slider){
$w('div#ovrly').mouseover(function(){
slider.pause();
});
$w('div#ovrly, a#close').click(function() {
slider.resume();
});
}
});
但是,您可能会遇到类似的问题,具体取决于关闭叠加层时鼠标是否在滑块上......但我不确定。理想情况下,如果一个新动画已经开始,Flexslider 不会开始一个新动画。您可以将其破解到 flexslider.js 中:
//FlexSlider: Automatic Slideshow Pause
slider.pause = function() {
// Only pause if running
if(slider.animatedSlides == null) {
return;
}
clearInterval(slider.animatedSlides);
// Clear the interval ID
slider.animatedSlides = null;
if (slider.vars.pausePlay) {
slider.pausePlay.removeClass('pause').addClass('play').text(slider.vars.playText);
}
}
//FlexSlider: Automatic Slideshow Start/Resume
slider.resume = function() {
// Only resume if paused
if(slider.animatedSlides != null) {
return;
}
slider.animatedSlides = setInterval(slider.animateSlides, slider.vars.slideshowSpeed);
if (slider.vars.pausePlay) {
slider.pausePlay.removeClass('play').addClass('pause').text(slider.vars.pauseText);
}
}
您可以在start:
参数函数中重载这些函数。
此更改将解决速度快和您不能再次暂停的事实。当您的叠加层弹出时,您仍然会遇到滑块恢复的问题。这可以通过mouseover
我之前提到的解决方案来解决。
这是一个显示mouseover
解决方案的小提琴:http: //jsfiddle.net/jtbowden/TWN5t/
看起来你可能不需要第二次破解,尽管它是更好的代码。