Базовый способ создания анимации в JavaScript строится вокруг цикла
рендеринга браузера. Ключевой механизм —
requestAnimationFrame, синхронизированный с частотой
обновления экрана.
Типовая структура анимации сводится к вычислению прогресса и изменению свойства элемента на каждом кадре:
const element = document.querySelector('.box');
let start = null;
const duration = 1000;
function animate(timestamp) {
if (!start) start = timestamp;
const progress = Math.min((timestamp - start) / duration, 1);
element.style.transform = `translateX(${progress * 300}px)`;
if (progress < 1) {
requestAnimationFrame(animate);
}
}
requestAnimationFrame(animate);
Такой подход обеспечивает полный контроль над состоянием анимации. Логика движения, easing-функции, прерывания и комбинации эффектов реализуются вручную.
Ключевые особенности:
Минусом становится рост сложности при увеличении количества анимаций и необходимость вручную решать задачи синхронизации, очередей и интерполяции.
CSS-уровень анимаций переносит вычисления в слой браузера, освобождая JavaScript от участия в каждом кадре.
Переходы описывают изменение состояния свойства:
.box {
transition: transform 300ms ease;
}
.box.active {
transform: translateX(300px);
}
JavaScript здесь лишь переключает классы:
element.classList.add('active');
Основные характеристики:
Более мощный механизм, позволяющий описывать ключевые кадры:
@keyframes slide {
0% { transform: translateX(0); }
100% { transform: translateX(300px); }
}
.box {
animation: slide 1s ease forwards;
}
Преимущества:
Ограничения:
Web Animations API объединяет преимущества CSS и JavaScript, предоставляя программируемый интерфейс для анимаций.
element.animate([
{ transform: 'translateX(0px)' },
{ transform: 'translateX(300px)' }
], {
duration: 1000,
easing: 'ease',
fill: 'forwards'
});
Возможности:
const animation = element.animate(
{ transform: ['translateX(0px)', 'translateX(300px)'] },
{ duration: 1000 }
);
animation.pause();
animation.play();
animation.reverse();
Особенности:
GSAP представляет собой высокоуровневую библиотеку анимации, ориентированную на сложные сцены и производительность.
gsap.to('.box', {
x: 300,
duration: 1,
ease: "power2.out"
});
Основные концепции:
const tl = gsap.timeline();
tl.to('.box', { x: 300, duration: 1 })
.to('.box', { y: 100, duration: 0.5 })
.to('.box', { rotation: 180, duration: 1 });
Сильные стороны:
В сравнении с Popmotion:
Framer Motion строится вокруг React-экосистемы и декларативного описания анимаций.
<motion.div animate={{ x: 300 }} transition={{ duration: 1 }} />
Характерные особенности:
<motion.div
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
/>
Подход отличается от Popmotion тем, что логика анимации становится частью UI-декларации, а не отдельным вычислительным слоем.
Альтернативой библиотечным решениям остаётся построение анимаций на основе физических моделей.
let velocity = 0;
let position = 0;
function spring() {
const target = 300;
const stiffness = 0.1;
const damping = 0.8;
const force = (target - position) * stiffness;
velocity = (velocity + force) * damping;
position += velocity;
element.style.transform = `translateX(${position}px)`;
if (Math.abs(position - target) > 0.5) {
requestAnimationFrame(spring);
}
}
Такой подход позволяет:
Недостаток заключается в необходимости ручной настройки параметров и усложнении поддержки.
В архитектурах с разделением состояния и представления анимация часто становится производной от изменения данных.
state.x = 300;
render(state);
Функция рендера интерполирует значения:
function render(state) {
element.style.transform = `translateX(${state.x}px)`;
}
Если добавить промежуточную интерполяцию, появляется базовый слой анимационной системы без специализированных библиотек.
Императивные решения (requestAnimationFrame) находятся
на нижнем уровне и требуют ручного контроля каждого кадра. CSS-решения
переносят вычисления в браузер, снижая гибкость ради
производительности.
Web Animations API занимает промежуточное положение, предоставляя программируемость при сохранении оптимизаций движка.
Библиотеки вроде GSAP и Popmotion добавляют слой композиции:
Реактивные решения (Framer Motion) интегрируют анимацию в модель состояния UI, делая её частью декларативного описания интерфейса.
Нижнеуровневые подходы опираются на явное управление кадрами и временем. Они дают максимальную свободу, но требуют ручной реализации всех вспомогательных механизмов: интерполяции, очередей, отмены и синхронизации.
Средний уровень абстракции (Web Animations API, Popmotion) вводит понятие управляемых анимационных сущностей. Здесь уже появляются:
Высокоуровневые системы (GSAP, Framer Motion) фокусируются на описании результата, скрывая внутреннюю механику. Управление временем и кадрами становится вторичным по отношению к структуре сцены или состоянию интерфейса.
Низкоуровневые методы подходят для:
CSS-анимации используются в:
Web Animations API становится уместным при:
Библиотечные решения применяются для:
Реактивные системы используются в: