题
我们目前正在研究一个利用Flexslider插件(最近被Woo Themes收购)的项目。我们在此页面上有多个弹出窗口,我们希望滑块在弹出窗口处于活动状态时暂停,并在弹出窗口关闭时恢复。暂停只工作的第一个去轮和恢复滑块不起作用。下面是我们用于滑块的代码。我已经尝试用除了"结束"调用之外的所有可用调用切换出"开始"功能。
$w('#slider-frame').flexslider({ animation: 'fade', directionNav: false, slideshowSpeed: 4000, controlNav: true, pauseOnHover: true, manualControls: '#indicator-dots li', start: function(slider){ $w('.roi-click').click(function(){ slider.trigger('mouseenter'); }); $w('div#ovrly, a#close').click(function(){ slider.trigger('mouseleave'); }); } });
该页面的链接是 http://www.whitehardt.com/sandbox/whitehardt-v3.
对此的任何帮助将不胜感激。
解决方案
编辑
我想我知道这里发生了什么。问题是你有冲突的事件发生。
- Flexslider通过执行以下操作来启动动画
setInterval
并将间隔ID存储在内部状态变量(slider.animatedSlides
). - 当您将鼠标悬停在幻灯片上时,Flexslider会暂停。它通过清除动画间隔来实现这一点
clearInterval()
. - 你按
roi
链接在幻灯片中,它再次暂停,通过清除现在是一个不存在的间隔。 - 页面上有一个复盖,这意味着你做了一个
mouseleave
在Flexslider上,所以它再次启动动画setInterval()
并存储间隔ID。 - 您可以通过单击关闭按钮或叠加来关闭叠加,此时您调用
resume()
, ,这也做了一个setInterval()
, ,复盖存储的间隔ID。所以, 现在你有两个动画去, ,因此双速。 加, 下次你打电话pause()
, ,它只能访问清除您设置的最后一个间隔,因为它复盖了存储的ID。因此,您无法再从步骤3中清除间隔。所以,你会有一个间隔动画之间去(慢),当你mouseenter
两个当你mouseleave
(快)。
你可以暂停点击,而不是暂停点击 #ovrly
mouseover,并在单击时恢复,因为Flexslider的mouseexit将在overlay的mouseover之前。
$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/
它看起来好像你可能不需要第二个黑客,尽管它是更好的代码。
其他提示
@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-plus css透明度:0