Как резко остановить линейный анимированный ползунок 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
}


Вы можете посмотреть живой пример полного игрока здесь:



Http://lookr.com/1239271528





Это работает в Chrome и Safari, но может ли кто-нибудь сказать мне, как заставить это работать в Firefox и Internet Explorer?





Обновление



Может быть реальный вопрос здесь должен быть: как остановить CSS анимацию наверняка во всех браузерах сразу?

572   3  

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

    Ничего не найдено.