Scrollissimo – плагин для плавной скролл-анимации

    Scrollissimo


    В последнее время все большую популярность набирают анимации, проигрываемые по мере прокрутки страницы. Однако, я заметил, что подавляющее большинство браузеров не создано для таких анимаций. Прокрутка страниц мышью в них происходит не плавно (как в Firefox), а ступенчато. В результате скролл-анимации на страницах проигрываются тоже рывками. По моему мнению, проблема здесь совсем не в браузерах, а в плагинах, которые используются для создания этих анимаций. Потому что именно они допускают резкие скачки. Я считаю, что для любой анимации должна быть какая-то максимальная скорость воспроизведения, при которой анимация будет плавной, а пользователь сможет понять, что же произошло на странице. Если вы со мной согласны, то плавно и без рывков перемещайтесь под кат.

    В этой статье речь пойдет о плагине для создания анимаций, контролируемых скроллом, который я назвал Scrollissimo. Ближайшим его аналогом является плагин ScrollMagic. Из общих черт у них – их предназначение и то, что в качестве движка анимации выбран Greensock. Если вы с ним еще по какой-то причине не знакомы, то, возможно, для полного понимания всего происходящего вам следует почитать статьи про Greensock, которые уже выходили на Хабре. Например эту.

    Помимо общих черт у этих плагинов есть и различия. Но особенно выделить хотелось бы главное – плавная анимация. Дабы это не прозвучало голословно вот вам пруф. Главная страница ScrollMagic также подтверждает мои слова.

    Как им пользоваться?


    Подключаем

    Для того, чтобы начать использовать Scrollissimo необходимо сделать две вещи. Во-первых, подключить Greensock. Можно подключить только минимально необходимые библиотеки (TweenLite, TimelineLite и CSS):

    <script src="http://cdnjs.cloudflare.com/ajax/libs/gsap/latest/TweenLite.min.js"></script>
    <script src="http://cdnjs.cloudflare.com/ajax/libs/gsap/latest/TimelineLite.min.js"></script>
    <script src="http://cdnjs.cloudflare.com/ajax/libs/gsap/latest/plugins/CSSPlugin.min.js"></script>
    

    либо, подключить одну библиотеку, содержащую все вышеперечисленные:

    <script src="http://cdnjs.cloudflare.com/ajax/libs/gsap/latest/TweenMax.min.js"></script>
    

    А во-вторых, подключаем сам Scrollissimo. Библиотека доступна из репозитория. А для пользователей bower также есть возможность установки командой

    bower install scrollissimo
    

    Скачали, теперь подключаем:

    <script src="scrollissimo/dist/scrollissimo.min.js"></script>
    

    По желанию можно (но необязательно) подключить jQuery для собственного удобства. Далее в статье я буду писать код с его использованием для пущей удобочитаемости.

    Я предусмотрел возможность срабатывания Scrollissimo не только на скроллинг всей страницы, но и на любое другое событие, однако в подавляющем большинстве ситуаций вам надо подписываться на событие прокрутки страницы:

    $(window).scroll(function(){
        Scrollissimo.knock();
    });
    

    Теперь при каждом наступлении события scroll Scrollissimo будет вычислять текущий прогресс анимаций и воспроизводить ее.

    NOTE: Если вам не нужно, чтобы плагин сам считал прокрутку страницы, то вы можете передать свое значение свойства scrollTop в метод knock().Так к примеру, Scrollissimo.knock(1000) скажет плагину о том, что вы промотали страницу на 1000 пикселей.

    NOTE: Для поддержки тачевых устройств есть touch-адаптер scrollissimo.touch.js, который борется с «заморозкой» страницы во время прокрутки.

    Всё, теперь можно непосредственно анимировать! Scrollissimo умеет анимировать твины (одиночные анимации) и таймлайны (очередь одиночных анимаций). Начнем с твинов.

    Простейшая анимация

    Пусть у нас есть красивый красный div по имени Divy. Ему очень хочется вырасти, но пока он всего 50 пикселей в ширину и высоту.

    <div id="Divy"></div>
    

    #Divy{
        position: fixed;
        top: 0;
        left: 0;
        
        height: 50px;
        width: 50px;
        
        background: red;
    }
    

    Давайте сделаем так, чтобы уже через 1000 пикселей от начала страницы он стал 300 пикселей в ширину. Для этого сначала создадим соответствующий твин, как если бы мы делали обычную анимацию с помощью Greensock:

    var divyTween = new TweenLite($('#Divy'), 1000, { width: 300 });
    

    NOTE: Как вы заметили, единственное отличие от стандартной анимации на Greensock состоит в том, что продолжительность анимации мы указываем не в секундах, а в пикселях (в нашем случае 1000).

    Отлично! Осталось только отдать этот твин на съедение Scrollissimo:

    Scrollissimo.add(divyTween, 0, 6);
    

    Сейчас давайте притормозим и разберем эту строчку. Первый аргумент – это тот самый твин, который мы создали. Второй аргумент – с какой позиции начинать анимацию. В нашем случае это начало страницы (0 пикселей). Остался третий аргумент. Тут мы и подбираемся к главной особенности, отличающей Scrollissimo от обычных плагинов. Третий аргумент – это максимальная скорость воспроизведения анимации. Измеряется эта скорость в абстрактных безразмерных единицах и подбирается «на глаз». Сразу отвечу на вопрос «А что будет, если не указать третий параметр?» Если вы не укажете максимальную скорость, то ее и не будет. Эта анимация будет воспроизводиться также, как воспроизводилась бы обычными плагинами.

    Ну вот, наш первый пример готов! Если не делали его вместе со мной, то можете посмотреть пример на jsFiddle.

    Таймлайны

    Итак, Divy вырос в ширину. А как нам помочь ему вырасти и в высоту? Здесь нам помогут цепочки анимаций или, выражаясь в терминах Greensock, таймлайны. Если вы использовали их раньше для построения анимаций, то для вас тут нет ничего нового. Точно также, как выше мы поступили с твином мы поступаем с таймлайном. jsFiddle

    var divyTimeline = new TimelineLite();
    divyTimeline.to($('#Divy'),1000 { width: 300 });
    divyTimeline.to($('#Divy'), 1000, { height: 300 });
    
    Scrollissimo.add(divyTimeline, 0, 6);
    


    Заключение


    Это все, что необходимо для успешного создания скролл-анимаций с помощью Scrollissimo. На этом, пожалуй, и закончу статью. В заключение скажу, что плагин находится в стадии активного развития, ему есть куда расти и в чем улучшаться. Поэтому я буду рад любым вопросам, советам и фичреквестам.

    Репозиторий: https://github.com/Promo/scrollissimo

    Страница плагина
    Greensock

    Верстайте, анимируйте!
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 15
    • 0
      Ещё один плагин (немного популярней), тоже на Greensock — SuperScrollorama
      • +3
        ScrollMagic – форк SuperScrollorama. И его разработчики агитируют переходить на scrollMagic.
        Superscrollorama has been replaced by ScrollMagic
        • 0
          Ого, этого не знал. Спасибо!
      • +2
        там опечатка в scrollissimo.touch.js?

        doc.body.addEventListener('touchendt', function(){
                        if(Math.abs(lastScrollTime - (lastScrollTime = +new Date)) < 100){
                            var interval = (lastScrollTime - startTime);
        
                            velocity = distance / interval * 100;
        
                            win._rAF(scrollStep);
                        }
                        distance = 0;
                        startTime = 0;
                    });
        


        >touchendt

        github.com/Promo/scrollissimo/blob/master/lib/scrollissimo.touch.js#L49
        • 0
          Да, конечно, исправил. Спасибо.
        • 0
          Chrome 43.0.2357.81 m — нет плавности в пруфе, не для Scrollissimo, не для Defaults plugins
          • +1
            А если резко прокрутить?
            • +2
              Все верно, если резко прокручивать — то у Scrollissimo анимация плавная. Спасибо!
            • 0
              vz2oo5 прав, может вы не резко скроллите? Специально сейчас проверил Chrome 43. Плавность есть.
            • +4
              Оставьте скролл в покое!
              • +1
                Вы немного не по адресу, это вам к дизайнерам\проектировщикам нужно обратиться. Решение наоборот «старается» сделать нелюбимый многим параллакс поприятней.
              • –1
                Первым делом я отключаю SmoothScroll в браузере…
                • +1
                  Scrollissimo не сглаживает ваш браузерный скролл. Плавным становится не скролл страницы, а сама анимация.
                • +1
                  Страница плагина не показывает ничего с отключенным яваскриптом.
                  Было бы неплохо, с учетом, что это демо-страница, показать, как это можно сделать.
                  • 0
                    Возможно вы правы. Спасибо за мысль. Подумаю об этом :)

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.