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)


  1. Toy
    08.06.2015 15:27

    Ещё один плагин (немного популярней), тоже на Greensock — SuperScrollorama


    1. f0rmat1k
      08.06.2015 15:31
      +3

      ScrollMagic – форк SuperScrollorama. И его разработчики агитируют переходить на scrollMagic.

      Superscrollorama has been replaced by ScrollMagic


      1. Toy
        08.06.2015 15:33

        Ого, этого не знал. Спасибо!


  1. vz2oo5
    08.06.2015 15:59
    +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


    1. qdinov Автор
      08.06.2015 16:02

      Да, конечно, исправил. Спасибо.


  1. nomn
    08.06.2015 16:33

    Chrome 43.0.2357.81 m — нет плавности в пруфе, не для Scrollissimo, не для Defaults plugins


    1. vz2oo5
      08.06.2015 16:37
      +1

      А если резко прокрутить?


      1. nomn
        08.06.2015 16:46
        +2

        Все верно, если резко прокручивать — то у Scrollissimo анимация плавная. Спасибо!


    1. qdinov Автор
      08.06.2015 16:41

      vz2oo5 прав, может вы не резко скроллите? Специально сейчас проверил Chrome 43. Плавность есть.


  1. ScorpAL
    08.06.2015 16:36
    +4

    Оставьте скролл в покое!


    1. f0rmat1k
      08.06.2015 16:47
      +1

      Вы немного не по адресу, это вам к дизайнерам\проектировщикам нужно обратиться. Решение наоборот «старается» сделать нелюбимый многим параллакс поприятней.


  1. bertmsk
    08.06.2015 17:05
    -1

    Первым делом я отключаю SmoothScroll в браузере…


    1. qdinov Автор
      08.06.2015 17:08
      +1

      Scrollissimo не сглаживает ваш браузерный скролл. Плавным становится не скролл страницы, а сама анимация.


  1. rednaxi
    09.06.2015 08:48
    +1

    Страница плагина не показывает ничего с отключенным яваскриптом.
    Было бы неплохо, с учетом, что это демо-страница, показать, как это можно сделать.


    1. qdinov Автор
      09.06.2015 09:14

      Возможно вы правы. Спасибо за мысль. Подумаю об этом :)