Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Плавный горизонтальный скролл (https://javascript.ru/forum/jquery/59698-plavnyjj-gorizontalnyjj-skroll.html)

Siend 23.11.2015 11:45

Плавный горизонтальный скролл
 
Ребят, пытаюсь сделать плавную горизонтальную прокрутку зависящую от положения курсора. Но анимация у меня вышла подтормаживающая, а я точно видел подобные штуки передвигающиеся плавно и красиво. Подскажите кто знает, как сделать правильнее/красивее. Вот мой способ:
{
    var lastX = 0; //последняя координата x мыши
    var SliderScroll= false; //требуется ли анимация?


    $(document).mousemove(function(e) {
        lastX = e.clientX; //обновили горизонтальное положение курсора
    });

//как только курсор оказывается в элементе news-slider начинаем анимацию прокрутки
    $(".news-slider").mouseenter(function(e) {
        SliderScroll= true;
        NewsSliderScroll();//запуск самой анимации
    });

    $(".news-slider").mouseleave(function(e) {
        SliderScroll= false;//сбрасываем для выхода из рекурсии
    });


    function NewsSliderScroll() {
        setTimeout(function() {
            var speed = (0.5 - ($(window).width() - lastX) / $(window).width()).toFixed(2);//не суть важно, нужно для расчета шага прокрутки
            var step = $(".news-slider").scrollLeft() + 200 * speed;//шаг прокрутки
            $(".news-slider").stop().animate({ scrollLeft: step }, 100); // останавливаем предыдущую анимацию и сразу же запускаем следующую. на скрол шага 100 милисекунд
            if (SliderScroll) NewsSliderScroll();//рекурсивно вызываем саму себя
        },100);//все это дело запускаем с отсрочкой в 100 мс, требующиеся на анимацию. 
    }
}


Само собой в момент .stop() и запуска новой анимации элемент слегка "дергается". Попытка уменьшить таймер запуска между анимациями от "лагов" не избавил( Подскажите,кто знает, как сделать анимацию плавной?

Siend 23.11.2015 11:56

Вопрос решился вот таким вот корректированием:

setTimeout(function() {
            var speed = (0.5 - ($(window).width() - lastX) / $(window).width()).toFixed(2);
            var step = $(".news-slider").scrollLeft() + 200 * speed;
            $(".news-slider").scrollLeft(step);
            if (SliderScroll) NewsSliderScroll();
        }, 20);

рони 23.11.2015 13:06

Цитата:

Сообщение от Siend
Подскажите кто знает, как сделать правильнее/красивее

https://learn.javascript.ru/js-animation тут всё что вам нужно знать


Часовой пояс GMT +3, время: 15:18.