Небольшое руководство: анимации прокрутки с использованием fullPage.js и Animate.css
() translation by (you can also view the original English article)
В предыдущем руководстве я рассказал вам про fullPage.js, популярный плагин для jQuery по созданию полноэкранных страниц. В этом руководстве я покажу вам, как создать анимацию при скролле, используя fullPage.js и animate.css.
Нужные библиотеки
Для нашего урока я создал демо страницу. Если взгляните в меню Settings, вы увидите, какие библиотеки я включил:



Bootstrap не обязателен; я его включил только из-за преимуществ его стилей.
Процесс
На нашей странице будет четыре секции; каждая на весь размер viewport (благодаря fullPage). Пользователь будет перемещаться между секциями скроллом, либо же точками с правой стороны экрана. На каждый такой скролл мы настроим анимации, такие, например, как появление изображения.



Перед тем, как приступить к коду, который запустит анимации, сперва разберемся с основными шагами:
- Получим преимущество обратных функций, которые есть у fullPage. Именно в нашем случае мы хотим анимировать вторую, третью и четвертую секции, так что мы воспользуемся обратной функцией
onLeave
. Если нам нужно анимировать и первую секцию, то можно использовать обратную функциюafterLoad
. Также для анимации слайдов можно использовать функцииafterSlideLoad
иonSlideLeave
. - Добавим динамичных анимаций из библиотеки
animate.css
, используя jQuery. - Также заанимируем элементы последовательно, используя свойство CSS
animate-delay
.
Теперь займемся анимациями!
Анимация #1
Вторая секция страницы включает три изображения и одну кнопку. Вот структура:
1 |
<section class="section second"> |
2 |
<div class="container"> |
3 |
<div class="row"> |
4 |
<div class="col-sm-4 is-animated"> |
5 |
<img class="img-responsive" src="https://placeimg.com/300/350/nature"> |
6 |
</div>
|
7 |
<div class="col-sm-4 is-animated"> |
8 |
<img class="img-responsive" src="https://placeimg.com/300/350/people"> |
9 |
</div>
|
10 |
<div class="col-sm-4 is-animated"> |
11 |
<img class="img-responsive" src="https://placeimg.com/300/350/tech"> |
12 |
</div>
|
13 |
<div class="col-xs-12 text-center is-animated__single"> |
14 |
<button type="button" class="btn btn-lg">A Simple Button</button> |
15 |
</div>
|
16 |
</div><!--end of row--> |
17 |
</div><!--end of container--> |
18 |
</section>
|
Заметьте, что мы добавили классы is-animated
и is-animated__single
элементам, которые мы хотим анимировать. Также не забываем, что элементы с is-animated
получат одинаковый эффект анимации (например, fadeInUpBig
)
Код jQuery, который запускает анимации для секций выглядит так:
1 |
var $isAnimatedSecond = $('.second .is-animated'), |
2 |
$isAnimatedSecondSingle = $('.second .is-animated__single'); |
3 |
|
4 |
/* this code is part of the onLeave callback */
|
5 |
if( index == 1 && nextIndex == 2 ) { |
6 |
$isAnimatedSecond.addClass('animated fadeInUpBig'); |
7 |
$isAnimatedSecond.eq(0).css('animation-delay', '.3s'); |
8 |
$isAnimatedSecond.eq(1).css('animation-delay', '.6s'); |
9 |
$isAnimatedSecond.eq(2).css('animation-delay', '.9s'); |
10 |
$isAnimatedSecondSingle.addClass('animated rollIn').css('animation-delay', '1.7s'); |
11 |
}
|
В этом примере, когда исчезает первая секция и появляется вторая, мы применяем две разные анимации (например, fadeInUpBig
и rollIn
) к нужным элементам. Дополнительно используем свойство CSS animation-delay
, чтобы задать, когда эти анимации будут стартовать.
Анимация #2
Третья секция содержит два изображения и одну кнопку. Ниже вы можете посмотреть на соответствующий HTML код.
1 |
<section class="section third"> |
2 |
<div class="container"> |
3 |
<div class="row"> |
4 |
<div class="col-sm-3 col-sm-offset-3 is-animated"> |
5 |
<img class="img-responsive" src="https://placeimg.com/300/350/tech"> |
6 |
</div>
|
7 |
<div class="col-sm-3 is-animated"> |
8 |
<img class="img-responsive" src="https://placeimg.com/300/350/any"> |
9 |
</div>
|
10 |
<div class="col-xs-12 text-center is-animated__single"> |
11 |
<button type="button" class="btn btn-lg">A Simple Button</button> |
12 |
</div>
|
13 |
</div><!--end of row--> |
14 |
</div><!--end of container--> |
15 |
</section>
|
Как и с предыдущим примером, добавляем is-animated
и is-animated__single
к нужным элементам.
Код jQuery выглядит следующим образом:
1 |
var $isAnimatedThird = $('.third .is-animated'), |
2 |
$isAnimatedThirdSingle = $('.third .is-animated__single'); |
3 |
|
4 |
/* this code is part of the onLeave callback */
|
5 |
if( ( index == 1 || index == 2) && nextIndex == 3 ) { |
6 |
$isAnimatedThird.eq(0).addClass('animated fadeInRightBig').css('animation-delay', '.3s'); |
7 |
$isAnimatedThird.eq(1).addClass('animated fadeInLeftBig').css('animation-delay', '.6s'); |
8 |
$isAnimatedThirdSingle.addClass('animated bounceInDown').css('animation-delay', '1.2s'); |
9 |
}
|
В этой секции используем анимации fadeInRightBig
и fadeInLeftBig
для последовательного показа изображений. Затем покажем кнопки, используя анимацию bounceInDown
.
Анимация #3
Четвертая секция состоит из трех элементов: два абзаца и одна кнопка. Структура:
1 |
<section class="section fourth"> |
2 |
<div class="container"> |
3 |
<div class="row"> |
4 |
<div class="col-xs-12 is-animated"> |
5 |
<p>Some text here</p> |
6 |
</div>
|
7 |
<div class="col-xs-12 is-animated"> |
8 |
<p>Some text here</p> |
9 |
</div>
|
10 |
<div class="col-xs-12 text-center is-animated__single"> |
11 |
<button type="button" class="btn btn-lg">Thank You!</button> |
12 |
</div>
|
13 |
</div><!--end of row--> |
14 |
</div><!--end of container--> |
15 |
</section>
|
Вновь, is-animated
и is-animated__single
нужным элементам.
Затем соответствующий код jQuery:
1 |
var $isAnimatedFourth = $('.fourth .is-animated'), |
2 |
$isAnimatedFourthSingle = $('.fourth .is-animated__single'); |
3 |
|
4 |
/* this code is part of the onLeave callback */
|
5 |
if( ( index == 1 || index == 2 || index == 3 ) && nextIndex == 4 ) { |
6 |
$isAnimatedFourth.addClass('animated zoomIn').css('animation-delay', '.6s'); |
7 |
$isAnimatedFourthSingle.addClass('animated lightSpeedIn').css('animation-delay', '1.2s') |
8 |
$isAnimatedFourthSingle.one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function() { |
9 |
$(this).removeClass('lightSpeedIn').addClass('zoomOutDown'); |
10 |
});
|
11 |
}
|
Здесь оба абзаца появятся одновременно с использованием анимации zoomIn
. А кнопка появится с использованием анимации lightSpeedIn
.
Более того, следующий код поможет нам определять, когда анимация закончится:
1 |
$('#yourElement').one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', doSomething); |
В нашем примере мы покажем кнопку всего на несколько секунд, а затем воспользуемся вышеупомянутым кодом, чтобы ее спрятать.
Ниже вы можете взглянуть на прикрепленное демо с CodePen (но через full page demo куда эффективней):
Заключение
В этом кратком руководстве мы узнали, как можно совместить fullpage.js и animate.css, чтобы создать анимации на основе скролла.
Если вы хотите улучшить это демо, вот что вы можете попробовать сделать:
- Включить анимации только для широких экранов. Для этого используйте
matchMedia
метод. - Сделайте код внутри
onLeave
более легкодоступным к повторному использованию.