«Библиотека анимации» — это не одна категория инструментов, а сразу три, и путаница между ними стоит проектам лишних килобайт. Первая — наборы готовых эффектов: подключил файл, повесил класс, элемент прыгнул. Вторая — генераторы, которые вообще не становятся зависимостью: сервис отдаёт готовые @keyframes, они уезжают в твой собственный CSS. Третья — движки, которые считают анимацию в рантайме и дают то, чего у CSS нет: таймлайны, синхронизацию десятка элементов, перемотку, реверс, реакцию на перетаскивание.

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

Ниже десять инструментов, которые стоит держать в закладках, дальше — три библиотеки, которые попадают в такие подборки по недоразумению, раздел про то, что уже пора выкинуть из проекта, и раздел про случаи, когда библиотека не нужна вообще: половину сценариев из старых списков браузер теперь закрывает сам. В конце — голосовалка, любопытно, что в итоге прижилось у тебя.

Как выбирать, чтобы потом не выпиливать

Три вопроса, которые экономят день работы:

  • Сколько это весит после gzip? Минифицированный размер обманывает: CSS-наборы жмутся в десять раз, JS — втрое. Ниже указаны оба числа.
  • Библиотека жива? Для CSS-наборов почти не важно: @keyframes не «портятся» от простоя. Для JS-движков критично: браузеры меняются, а фиксить некому.
  • Что будет у человека с включённым «уменьшить движение»? Часть библиотек глушит анимации сама, часть — нет, и тогда это твоя работа.

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

Animate.css

Сайт animate.style: сетка эффектов Animate.css с превью анимаций по наведению

Самый популярный набор в подборке — больше восьмидесяти двух тысяч звёзд, и по факту отраслевой стандарт для «просто оживить элемент». Внутри несколько десятков готовых @keyframes: появления, затухания, тряски, подпрыгивания, вылеты за границы экрана. Всё подключается двумя классами: базовым и именем эффекта.

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/animate.css@4/animate.min.css">

<div class="notice animate__animated animate__fadeInDown">
  Заявка отправлена
</div>

Скорость и задержку не надо переопределять через !important — в четвёртой версии всё крутится CSS-переменными, локально на элементе или глобально на :root:

.notice {
  --animate-duration: 0.45s;
  --animate-delay: 0.1s;
  --animate-repeat: 2;
}

Приятная деталь, которой нет у большинства соседей по списку: библиотека сама уважает системную настройку «уменьшить движение» — при prefers-reduced-motion: reduce и при печати длительность схлопывается до одной миллисекунды. Весит вся сборка 70 КБ, но после gzip — всего 5 КБ, а на сайте есть конструктор кастомной сборки: собрать три нужных эффекта вместо всех.

Что стоит знать: последний релиз — 4.1.1, репозиторий трогали весной 2024-го. Для набора готовых кейфреймов это не проблема, ломаться в нём нечему.

Magic CSS

Демо-страница Magic CSS с кнопками выбора эффекта и превью анимации

Тот же принцип — класс на элемент — но эффекты заметно наглее: перспектива, развороты в трёхмерном пространстве, схлопывание в точку, эффект «дыма». Если Animate.css — про аккуратные появления в интерфейсе, то Magic — про переходы между экранами и акценты, которые нельзя не заметить. Базовый класс тут magictime, к нему добавляется имя эффекта.

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/magic.css/dist/magic.min.css">

<div class="card magictime puffIn">Готово</div>

Библиотека маленькая: 33 КБ, после gzip — 2,4 КБ, и это самый дешёвый способ получить эффектный переход. Лицензия MIT, зависимостей нет.

Важный нюанс, про который в описаниях обычно молчат: встроенной поддержки «уменьшить движение» здесь нет. Разворот карточки в трёх измерениях — ровно тот тип движения, от которого человеку с вестибулярными нарушениями становится физически плохо, так что защиту дописываем руками — это три строки:

@media (prefers-reduced-motion: reduce) {
  .magictime { animation: none; }
}

Последний коммит — июль 2022-го, версия 1.4.8. Как и в случае с Animate.css, для чистого CSS без единой строчки скрипта это скорее «заморожено», чем «заброшено».

AnimXYZ

Интерактивный конструктор AnimXYZ: набор утилит слева и превью составленной анимации

Принципиально другая идея: эффект не выбирается из списка, а собирается из утилит-слов в атрибуте. Не «найди подходящее имя среди пятидесяти», а «опиши, что должно произойти»: появление с затуханием, снизу, крупное — это xyz="fade up big". Комбинации не надо заранее предусматривать, они складываются сами.

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@animxyz/core">

<ul class="xyz-in" xyz="fade up stagger duration-10">
  <li class="xyz-nested">Первый пункт</li>
  <li class="xyz-nested">Второй пункт</li>
  <li class="xyz-nested">Третий пункт</li>
</ul>

Классы xyz-in и xyz-out включают анимацию в нужную сторону, xyz-nested подхватывает её у детей, а утилита stagger сама разносит их по времени — тот самый каскадный выход списка, за которым обычно тянут JS-движок. Под капотом — CSS-переменные вида --xyz-translate-y и --xyz-duration, так что любую утилиту можно переопределить точечно. Исходники на SCSS, есть отдельные пакеты для Vue и React.

Ядро весит 96 КБ, после gzip — 12 КБ: дороже готовых наборов, но это плата за комбинаторику. Лицензия MIT, пакеты обновлялись летом — из трёх CSS-инструментов подборки это самый живой.

Следующие два пункта не становятся зависимостью вообще. Это генераторы: ты забираешь готовый CSS и уходишь, в package.json не появляется ни строчки.

Animista

Интерфейс Animista: список эффектов, превью и панель с готовым CSS-кодом

Витрина эффектов, где по каждому можно покрутить параметры, посмотреть результат и забрать сгенерированный код. Библиотеку никуда подключать не нужно: на выходе — обычный @keyframes с классом, который вставляется в твой собственный файл стилей.

Эффекты разложены по группам: появления и уходы, вращения, тряски, отдельные наборы для текста (посимвольные и построчные) и для фона. Код отдаётся в двух вариантах — читаемом и минифицированном, с вендорными префиксами или без.

Плюс арифметический: подключая набор классов, ты отдаёшь пользователю все эффекты, включая те, которых на сайте нет, а через генератор в бандл уезжают ровно нужные кейфреймы — обычно меньше килобайта. И код твой: переименовать, поправить, не следить за обновлениями. Минус один — ручная работа: для трёх эффектов идеально, для двадцати проще взять готовый набор.

Loading.io

Каталог лоадеров Loading.io: сетка анимированных спиннеров с настройками цвета и скорости

Такой же генератор, но заточенный под одну задачу — индикаторы ожидания. Спиннеры, точки, полоски прогресса, пульсирующие фигуры: выбираешь, настраиваешь цвета, размер и скорость, забираешь результат. Форматов на выходе много: CSS с кейфреймами, SVG, GIF, APNG, PNG-спрайт и Lottie — то есть одну и ту же анимацию можно унести и в вёрстку, и в мобильное приложение, и в презентацию.

Два предупреждения. Часть контента бесплатная, часть премиальная, и лицензии у наборов разные — от CC0 до CC BY с обязательной ссылкой на автора; проверять нужно на странице конкретного лоадера. И второе: простой спиннер — это шесть строк CSS с border-radius и вращением. Сервис оправдан под нетиповой индикатор или когда один лоадер нужен сразу в нескольких форматах.

Дальше — два инструмента под конкретные сценарии: появление при скролле и галерея с лайтбоксом.

AOS (Animate On Scroll)

Демо-страница AOS: блоки, выезжающие снизу по мере прокрутки

Классика жанра «блоки выезжают, пока листаешь». Ставится скриптом, инициализируется одной строкой, дальше всё делается атрибутами прямо в разметке — и это до сих пор один из самых аккуратных API в подборке.

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/aos@2/dist/aos.css">
<script src="https://cdn.jsdelivr.net/npm/aos@2/dist/aos.js"></script>

<section data-aos="fade-up" data-aos-duration="600" data-aos-delay="100">
  Блок появится при прокрутке
</section>

<script>AOS.init({ once: true });</script>

Двадцать восемь тысяч звёзд, 14 КБ скрипта, MIT — и последний коммит в октябре 2018 года. Библиотека так и осталась в статусе 3.0.0-beta.6, седьмой год. Работать она при этом не перестала, но за появление блоков теперь платить скриптом уже не обязательно: у CSS есть анимации, привязанные не ко времени, а к позиции скролла.

.card {
  animation: reveal linear both;
  animation-timeline: view();
  animation-range: entry 20% cover 45%;
}

@keyframes reveal {
  from { opacity: 0; transform: translateY(2rem); }
  to   { opacity: 1; transform: none; }
}

Ни одной строчки JavaScript, анимация считается вне основного потока и честно отматывается назад, если пользователь листает вверх. Есть одно но — и оно решающее при выборе:

Поддержка браузерами
chrome
Chrome
115
firefox
Firefox
 
edge
Edge
115
safari
Safari
26
opera
Opera
101

В Firefox привязки к скроллу нет до сих пор — фича лежит в предварительных сборках. Так что выбор честный: нативный CSS с плавной деградацией (в Firefox блок просто окажется на месте без анимации) или скрипт, который работает всюду одинаково — AOS либо свои двадцать строк на IntersectionObserver.

Ниже - демо анимации карточек, выезжающих при прокрутке на чистом CSS через animation-timeline: view(), с фолбэком для Firefox через @supports

lightGallery

Открытый лайтбокс lightGallery с лентой миниатюр внизу экрана

Единственный пункт списка, который не «библиотека анимаций», а готовый компонент интерфейса: галерея с лайтбоксом. Анимации здесь — часть продукта, а не набор, из которого собираешь своё. Клик по превью открывает картинку на весь экран с зумом, свайпами, стрелками и лентой миниатюр.

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lightgallery@2/css/lightgallery-bundle.min.css">
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2/lightgallery.min.js"></script>

<div id="gallery">
  <a href="/img/kyiv-large.jpg" data-lg-size="1600-2400">
    <img src="/img/kyiv-thumb.jpg" alt="Вид на город с высоты" />
  </a>
</div>

<script>
  lightGallery(document.getElementById('gallery'), { speed: 400 });
</script>

Архитектура плагинная: зум, полный экран, миниатюры, поворот и видео (включая внешние плееры) подключаются отдельными модулями, в бандл попадает только включённое. Есть официальные обёртки для React, Vue и Angular; версия 2.9 вышла осенью, репозиторий активный.

А теперь то, что важнее всех фич и о чём в подборках молчат: лицензия двойная. Для открытых проектов — GPLv3, то есть твой код тоже обязан быть под совместимой лицензией. Для коммерческого сайта, темы на продажу или закрытого приложения нужна платная коммерческая лицензия. Это не «бесплатно с оговорками», а юридическое условие, и узнавать о нём лучше до релиза.

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

GSAP

Главная страница GSAP с демонстрацией анимаций и списком плагинов

Профессиональный движок, на котором сделана большая часть тех сайтов, где хочется спросить «как это вообще устроено». Единица работы — твин: «доведи такие-то свойства до такого-то значения за такое-то время». Твины складываются в таймлайны, таймлайны вкладываются друг в друга, и всё это можно ставить на паузу, отматывать и проигрывать со скоростью 0,5×.

const tl = gsap.timeline({ defaults: { duration: 0.6, ease: 'power2.out' } });

tl.from('.card', { y: 40, opacity: 0, stagger: 0.08 })
  .to('.badge', { scale: 1.2, yoyo: true, repeat: 1 }, '-=0.2')
  .to('.hint', { autoAlpha: 1 });

// таймлайном можно управлять как видео
document.querySelector('.replay')
  .addEventListener('click', () => tl.restart());

Отдельно стоит проговорить то, о чём старые статьи не знают. Раньше половина силы GSAP жила в платных клубных плагинах: разбивка текста по буквам, морфинг SVG-путей, инерционный скролл. После перехода проекта под крыло Webflow с версией 3.13 бесплатным стало всё — включая коммерческое использование и бонусные плагины. SplitText при этом переписали: он стал вдвое компактнее и перестал ломать чтение скринридерами, а при разбивке текста на буквы это была реальная проблема доступности.

Ядро — 71 КБ, после gzip 28 КБ, плагины подключаются по одному. Самый тяжёлый инструмент списка: он окупается на сложной сцене, а не на появлении карточек.

На демо ниже можно увидеть таймлайн из трёх шагов с кнопками play / pause / reverse и ползунком скорости, видно, как последовательность управляется как видео

anime.js

Главная anime.js с интерактивной демонстрацией сетки анимированных элементов

По звёздам на GitHub — больше семидесяти двух тысяч — самый популярный движок подборки, и самый приятный для начала: одна функция, объект с параметрами, работает с DOM, SVG, атрибутами и обычными JS-объектами. Тут нужно быть внимательным, потому что почти все туториалы в сети описывают старую версию: библиотеку переписали с нуля, и вместо единственной функции anime() появился набор именованных модулей.

import { animate, stagger } from 'https://cdn.jsdelivr.net/npm/animejs@4/+esm';

animate('.dot', {
  scale: [1, 1.6, 1],
  rotate: '1turn',
  duration: 900,
  delay: stagger(60),   // каскад по элементам
  loop: true,
});

Кроме animate в четвёртой версии есть createTimeline для последовательностей, createTimer для тактов без анимации, createDraggable для перетаскивания и onScroll для привязки к прокрутке. Работа с SVG и текстом вынесена в отдельные точки входа (animejs/svg, animejs/text) — в бандл попадает только то, что импортировал. Полная сборка на все случаи — 82 КБ и 28 КБ после gzip, но модульность позволяет унести куда меньше.

Лицензия MIT, релизы выходят регулярно. Если код с третьей версии не заводится — дело не в тебе: API поменялся, старые примеры несовместимы.

Motion

Сайт motion.dev с примерами анимаций и переключателем между JavaScript и React

Тот инструмент, которого нет в старых подборках, хотя именно он там нужен: подборки до сих пор советуют физическую библиотеку Popmotion, а её разработка остановилась ещё летом 2022-го. Её автор никуда не пропал — он развивал те же идеи внутри Framer Motion, которая в 2024 году отделилась в самостоятельный проект под именем Motion. Так что если в статье встретился совет «возьми Popmotion для пружин и инерции», читать его нужно как «возьми Motion».

Ключевое отличие от GSAP и anime.js — опора на встроенный в браузер Web Animations API: движок отдаёт анимацию браузеру, а тот считает её вне основного потока, поэтому тяжёлый JavaScript на странице её не дёргает.

import { animate, spring } from 'https://cdn.jsdelivr.net/npm/motion@13/+esm';

animate('.panel',
  { x: 240, rotate: 8 },
  { type: spring, stiffness: 300, damping: 20 }
);

Пакет разложен на части: полная сборка — 137 КБ (45 КБ после gzip), но есть точка входа motion/mini, где функция анимации весит около 2,3 КБ — целиком нативная, без своего цикла отрисовки. Для React — отдельная сборка motion/react с компонентами и хуками. MIT, тридцать три тысячи звёзд, релизы каждые несколько недель.

Заодно стоит понимать, что тот самый Web Animations API доступен и без библиотек — для простой анимации с управлением из кода библиотека не нужна:

Поддержка браузерами
chrome
Chrome
84
firefox
Firefox
75
edge
Edge
84
safari
Safari
13.1
opera
Opera
71

Не про интерфейс: Three.js, p5.js и Phaser

Эти три имени регулярно попадают в подборки библиотек анимации, и это сбивает с толку: они решают другую задачу. anime.js двигает существующие элементы страницы, а здесь ты сначала создаёшь сцену, а потом рисуешь каждый кадр. Анимация тут — следствие рендера, а не отдельная функция. Инструменты отличные, но выбирать между ними и Motion бессмысленно — это разные жанры.

Three.js

Сайт Three.js с интерактивной трёхмерной сценой на WebGL

Стандарт трёхмерной графики в браузере: сто пятнадцать тысяч звёзд, обёртка над WebGL, готовые камеры, свет, материалы, загрузчики моделей. Почти всё, что выглядит как интерактивная 3D-сцена на сайте, сделано на нём. Расплата — вес: одно ядро около 350 КБ минифицированного кода, так что заходит оно через ленивую загрузку, а не в общий бандл. MIT, релизы примерно раз в месяц.

p5.js

Главная p5.js с примерами генеративной графики и творческого кода

Творческий код: генеративная графика, визуализации, учебные наброски. Порог входа самый низкий в разделе — пишешь setup и draw, вторая вызывается шестьдесят раз в секунду. Весной 2025-го вышла вторая мажорная версия с переписанным ядром, часть старого API поменялась — учебники под первую версию местами расходятся с реальностью.

Phaser

Сайт Phaser с демонстрацией движка для двумерных игр

Движок для двумерных игр: физика, коллизии, спрайтовые атласы, тайловые карты, ввод, звук, сцены. Анимация здесь — кадры спрайта и твины внутри игрового цикла. Весной вышла четвёртая мажорная версия с переписанным рендером, так что у чужого туториала стоит сверять версию.

Что уже не стоит подключать

Инструменты, которые продолжают жить в подборках, хотя их время прошло. Ни один из них не «сломался» — просто у каждого есть более живая замена.

  • Velocity.js — когда-то самый быстрый способ ускорить анимацию jQuery. Последний коммит — август 2020-го, а всё, за что её брали, теперь умеет Web Animations API.
  • Popmotion — пружины, инерция, физически правдоподобное движение. Остановилась на версии 11.0.5 в августе 2022-го, новых релизов с тех пор не было. Замена — Motion от того же автора.
  • Mo.js — motion-графика со своими фигурами и всплесками. Живёт еле-еле: последний релиз — осень 2023-го. Те же эффекты собираются на GSAP или anime.js, где сообщество на порядок больше.
  • EaselJS и остальной CreateJS — наследие эпохи Flash, слой удобства над <canvas>. Версия 1.0.0 датирована 2017-м. Под canvas берут p5.js, под игры — Phaser.
  • Micron — микровзаимодействия по клику через атрибут data-micron. Идея хорошая, но последний коммит — май 2018-го, а нажатие кнопки прекрасно анимируется парой строк на :active и transition.
  • Animation Library — альтернатива Animate.css, где эффекты разложены по отдельным файлам. Сто с небольшим звёзд, лицензия GPL-3.0, ни одной настройки длительности или задержки. Тот же результат даёт Animate.css с кастомной сборкой.
  • Skeleton Elements — готовые скелетоны-заглушки на время загрузки. Аккуратная библиотека, но полторы сотни звёзд, последний релиз — осень 2022-го, а эффект — это градиент и одни кейфреймы: писать своё дешевле, чем следить за чужой зависимостью.
/* скелетон целиком: градиент, который едет по блоку */
.skeleton {
  background: linear-gradient(90deg, #e9e9ee 25%, #f6f6f9 50%, #e9e9ee 75%);
  background-size: 220% 100%;
  animation: skeleton-slide 1.2s linear infinite;
}

@keyframes skeleton-slide {
  from { background-position: 220% 0; }
  to   { background-position: -220% 0; }
}

Когда библиотека не нужна вообще

Половина сценариев из старых подборок сегодня закрывается браузером, и проверить это стоит до того, как ставить зависимость: разница между «подключил 28 КБ движка» и «написал шесть строк CSS» видна в метриках загрузки.

Прогресс и появление по скроллу

Индикатор прочитанного, параллакс, выезжающие блоки — раньше всё это требовало обработчика скролла и тормозило вместе с ним. Теперь анимация привязывается не ко времени, а к прокрутке: animation-timeline: scroll() следит за прогрессом контейнера, animation-timeline: view() — за появлением элемента в области видимости. Виджет поддержки — выше, в блоке про AOS.

.reading-progress {
  position: fixed;
  inset-block-start: 0;
  inline-size: 100%;
  block-size: 4px;
  transform-origin: 0 50%;
  animation: fill-line linear both;
  animation-timeline: scroll(root block);
}

@keyframes fill-line {
  from { transform: scaleX(0); }
  to   { transform: scaleX(1); }
}

Появление элемента, которого только что не было

Анимировать появление всегда было неудобно: transition нечего анимировать, если элемент только что вставили в DOM — отсюда и брались наборы с классами вида fadeInDown. Правило @starting-style задаёт состояние, из которого элемент стартует при первой отрисовке.

.toast {
  opacity: 1;
  translate: 0 0;
  transition: opacity 0.25s, translate 0.25s, display 0.25s allow-discrete;
}

/* состояние на момент появления */
@starting-style {
  .toast {
    opacity: 0;
    translate: 0 1rem;
  }
}
Поддержка браузерами
chrome
Chrome
117
firefox
Firefox
129
edge
Edge
117
safari
Safari
17.5
opera
Opera
103

Переход между состояниями и страницами

Переходы между экранами — та задача, под которую обычно советуют наборы вроде Magic CSS. View Transitions решает её иначе: браузер сам снимает состояние «до» и «после» и анимирует разницу, а общие элементы честно переезжают из точки в точку.

/* переходы между страницами одного сайта, без единой строчки JS */
@view-transition {
  navigation: auto;
}

/* общий элемент, который должен «переехать», а не исчезнуть и появиться */
.card-hero {
  view-transition-name: hero;
}
Поддержка браузерами
chrome
Chrome
111
firefox
Firefox
144
edge
Edge
111
safari
Safari
18.0
opera
Opera
97

Последним из основных браузеров переходы подхватил Firefox — так что теперь это рабочий инструмент, а не эксперимент под флагом.

Анимация, которая никому не мешает

Два правила, которые важнее выбора библиотеки. Первое — про людей: для части пользователей движение на экране означает тошноту и головокружение, и они выставляют в системе «уменьшить движение». Анимация обязана это уважать, и сами библиотеки помогают неравномерно: Animate.css глушит эффекты автоматически, у GSAP для этого есть gsap.matchMedia(), но написать условие всё равно нужно руками, а у большинства наборов классов нет и этого. Как это устроено, подробно разобрано в статье про медиа-запрос prefers-reduced-motion.

Поддержка браузерами
chrome
Chrome
74
firefox
Firefox
63
edge
Edge
79
safari
Safari
10.1
opera
Opera
64

Второе правило — про плавность. Анимировать стоит transform и opacity: их браузер отдаёт композитору мимо пересчёта раскладки. Анимация width, height, top или margin пересчитывает геометрию страницы на каждом кадре — отсюда рывки на слабых устройствах, и библиотека тут не помогает: GSAP с анимацией height дёргается так же, как самописный код. Свойство will-change помогает, но легко применяется себе во вред — про это есть отдельный разбор.

Если базовая механика CSS-анимаций еще не усвоена, начать стоит с разбора @keyframes и свойств animation — половина библиотек из списка после этого перестаёт быть нужной.

Что под какую задачу

Задача Чем закрывать Почему
Пара эффектов на лендинге Animista В бандл уезжает меньше килобайта, зависимости нет
Типовые эффекты по всему сайту Animate.css 5 КБ после gzip, глушится при reduced-motion сам
Яркие переходы между экранами Magic CSS, View Transitions Самый дешёвый эффект и нативная альтернатива
Свои комбинации эффектов, Vue или React AnimXYZ Эффект собирается из утилит, а не выбирается из списка
Появление блоков при прокрутке CSS animation-timeline, AOS Нативно без скрипта; AOS — если нужен Firefox
Индикатор загрузки Loading.io или свои кейфреймы Сервис — под нетиповой лоадер и разные форматы
Заглушки на время загрузки Свой CSS-градиент Один @keyframes вместо зависимости
Галерея с лайтбоксом lightGallery Готовый компонент; проверить лицензию до релиза
Сложная сцена с таймлайном GSAP Плагины стали бесплатными, включая коммерческое использование
Анимация DOM, SVG и чисел из кода anime.js Модульный импорт, низкий порог входа
Пружины, инерция, React Motion Опирается на Web Animations API, мини-версия от 2,3 КБ
Управляемая анимация без зависимостей Web Animations API Пауза, реверс и скорость есть в браузере из коробки

С чего начать

Порядок действий такой. Сначала проверь, не закрывает ли задачу сам браузер: появление, прогресс по скроллу, переход между экранами и управляемая из кода анимация теперь нативные. Нужны готовые эффекты — начни с генератора, переходи на набор классов, когда эффектов станет больше десятка. И только под сцену, где элементы двигаются по расписанию и слушают пользователя, подключай движок: GSAP — за таймлайны и плагины, anime.js — за простой вход, Motion — за нативную основу и React.

Что бы ты ни выбрал, проверь две вещи перед релизом: анимации глохнут при включённом «уменьшить движение» и двигаются только transform с opacity. Это дешевле любой оптимизации потом. А если анимировать нужно векторную графику, посмотри заодно онлайн-редакторы SVG — часть из них отдаёт готовую анимацию без единой библиотеки.