覆盖打开时暂停Flexslider
我们目前正在开发一个利用Flexslider插件的项目(最近被Woo Themes收购)。 我们在此页面上有多个弹出窗口,我们希望滑块在弹出窗口处于活动状态时暂停,并在弹出窗口关闭时恢复。 暂停只能在第一轮进行,并且恢复滑块不起作用。 下面是我们用于滑块的代码。 我尝试使用除“结束”调用之外的所有可用调用切换“启动”function。
$瓦特( '#滑块帧')。flexslider({ 动画:'淡出', directionNav:false, slideshowSpeed:4000, controlNav:是的, pauseOnHover:true, manualControls:'#indicator-dots li', start:function(slider){ $ W( '投资回报率,点击')。点击(函数(){ slider.trigger( '的mouseenter'); }); $ w('div#ovrly,a#close')。click(function(){ slider.trigger( '鼠标离开'); }); } });
该页面的链接是http://www.whitehardt.com/sandbox/whitehardt-v3 。
任何有关这方面的帮助将不胜感激。
编辑
我想我弄清楚这里发生了什么。 问题是你发生了相互矛盾的事件。
- Flexslider通过执行
setInterval
并将间隔ID存储在内部状态变量(slider.animatedSlides
)中来启动动画。 - 当您将鼠标hover在幻灯片上时,Flexslider会暂停。 它通过使用
clearInterval()
清除动画间隔来完成此操作。 - 单击幻灯片中的
roi
链接,再次暂停,通过清除现在不存在的间隔。 - 页面上有一个叠加层,这意味着您在Flexslider上执行鼠标移动,因此它使用
setInterval()
再次启动动画并存储间隔ID。 - 通过单击关闭按钮或覆盖关闭覆盖,此时您调用
resume()
,它也执行setInterval()
,覆盖存储的间隔ID。 所以, 现在你有两个动画 ,因此双倍速度。 另外,下次调用pause()
,它只能访问清除您设置的最后一个间隔,因为它覆盖了存储的ID。 因此,您无法再清除步骤3中的间隔。因此,您将在一个间隔动画前进(慢),mouseenter
和两个mouseleave
(快速)之间进行。
您可以暂停#ovrly
鼠标hover,然后单击继续,而不是暂停点击,因为Flexslider的mouseexit将在重叠鼠标hover之前。
$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:
parameter函数中重载这些函数。
此更改将解决快速速度和无法再次暂停的事实。 当您的叠加层弹出时,您仍然会遇到滑块恢复的问题。 这可以通过我之前提到的mouseover
解决方案来解决。
这是一个显示mouseover
解决方案的小提琴: http : //jsfiddle.net/jtbowden/TWN5t/
虽然它是更好的代码,但看起来你可能不需要第二次黑客攻击。
@Jeff B,感谢JS修复。 由于它不适用于Flexslider的2.x分支,我认为它只适用于1.x.
对于那些2.x上的人,nvartolomei提交了一个修复程序: https : //github.com/woothemes/FlexSlider/pull/322
我在使用brightcove + flexslider时遇到了同样的问题。 这是我的解决方法:
之前
pausePlay: true, pauseText :"Pause", playText :"Play"
然后
video.addEventListener(BCMediaEvent.PLAY, function () { $('.flex-pauseplay .flex-pause').trigger('click'); }); video.addEventListener(BCMediaEvent.STOP, function () { $('.flex-pauseplay .flex-play').trigger('click'); });
.flex-pauseplay .flex-play css opacity:0