Как резко остановить линейный анимированный ползунок jQueryUI handle (crossbrowser)
Мы используем слайдер jQuery для нашего слайд-шоу. Теперь ручка анимируется во время воспроизведения. Но если пользователь делает паузу, ручка должна быть немедленно установлена в неподвижное положение (т. е. анимация должна быть остановлена).
Сначала я подумал, что будет проще всего использовать опцию animate (http://api.jqueryui.com/slider/#option-animate ) из слайдера. Но я не нашел способа создатьлинейную анимацию.
Таким образом, мы решили эта проблема теперь с помощью CSS-переходов. Если ползунок воспроизводится, в дескриптор добавляется класс CSS-перехода. Если ползунок приостановлен, класс CSS удаляется, и ручка ползунка немедленно переходит в нужное положение.
Это прекрасно работает с Chrome и Safari, но, к сожалению, не с Firefox или InternetExplorer. Они не останавливают дескриптор сразу, но запускают анимацию до конца, что сбивает с толку, потому что дескриптор не реагирует сразу на пользователя действие.
Текущий код JavaScript для переключения CSS в ползунке jQuery выглядит следующим образом:
$slider.on('change.mode', function(event, playing){
if(playing)
$(this).addClass('playing');
else
$(this).removeClass('playing');
});
CSS выглядит следующим образом:
.playing .ui-slider-handle {
#x-browser > .transition(1s, linear, left); //LESSCSS Shortcut
}
Вы можете посмотреть живой пример полного игрока здесь:
Это работает в Chrome и Safari, но может ли кто-нибудь сказать мне, как заставить это работать в Firefox и Internet Explorer?
Обновление
Может быть реальный вопрос здесь должен быть: как остановить CSS анимацию наверняка во всех браузерах сразу?
3 ответов:
Это может быть чрезмерным упрощением, но вы можете попробовать что-то вроде этого:
Рабочий Пример
JS
// shows values in the demo var showAmount = function (event, ui) { $("#amount").val(ui.value); $("#amount2").val(parseInt($('.ui-slider-handle').css('left'), 10)); }; $(function () { $("#slider").slider({ animate: 5000, //slowed down to 5s for demo only, for normal timing set to true value: 0, min: 0, max: 500, // make the max value the same as the width slide: showAmount, change: showAmount }); }); // click to trigger animation to 500 $("#play").click(function () { $("#slider").slider("value", 500); }); // click to set the value of the slider to the handles left position $("#stop").click(function () { $("#slider").slider('option', "value", parseInt($('.ui-slider-handle').css('left'), 10)); });CSS
#slider { width: 500px; /* must match the max value of the slider */ }Этот метод отчасти зависит от возможности установить максимальное значение слайдера, чтобы оно соответствовало ширине слайдера. Если это не большая проблема, левое положение ручки ползунка будет соответствовать значению ползунка, и вы можете использовать его в качестве значения остановки.
Протестировано и работает в IE9 / 10, Chrome и Браузер firefox.
Вместо анимации вы можете попробовать сбросить / обновить значение слайдера, прикрепив его к интервалу для eg и очистив интервал по щелчку паузы
var myVar = setInterval(function(){myTimer()},100); var tim=parseInt($('#slider').slider("option", "value")); function myTimer() { jQuery("#slider").slider({value:tim--}); } $("#pause").click(function() { clearInterval(myVar); timer = null });
$slider.on('change.mode', function(event, playing){ if(playing){ $(this).addClass('playing'); $(this).find('.ui-slider-handle').addClass('stop'); //ADDED } else{ $(this).removeClass('playing'); $(this).find('.ui-slider-handle').removeClass('stop'); //ADDED } });
CSS (ДОБАВЛЕНО)
.stop { transition:none !important; }
Comments