Приостановите Flexslider, когда открыто наложение
-
09-12-2019 - |
Вопрос
В настоящее время мы работаем над проектом, в котором используется плагин Flexslider (недавно приобретенный Woo Themes).У нас есть несколько всплывающих окон на этой странице, и мы хотим, чтобы ползунок приостанавливался, когда всплывающие окна активны, и возобновлялся, когда всплывающие окна закрываются.Пауза работает только при первом запуске, а возобновление работы ползунка не работает.Ниже приведен код, который мы используем для слайдера.Я попробовал отключить функцию "start" со всеми доступными вызовами, кроме вызова "end".
$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
и сохранение идентификатора интервала во внутренней переменной состояния (slider.animatedSlides
). - Flexslider приостанавливается при наведении курсора мыши на слайд.Он делает это, очищая интервал анимации с помощью
clearInterval()
. - Вы нажимаете на кнопку
roi
ссылка на слайде, которая снова приостанавливается, удаляя то, что теперь является несуществующим интервалом. - На странице есть наложение, что означает, что вы выполняете
mouseleave
на Flexslider, поэтому он снова запускает анимацию с помощьюsetInterval()
и сохраняет идентификатор интервала. - Вы закрываете оверлей, нажав кнопку закрыть или оверлей, в этот момент вы вызываете
resume()
, который также выполняетsetInterval()
, перезаписывая сохраненный идентификатор интервала.Так, теперь у вас есть две анимации, отсюда и двойная скорость. Плюс, в следующий раз, когда ты позвонишьpause()
, у него есть доступ только для очистки последнего установленного вами интервала, поскольку он перезаписал сохраненный идентификатор.Таким образом, вы больше не можете очистить интервал с шага 3.Итак, вы будете переходить от анимации с одним интервалом (медленной), когда выmouseenter
и два, когда тыmouseleave
(быстро).
Вместо того чтобы делать паузу при щелчке, вы могли бы сделать паузу при #ovrly
наведите курсор мыши и возобновите работу по щелчку, потому что mouseexit 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/
Похоже, что вам, возможно, не понадобится второй взлом, хотя это лучший код.
Другие советы
@jeff b, спасибо за исправление JS.Поскольку это не работает с филиалом 2.x Flexslider, я думаю, что это только для 1.x
Для тех, кто на 2.x, исправление было отправлено nvartolomei: https://github.com/wothemes/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 непрозрачность: 0