Анимация при прокрутке страницы
Анимируем элементы при прокрутке страницы
Пример на Codepen
Как это работает
При прокрутке страницы, когда элемент появляется в видимой области окна браузера (за это отвечает wow.js), элементу добавляется анимация из библиотеки Animate.css
Технически при загрузке страницы указанному элементу назначаются inline-стили style="visibility: hidden; animation-name: none;"
, то есть элемент скрыт и не имеет имени анимации, а после того, как элемент появляется в видимой области окна браузера, элементу добавляется специальный класс animate__animated
, который запускает анимацию и inline-стили меняются на style="visibility: visible; animation-name: fadeInUp;"
, где fadeInUp
- имя анимации из animate.min.css
Что нужно для анимации при прокрутке
- Animate.css - css-библиотека с анимациями
- wow.js - плагин для запуска анимации
Скачиваем и подключаем Animate.css
Чтобы скачать css-файл с анимациями, переходим на Github https://github.com/animate-css/animate.css
Ищем файл animate.min.css
и нажимаем на него
Ищем кнопку Raw - нажимаем
Сохраняем исходный файл animate.min.css
в папку с css-файлами
Подключаем файл animate.min.css
внутри тега <head>
до основного css-файла
Расставляем необходимые классы из Animate.css
Предположим, хотим задать анимацию, для блока <div class="scroll__image">
<div class="scroll__image">
<img src="https://picsum.photos/1920/1080" alt=""/>
</div>
Смотрим на сайте https://animate.style/ какая анимация нам подходит и нажимаем на иконку копирования рядом с именем анимации
Предположим выбрали эффект анимации bounceIn - копируем класс этого эффекта animate__bounceIn
и добавляем этот класс блоку, который хотим анимировать
<div class="scroll__image animate__bounceIn">
<img src="https://picsum.photos/1920/1080" alt=""/>
</div>
Пока что мы добавили блоку только класс эффекта, поэтому пока сама анимация работать не будет. За саму анимацию отвечает класс animate__animated
, он будет добавлятся автоматически при прокрутке страницы с помощью wow.js
Скачиваем и подключаем wow.js
Переходим также на Github - https://github.com/graingert/WOW/tree/master/dist
Ищем файл wow.min.js
и нажимаем на него
Ищем кнопку Raw - нажимаем
Сохраняем исходный файл wow.min.js
в папку с js-файлами
Подключаем файл wow.min.js
перед закрывающим тегом </body>
до основного js-файла
Инициализация wow.js
Теперь, чтобы анимация срабатывала при прокрутке страницы, блоку, который мы хотим анимировать, добавляем класс wow
<div class="scroll__image wow animate__bounceIn">
<img src="https://picsum.photos/1920/1080" alt=""/>
</div>
Далее в файле main.js инициализируем wow.js
const wow = new WOW({
boxClass: 'wow', /* класс, который необходим для работы wow.js */
animateClass: 'animate__animated', /* класс, который будет автоматически добавляться анимируемым элементам при прокрутке страницы */
offset: 30, /* по-умолчанию установлено значение 0, то есть как только при прокрутке страницы, элемент достигает низа окна браузера проигрываться анимация, в данном случае анимация начнется на 30px выше от низа окна браузера */
mobile: true, /* если true, то на мобильных тоже будет анимация, если false, то на мобильных анимация отключается */
live: true /* если true, то анимация будет работать даже на динамически добавляемых элементах, если false, то только на тех элементах, которые были на странице при ее загрузке */
})
wow.init(); /* Инициализация плагина с установленными выше свойствами */
Еще раз, кратко, порядок действий
- Скачиваем animate.min.css и подключаем в
<head>
до основного css-файла - Скачиваем wow.min.js и подключаем перед закрывающим тегом
</body>
до основного js-файла - Блокам, которые будем анимировать добавляем класс
wow
и класс с эффектом, напримерanimate__bounceIn
- В основном js-файле устанавливаем свойства и инициализируем плагин wow.js
Дополнительные возможности wow.js
Для более тонкой настройки анимации каждого отдельного блока есть дополнительные data-атрибуты
data-wow-duration
- продолжительность анимации (использую, если нужно сделать продолжительность анимации быстрее или медленней)
data-wow-delay
- задержка перед началом анимации (использую, если несколько блоков в ряд и необходимо чтобы они появлялись не все сразу, а по очереди друг за другом)
data-wow-offset
- расстояние в пикселях от низа окна браузера, на котором начнется анимация элемента(обычно не использую)
data-wow-iteration
- количество повторений анимации (обычно не использую)
Можно использовать несколько data-атрибутов одновременно
Использовать очень просто, например, необходимо чтобы элементы расположеные в ряд появлялись не все сразу, а по очереди друг за другом - добавляем первому блоку data-wow-delay="0s"
, второму data-wow-delay=".2s"
, третьему data-wow-delay=".4s"
<div class="scroll__cards">
<div class="scroll__card scroll-card wow animate__fadeInLeft" data-wow-delay="0s">
<div class="scroll-card__title">Lorem ipsum dolor.</div>
<div class="scroll-card__text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Est cumque enim ex laborum voluptatibus, nulla expedita facilis impedit ab possimus doloribus atque obcaecati voluptatem rem, maxime non suscipit. Aspernatur, similique.</div>
</div>
<div class="scroll__card scroll-card wow animate__fadeInLeft" data-wow-delay=".2s">
<div class="scroll-card__title">Lorem ipsum dolor.</div>
<div class="scroll-card__text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Est cumque enim ex laborum voluptatibus, nulla expedita facilis impedit ab possimus doloribus atque obcaecati voluptatem rem, maxime non suscipit. Aspernatur, similique.</div>
</div>
<div class="scroll__card scroll-card wow animate__fadeInLeft" data-wow-delay=".4s">
<div class="scroll-card__title">Lorem ipsum dolor.</div>
<div class="scroll-card__text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Est cumque enim ex laborum voluptatibus, nulla expedita facilis impedit ab possimus doloribus atque obcaecati voluptatem rem, maxime non suscipit. Aspernatur, similique.</div>
</div>
</div>
Когда страница прокрутится до этих элементов, то у первого блока анимация начнется сразу, у второго через 0.2 секунды, у третьего через 0.4 секунды
Изображения - https://picsum.photos/