Технически при загрузке страницы указанному элементу назначаются 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 внутри тега до основного css-файла
Расставляем необходимые классы из Animate.css
Предположим, хотим задать анимацию, для блока
Смотрим на сайте https://animate.style/ какая анимация нам подходит и нажимаем на иконку копирования рядом с именем анимации
Предположим выбрали эффект анимации bounceIn — копируем класс этого эффекта animate__bounceIn и добавляем этот класс блоку, который хотим анимировать
Пока что мы добавили блоку только класс эффекта, поэтому пока сама анимация работать не будет. За саму анимацию отвечает класс animate__animated , он будет добавлятся автоматически при прокрутке страницы с помощью wow.js
Скачиваем и подключаем wow.js
Ищем файл wow.min.js и нажимаем на него
Ищем кнопку Raw — нажимаем
Сохраняем исходный файл wow.min.js в папку с js-файлами
Подключаем файл wow.min.js перед закрывающим тегом
до основного js-файла
Инициализация wow.js
Теперь, чтобы анимация срабатывала при прокрутке страницы, блоку, который мы хотим анимировать, добавляем класс wow
Далее в файле 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 и подключаем в до основного css-файла
Скачиваем wow.min.js и подключаем перед закрывающим тегом до основного 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»
Lorem ipsum dolor.
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.
Lorem ipsum dolor.
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.
Lorem ipsum dolor.
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.
Когда страница прокрутится до этих элементов, то у первого блока анимация начнется сразу, у второго через 0.2 секунды, у третьего через 0.4 секунды
Как запускать CSS-анимацию при прокрутке страницы
В этом пошаговом руководстве будет рассмотрено создание CSS-анимации с нуля и её включение при скролле (прокрутке вверх-вниз) страницы, когда HTML-элемент находится в поле зрения – видимой части окна, с помощью Intersection Observer API.
Настройка CSS-анимации с помощью ключевых кадров
Начнем с создания CSS-анимации, которая определяется ключевыми кадрами @keyframes .
Анимацию можно назвать как угодно, пусть будет wipe-enter . Здесь HTML-элемент будет увеличиваться в ширину, а затем в высоту.
После того, как определены ключевые кадры, можно использовать анимацию для элемента, установив свойству animation-name название ключевых кадров: wipe-enter . Кроме этого необходимо установить animation-duration – продолжительность анимации и animation-iteration-count – счетчик итераций, указывающий, сколько раз анимация должна воспроизводиться, например – бесконечно.
CSS-класс .square пусть будет заключён в медиа-запрос prefers-reduce-motion: no-preference . Это обеспечит запуск анимации только в том случае, если пользователь не ограничил её и не включил параметр «уменьшить движение» в своей операционной системе.
В этом примере будет анимирован HTML-элемент квадратной формы:
Для CSS-анимации можно использовать сокращённое написание свойства animation , например:
Допустим, не нужно, чтобы анимация воспроизводилась сразу. Воспроизведением анимации можно управлять, добавляя HTML-элементу CSS-класс переключатель только анимации, который не используется для остальной стилизации элемента.
CSS-анимация будет воспроизводиться, когда HTML-элементу будет добавлен CSS-класс .square-animation :
В этом примере CSS-анимация воспроизводится не каждый раз при нажатии на кнопку, а только тогда, когда HTML-элементу будет добавлен CSS-класс .square-animation .
Несмотря на то, что анимация должна показывать появление элемента, элемент отображается и до добавления класса .square-animation . Это сделано для того, чтобы при первой загрузке элемент был виден пользователю, даже если JavaScript заблокирован или не работает.
Добавление CSS-класса, когда элемент появляется при скролле (прокрутке страницы вверх-вниз)
В примере выше была реализована CSS-анимация, которая запускается при добавлении HTML-элементу CSS-класса. Вместо перехвата события нажатия кнопки, для добавления и удаления CSS-класса можно использовать несколько вариантов обнаружения состояния, когда элемент при скролле появляется в видимой части окна.
Вот три способа определить, когда элемент находится в видимой области окна:
Использовать Intersection Observer API
Измерять смещение элемента при скролле страницы
Использовать стороннюю JavaScript-библиотеку, которая реализует №1 или №2
Для базовой анимации с запуском при скролле, оптимально использование Intersection Observer API, потому что он требует меньше кода, удобнее и лучше с точки зрения производительности.
API-интерфейс Intersection Observer позволяет отслеживать момент пересечения одного элемента с другим, и сообщает, когда это происходит. Этот способ идеально подходит для запуска CSS-анимации при скролле страницы. Всё, что нужно знать – когда HTML-элемент пересекается с окном просмотра. Если он пересекается, значит – находится в видимой области окна и в этот момент надо запустить CSS-анимацию.
Intersection Observer API можно рассматривать, как обычный слушатель событий, но с некоторыми дополнительными опциями. Вместо того, чтобы прикреплять прослушивание событий к HTML-элементу, надо заставить наблюдателя отслеживать элемент и его положение на странице.
Начнём с создания наблюдателя и заставим его отслеживать HTML-элемент:
// Создать наблюдателя const observer = new IntersectionObserver(entries => < // Заполним метод обратного вызова позже. >); // Сообщить наблюдателю, какие элементы следует отслеживать observer.observe(document.querySelector('.square'));
По умолчанию корневым элементом, который будет проверяться на пересечение, является окно браузера, поэтому наблюдателю нужно только сообщить об анимируемом HTML-элементе.
Когда функция обратного вызова (callback) запускается, она возвращает массив записей из целевых (target) элементов, которые были запрошены, а также некоторую дополнительную информацию о них. В функцию всегда будет возвращаться массив, даже если наблюдение ведётся только за одним элементом, как здесь.
В функции обратного вызова можно перебрать массив записей, чтобы указать, что с ними нужно сделать. Каждая запись имеет свойство isIntersecting , которое может быть true или false . Если оно возвращает true , это означает, что элемент находится в видимой области окна (viewport).
entries.forEach(entry => < if (entry.isIntersecting) < // Элемент появился, // надо добавить CSS-класс для анимации >>);
Собираем всё вместе. Обратите внимание, что entry – это объект, предоставленный наблюдателем, а entry.target – это фактический элемент, за которым который ведется наблюдение, поэтому именно ему нужно добавить CSS-класс для запуска анимации.
const observer = new IntersectionObserver(entries => < // перебор записей entries.forEach(entry => < // если элемент появился if (entry.isIntersecting) < // добавить ему CSS-класс entry.target.classList.add('square-animation'); >>); >); observer.observe(document.querySelector('.square'));
Теперь, когда HTML-элемент пересекает границы окна браузера, ему будет добавлен CSS-класс, который будет воспроизводить анимацию.
Если нужно, чтобы анимация запускалась каждый раз, когда HTML-элемент входит в видимую область окна, необходимо удалять CSS-класс запуска анимации, когда он находится за пределами видимой области окна.
Если элемент при анимации изменяет размер или положение, браузеру может быть сложно решить, находится ли элемент в данный момент в области просмотра или нет. Лучше всего поместить анимируемый элемент в контейнер, который не изменяет размер или положение и использовать его для наблюдения за скролллом.
Теперь надо наблюдать за HTML-элементом c CSS-классом square-wrapper а класс для анимации применять к элементу с классом square , как и прежде. Когда элемент-оболочка находится за пределами видимой области, нужно удалять CSS-класс у элемента .square , чтобы анимация перезапускалась каждый раз, когда элемент появляется в окне при скролле.
const observer = new IntersectionObserver(entries => < entries.forEach(entry => < const square = entry.target.querySelector('.square'); if (entry.isIntersecting) < square.classList.add('square-animation'); return; // если класс добавлен, продолжать уже не надо >// перемещение завершено, теперь надо удалить класс square.classList.remove('square-animation'); >); >); observer.observe(document.querySelector('.square-wrapper'));
Чтобы элемент-оболочку было видно, для примера, ему добавлена пунктирная рамка. Попробуйте прокрутить вверх и вниз документ в окне ниже:
Теперь – порядок! Добавляя и удаляя CSS-класс каждый раз, когда при скролле страницы HTML-элемент входит в область просмотра, запускается CSS-анимация.
Запуск CSS-transition при скролле
Если для анимации используется только один шаг и не требуется применение @keyframes , например, достаточно изменения прозрачности HTML-элемента от 0 до 1, можно использовать CSS-transition вместо CSS-animation.
Метод по сути тот же. Вместо определения ключевых кадров ( @keyframes ) для CSS-класса анимации указаны свойства для transition .
Заставим HTML-элемент появляться, когда он перемещается в видимую область просмотра. Для этого в момент появления в окне при скролле ему надо добавить CSS-класс square-transition . Так пользователь, у которого заблокирован или не загружается JavaScript, должен всё-равно увидеть HTML-элемент в его окончательном состоянии.
Это особенно важно, поскольку анимация начинается с opacity: 0 . Если бы не было настройки CSS-класса square-transition и JavaScript не работал, пользователь вообще не увидел бы HTML-элемент! Но если эффект перехода заключается в том, чтобы что-то исчезло, наверное, это не понадобится делать.
При первом запуске JavaScript нужно удалить CSS-класс, чтобы затем, его можно было добавить обратно, когда действительно нужно запустить transition . Это должно быть сделано вне метода обработки наблюдения за скроллом, желательно в начале JavaScript. Вот полный код:
// Удалить CSS-класс square-transition const square = document.querySelector('.square'); square.classList.remove('square-transition'); // Добавить наблюдение за появлением элемента const observer = new IntersectionObserver(entries => < entries.forEach(entry => < if (entry.isIntersecting) < square.classList.add('square-transition'); return; >square.classList.remove('square-transition'); >); >); observer.observe(document.querySelector('.square-wrapper'));
В этом примере CSS-transition запускается, когда элемент-оболочка при скролле появляется в окне. Если Javascript не запустился, элемент всё-равно будет виден.
Как видите, эту технику можно расширять разными способами, чтобы создать множество эффектов анимации.
Простая анимация при прокрутке страницы
В последнее время стало популярным делать не просто красивые сайта, а еще и чтобы в них была анимация во время прокрутки страницы вниз. По мере того, как пользователь спускается ниже, элементы на странице появляются не сразу, а чуть позже и с каким-нибудь эффектом. Особенно такие эффекты при прокрутке очень популярны на так называемых лэндинг-страницах (одностраничных сайтах).
Анимация при прокрутке без jQuery
Сделать простую анимацию на странице с помощью animate.css и wow.js очень быстро и просто.
animate.css — css-библиотека, содержащая классы, которые позволяют выполнять анимацию элементов. Скачать библиотеку можно с официального сайта, или можно подключить библиотеку через CDN:
wow.js — javascript-библиотека, позволяющая запускать анимацию при прокрутке страницы. Скачать можно на GitHub, или можно подключить библиотеку через CDN:
Для работы анимации и скрипта wow.js библиотека jQuery не требуется.
Как сделать анимацию на странице при прокрутке
С помощью указанных выше библиотек анимация делается очень легко и быстро:
1. Подключаем css библиотеку animate.sss
2. Подключаем и активируем wow.js
3. Добавляем классы к элементам для анимации
Пример простой анимации при прокрутке страницы
bounceInUp — название css-класса для анимации элемента из библиотеки animate.css, который вы заменяете на тот, который вам необходим.
Изначально html-элементы с классом «wow» скрыты, в когда пользователь прокручивает страницу до элемента, он появляется на странице с анимацией. Если элемент уже сразу при загрузке попадает в видимую область страницы, тогда анимация запустится сразу же.
Настройки wow.js
Библиотека анимации при прокрутке имеет несколько опций, которые добавляются к тегу в виде data-атрибутов.
data-wow-duration — продолжительность анимации
data-wow-delay — задержка перед началом анимации
data-wow-offset — расстояние в пикселах от нижнего края окна браузера до элемента, при достижении которого начнется анимация
data-wow-iteration — повторять анимацию несколько раз
Анимация начнется через 5 сек и будет длиться 2 сек
Так же можно указать несколько опций при активации wow.js
boxClass — имя класса, которое делает элементы невидимыми и показывает их при прокрутке страницы пользователем (по умолчанию «wow»).
animateClass — имя класса, запускающего анимацию элемента (для библиотеки animates.css это имя класса «animated»)
offset — расстояние в пикселах от нижнего края окна браузера до элемента, при достижении которого начнется анимация (аналогично data-wow-offset, но для всех анимируемых элементов).
mobile — отключает анимацию для смартфонов
live — постоянно проверять появление новых элементов для анимации на странице
callback — функция, которая будет запускаться при старте анимации. При этом в функцию передается ссылка на объект, который анимируется.
scrollContainer — селектор прокручивающегося контейнера (по умолчанию «window»)
wow = new WOW(< mobile: false, // не запускать анимацию на смартфонах live: true // всё время проверять появление новых wow-элементов >); wow.init();
Пример анимации при прокрутке страницы
Приведу более полный пример, показывающий возможности wow.js и animate.css