Анимация при прокрутке страницы с библиотекой AOS.js

JavaScript
46279 просмотров
1 комментарий

Клиенты обожают просить «сделайте, чтобы красиво выезжало при скролле». Реализовать анимацию при прокрутке страницы вручную через Intersection Observer и CSS-переходы — задача решаемая, но требующая времени и, как правило, нескольких часов отладки кросс-браузерных нюансов. AOS (Animate On Scroll) предлагает элегантный путь: подключите библиотеку, добавьте атрибут data-aos к нужным элементам — и они плавно оживают при прокрутке. Сверх одного вызова AOS.init() писать ничего не нужно.

AOS.js — анимация при прокрутке страницы

В статье разбираем актуальную версию библиотеки — от базового подключения и всех типов анимаций до тонкой настройки, JavaScript-событий и API.

В этой статье:
1

Подключение

AOS.js распространяется через CDN и пакетные менеджеры. Выберите вариант, удобный для вашего проекта.

CDN — быстрый старт

Подключите CSS в <head> и JS перед закрывающим </body> . После загрузки скрипта вызовите AOS.init() . Это всё — библиотека готова к работе:

<!-- В <head> -->
<link rel="stylesheet"
    href="https://unpkg.com/aos@next/dist/aos.css" />

<!-- Перед </body> -->
<script src="https://unpkg.com/aos@next/dist/aos.js"></script>
<script>AOS.init();</script>

Yarn / npm

Для проектов с Webpack, Vite или Rollup установите пакет и импортируйте в точке входа:

npm install --save aos@next
# или
yarn add aos@next
import AOS from 'aos';
import 'aos/dist/aos.css';

AOS.init();
2

Первая анимация

После инициализации добавьте к HTML-элементу атрибут data-aos с названием анимации — и анимация при прокрутке страницы заработает сама. AOS скроет элемент до появления в поле зрения и запустит переход в нужный момент. Ни строчки дополнительного JavaScript:

<div data-aos="fade-up">Появлюсь снизу</div>
<div data-aos="zoom-in">Появлюсь с увеличением</div>
<div data-aos="flip-left">Перевернусь при появлении</div>

Прокрутите страницу вниз и убедитесь сами — блоки ниже анимированы через AOS.js:

data-aos="fade-up"
data-aos="zoom-in"
data-aos="flip-left"
3

Типы анимаций

AOS предлагает четыре группы эффектов для анимации при скролле. Все примеры ниже интерактивны — прокрутите страницу, чтобы запустить их. Если хочется посмотреть повторно — прокрутите вверх и снова вниз: анимации воспроизводятся при каждом появлении элемента в поле зрения.

Fade — плавное появление

Самая универсальная группа. Элемент плавно проявляется из прозрачности — опционально со смещением из одного из восьми направлений. Подходит для большинства блоков на странице:

data-aos="fade"
data-aos="fade-up"
data-aos="fade-down"
data-aos="fade-right"
data-aos="fade-left"
data-aos="fade-up-right"
data-aos="fade-up-left"
data-aos="fade-down-right"
data-aos="fade-down-left"

Flip — переворот

Элемент переворачивается в одном из четырёх направлений. Хорошо смотрится для карточек и блоков с иконками. Главное — не злоупотреблять: один перевернувшийся элемент выглядит эффектно, двадцать — как аттракцион на ярмарке:

data-aos="flip-up"
data-aos="flip-down"
data-aos="flip-left"
data-aos="flip-right"

Slide — сдвиг

В отличие от fade, элемент полностью выдвигается из-за края области видимости. Хорошо работает для боковых блоков, горизонтальных списков и баннеров:

data-aos="slide-up"
data-aos="slide-down"
data-aos="slide-left"
data-aos="slide-right"

Zoom — масштабирование

Элемент появляется из уменьшенного состояния ( zoom-in ) или сжимается из увеличенного ( zoom-out ). Каждый вариант поддерживает направление — итого 10 комбинаций:

data-aos="zoom-in"
data-aos="zoom-in-up"
data-aos="zoom-in-down"
data-aos="zoom-in-left"
data-aos="zoom-in-right"
data-aos="zoom-out"
data-aos="zoom-out-up"
data-aos="zoom-out-down"
data-aos="zoom-out-left"
data-aos="zoom-out-right"
4

Настройка элементов

Каждый элемент можно настроить индивидуально через data-aos-* атрибуты — прямо в разметке, без дополнительного JavaScript.

Длительность — data-aos-duration

Время анимации в миллисекундах. Допустимые значения — от 50 до 3000 с шагом 50. По умолчанию — 400 мс. Слишком долго — пользователь заскучает. Слишком быстро — не заметит. Обычно 600–900 мс дают наилучший результат:

<div data-aos="fade-up" data-aos-duration="400">400 мс — по умолчанию</div>
<div data-aos="fade-up" data-aos-duration="800">800 мс</div>
<div data-aos="fade-up" data-aos-duration="1600">1600 мс — медленно</div>
data-aos-duration="400"
data-aos-duration="800"
data-aos-duration="1600"

Задержка — data-aos-delay

Пауза перед стартом анимации (0–3000 мс). По умолчанию — 0 . Особенно полезно при анимировании группы однотипных элементов: небольшие задержки создают каскадный эффект появления и делают контент «живым»:

<div data-aos="fade-up" data-aos-delay="0">Карточка 1</div>
<div data-aos="fade-up" data-aos-delay="150">Карточка 2</div>
<div data-aos="fade-up" data-aos-delay="300">Карточка 3</div>
data-aos-delay="0"
data-aos-delay="150"
data-aos-delay="300"

Функция плавности — data-aos-easing

Аналог CSS animation-timing-function . AOS поддерживает стандартные CSS-значения и расширенный набор кривых:

  • Стандартные: linear , ease , ease-in , ease-out , ease-in-out
  • С пружинным эффектом: ease-in-back , ease-out-back , ease-in-out-back
  • Синусоидальные: ease-in-sine , ease-out-sine , ease-in-out-sine
  • Квадратичные / кубические / степенные: ease-in-quad , ease-out-cubic , ease-in-out-quart и другие
<div data-aos="fade-up" data-aos-easing="ease-out-back">ease-out-back</div>
<div data-aos="fade-up" data-aos-easing="ease-in-out-cubic">ease-in-out-cubic</div>
<div data-aos="fade-up" data-aos-easing="linear">linear</div>
ease-out-back
ease-in-out-cubic
linear

Смещение триггера — data-aos-offset

По умолчанию анимация запускается, когда верхний край элемента достигает нижнего края экрана плюс 120px отступ. Атрибут data-aos-offset изменяет этот отступ: положительное значение задерживает старт, отрицательное — запускает раньше:

<!-- Запустить раньше обычного — элемент ещё в нижней части экрана -->
<div data-aos="fade-up" data-aos-offset="0">...</div>

<!-- Запустить значительно позже — элемент почти у центра экрана -->
<div data-aos="fade-up" data-aos-offset="300">...</div>

Один раз или при каждом скролле — data-aos-once

По умолчанию анимация воспроизводится каждый раз при появлении элемента в поле зрения. Атрибут data-aos-once="true" ограничивает анимацию одним воспроизведением:

<!-- Анимировать только при первом появлении -->
<div data-aos="fade-up" data-aos-once="true">...</div>

<!-- Повторять при каждом скролле (поведение по умолчанию) -->
<div data-aos="fade-up" data-aos-once="false">...</div>

Совет: для большинства контентных сайтов лучше задать once: true глобально. Пользователь уже видел анимацию — незачем воспроизводить её при каждой прокрутке вверх.

Анимация при уходе — data-aos-mirror

Появившийся в актуальной версии параметр. При data-aos-mirror="true" элемент анимируется не только при появлении, но и при исчезновении с экрана при прокрутке вверх — уходит в обратной анимации. По умолчанию — false :

<div data-aos="fade-up" data-aos-mirror="true">
    Плавно появляюсь при скролле вниз и ухожу при скролле вверх
</div>

Позиция триггера — data-aos-anchor-placement

По умолчанию анимация запускается, когда верхний край элемента достигает нижнего края экрана ( top-bottom ). data-aos-anchor-placement меняет эту точку. Значение — комбинация из двух частей: позиция на элементе + позиция на экране:

  • Позиции на элементе: top , center , bottom
  • Позиции на экране: top , center , bottom
<!-- Центр элемента достигает центра экрана -->
<div data-aos="fade-up" data-aos-anchor-placement="center-center">...</div>

<!-- Низ элемента достигает центра экрана -->
<div data-aos="fade-up" data-aos-anchor-placement="bottom-center">...</div>

<!-- Верх элемента достигает верха экрана -->
<div data-aos="fade-up" data-aos-anchor-placement="top-top">...</div>

Внешний триггер — data-aos-anchor

Иногда нужно запустить анимацию элемента в зависимости от позиции другого элемента. data-aos-anchor принимает CSS-селектор и использует позицию указанного элемента как триггер вместо собственной позиции:

<div id="trigger">Прокрутите до меня</div>

<!-- Анимируется, когда #trigger появится на экране, а не этот элемент -->
<div data-aos="fade-up" data-aos-anchor="#trigger">...</div>
5

Глобальные настройки

Вместо дублирования атрибутов на каждом элементе задайте умолчания при инициализации. Атрибуты на конкретных элементах всегда имеют приоритет над глобальными настройками:

AOS.init({
    // Анимировать только один раз при первом появлении
    once: false,

    // Длительность анимации по умолчанию (мс)
    duration: 400,

    // Задержка перед стартом (мс)
    delay: 0,

    // Функция плавности
    easing: 'ease',

    // Отступ от нижнего края экрана для запуска анимации (px)
    offset: 120,

    // Анимировать при уходе с экрана (прокрутка вверх)
    mirror: false,

    // Позиция триггера по умолчанию
    anchorPlacement: 'top-bottom',

    // Задержка debounce при resize окна (мс)
    debounceDelay: 50,

    // Задержка throttle при скролле (мс)
    throttleDelay: 99,
});

Отключение на мобильных устройствах

На медленных устройствах или при узких экранах анимации могут работать некорректно или мешать пользователю. AOS поддерживает удобное отключение по типу устройства или своему условию:

// Отключить на телефонах и планшетах
AOS.init({ disable: 'mobile' });

// Отключить только на телефонах
AOS.init({ disable: 'phone' });

// Отключить только на планшетах
AOS.init({ disable: 'tablet' });

// Своё условие: отключить при ширине экрана менее 768px
AOS.init({
    disable: function () {
        return window.innerWidth < 768;
    }
});
6

API и JavaScript-события

Методы API

AOS предоставляет три метода для управления библиотекой программно. Пригодятся при динамическом контенте, SPA и сложных взаимодействиях:

// Инициализация — вызывается один раз после загрузки DOM
AOS.init();

// Пересчитать позиции всех элементов с data-aos
// Вызывается автоматически при resize окна, но можно и вручную —
// например, после изменения layout или добавления новых блоков
AOS.refresh();

// Полный сброс: заново найти все data-aos элементы и пересчитать позиции
// Нужен когда элементы с data-aos добавились или удалились из DOM после init()
AOS.refreshHard();

AOS.refreshHard() — особенно полезен в SPA-приложениях и при контенте, подгружаемом через AJAX. Если добавлять элементы с data-aos динамически и не вызывать refreshHard() — они никогда не заанимируются (библиотека просто о них не знает).

События на элементах

AOS генерирует DOM-события при анимации элементов. Это позволяет реагировать на появление и исчезновение конкретных блоков — запускать видео, загружать данные, менять состояние интерфейса:

// Срабатывает при появлении любого AOS-элемента
document.addEventListener('aos:in', ({ detail }) => {
    console.log('Элемент появился:', detail);
});

// Срабатывает при исчезновении любого AOS-элемента
document.addEventListener('aos:out', ({ detail }) => {
    console.log('Элемент ушёл:', detail);
});

Для точечного отслеживания добавьте к элементу атрибут data-aos-id с уникальным идентификатором. AOS сгенерирует события специально для этого элемента:

<!-- Разметка -->
<div data-aos="fade-up" data-aos-id="hero">...</div>

<!-- JavaScript -->
document.addEventListener('aos:in:hero', ({ detail }) => {
    // Блок hero появился на экране — запустить видео, анимацию счётчиков и т.д.
    console.log('hero появился!', detail);
});

document.addEventListener('aos:out:hero', ({ detail }) => {
    console.log('hero ушёл!', detail);
});

AOS — удачный баланс между простотой и гибкостью. Один атрибут в разметке даёт работающую анимацию, а полный набор параметров позволяет добиться точного поведения для любого сценария. Главное помнить: анимация должна помогать пользователю воспринимать контент, а не превращать страницу в новогоднюю ёлку.

Если хочется пойти дальше и добавить глубину при скролле — загляните в подборку 10 потрясающих примеров параллакс скроллинга.

Вам может быть интересно:
Swiper.js — слайдер для сайта: настройки и примеры
Swiper.js — как подключить и настроить слайдер на сайте
Что такое функция в программировании — типы и примеры на JavaScript и Python
Что такое функция в программировании?
Promise в JavaScript — промисы JS простыми словами для начинающих
Promise в JavaScript простыми словами — полное руководство
Анимация частиц и GLSL-шейдеры в PixiJS 8 — живой пример в браузере
Изучаем PixiJS. Часть 2 — продвинутая анимация и GLSL-шейдеры
Комментарии 1 Разные мнения приветствуются. Здесь можно спорить и обсуждать, но уважительно и без токсичности.
Отмена
Артур Томилко
22 мая 2026 17:53
Спасибо! Пригодилось