В последнее время все большую популярность набирают анимации, проигрываемые по мере прокрутки страницы. Однако, я заметил, что подавляющее большинство браузеров не создано для таких анимаций. Прокрутка страниц мышью в них происходит не плавно (как в 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)
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
rednaxi
09.06.2015 08:48+1Страница плагина не показывает ничего с отключенным яваскриптом.
Было бы неплохо, с учетом, что это демо-страница, показать, как это можно сделать.
Toy
Ещё один плагин (немного популярней), тоже на Greensock — SuperScrollorama
f0rmat1k
ScrollMagic – форк SuperScrollorama. И его разработчики агитируют переходить на scrollMagic.
Toy
Ого, этого не знал. Спасибо!