Функция animate является центральным механизмом
библиотеки Motion One, через который создаются, управляются и
синхронизируются анимации в браузере. Она работает поверх Web Animations
API и предоставляет более компактный и выразительный интерфейс для
описания переходов состояний элементов.
Основная форма функции:
animate(target, keyframes, options)
Параметры:
Функция возвращает объект управления анимацией, через который можно управлять проигрыванием, паузой и состоянием.
В качестве цели анимации могут использоваться различные типы значений:
animate(document.querySelector(".box"), {...}, {...})
animate(".box", {...}, {...})
animate(document.querySelectorAll(".box"), {...}, {...})
Поддержка CSS-селекторов позволяет избегать ручного выбора элементов, а NodeList автоматически разворачивается в набор целей.
Keyframes определяют изменение свойств во времени. В Motion One используется декларативный формат, близкий к CSS-анимациям, но с расширенной гибкостью.
animate(".box",
{ x: 300, opacity: 0 },
{ duration: 1 }
)
В этом случае библиотека интерпретирует начальное состояние автоматически, а конечное задаётся явно.
Для более сложных переходов используются массивы значений:
animate(".box",
{ x: [0, 100, 200, 0] },
{ duration: 2 }
)
Каждое значение массива соответствует ключевой точке анимации, равномерно распределённой по времени.
Одновременно можно анимировать несколько свойств:
animate(".box", {
x: [0, 200],
opacity: [1, 0],
scale: [1, 1.5, 1]
}, {
duration: 1.5
})
Каждое свойство может иметь собственное количество ключевых точек, что позволяет создавать сложные синхронные переходы.
Motion One автоматически обрабатывает различные типы данных:
opacity: 0 → 1)x: 100)rotate: 180)x: "50%")backgroundColor: "#ff0000")Интерполяция выполняется через Web Animations API с дополнительной нормализацией значений.
Продолжительность анимации в секундах:
animate(".box", { x: 200 }, { duration: 0.8 })
Задержка перед стартом:
animate(".box", { x: 200 }, { delay: 0.3 })
Кривая изменения скорости:
animate(".box", { x: 200 }, { easing: "ease-in-out" })
Также поддерживаются cubic-bezier значения:
easing: [0.42, 0, 0.58, 1]
Повтор анимации:
animate(".box", { x: 200 }, { repeat: Infinity })
или
animate(".box", { x: 200 }, { iterations: 3 })
Направление воспроизведения:
"normal""reverse""alternate""alternate-reverse"animate(".box", { x: 200 }, { direction: "alternate" })
Поведение после завершения:
"forwards""backwards""both""none"animate(".box", { x: 200 }, { fill: "forwards" })
Функция animate возвращает объект анимации с методами
управления.
const animation = animate(".box", { x: 200 });
animation.play();
animation.pause();
animation.stop();
Мгновенное завершение анимации:
animation.finish();
Перемещение к определённому времени:
animation.time = 0.5;
или через прогресс:
animation.progress = 0.5;
Объект анимации поддерживает реакцию на ключевые события:
animation.onfin ish = () => {
console.log("завершено");
};
Дополнительно доступны:
oncancelonupdateПри передаче списка элементов каждый из них анимируется синхронно:
animate(".item", { opacity: 0 }, { duration: 0.5 })
Для независимой обработки требуется явное разделение:
document.querySelectorAll(".item").forEach(el => {
animate(el, { opacity: 0 }, { duration: 0.5 });
});
Motion One позволяет комбинировать разные типы keyframes:
animate(".box", {
x: [0, 100, 50, 200],
rotate: [0, 90, 45, 180],
opacity: [1, 0.5, 1]
}, {
duration: 2,
easing: "ease-in-out"
})
Свойства трансформации объединяются в единый CSS transform:
animate(".box", {
x: 100,
y: 50,
rotate: 45,
scale: 1.2
})
Под капотом формируется оптимизированная строка transform без конфликтов между свойствами.
Поддерживаются различные форматы:
animate(".box", {
backgroundColor: ["#ff0000", "#00ff00"],
color: ["rgb(0,0,0)", "rgb(255,255,255)"]
})
Интерполяция выполняется автоматически независимо от формата входных значений.
Числовые свойства интерполируются напрямую:
animate(".box", {
opacity: [0, 1],
scale: [0.5, 1]
})
Допускаются относительные изменения:
animate(".box", {
x: "+=100"
})
или
animate(".box", {
rotate: "-=45"
})
Несколько анимаций могут запускаться одновременно:
animate(".box", { x: 200 }, { duration: 1 });
animate(".circle", { scale: 1.5 }, { duration: 1 });
Для координации используется единый временной контекст через управление задержками:
animate(".box", { x: 200 }, { delay: 0 });
animate(".circle", { scale: 1.5 }, { delay: 0.2 });
Завершение анимации может использоваться для цепочек переходов:
animate(".box", { x: 200 }, { duration: 1 }).onfin ish = () => {
animate(".box", { opacity: 0 }, { duration: 0.5 });
};
При повторном вызове animate на одном элементе
предыдущая анимация может быть заменена новой, если не сохранён её
объект управления.
animate(".box", { x: 100 });
animate(".box", { x: 200 });
Второй вызов перезапишет первый.
Keyframes могут вычисляться на лету:
const distance = 300;
animate(".box", {
x: [0, distance]
})
Motion One транслирует параметры animate в native
WAAPI-анимации, что обеспечивает:
При отсутствии явного duration используется стандартное
значение:
duration: 0.3
При отсутствии easing применяется:
ease: "ease"
Поддерживаются SVG атрибуты:
animate("circle", {
r: [10, 50],
opacity: [0, 1]
})
Проценты интерполируются относительно текущего контейнера:
animate(".box", {
x: ["0%", "100%"]
})
Сложные последовательности реализуются через цепочки:
const a = animate(".box", { x: 200 }, { duration: 1 });
a.onfin ish = () => {
animate(".box", { rotate: 180 }, { duration: 1 });
};
При вызове stop происходит немедленная остановка без
завершения перехода:
const a = animate(".box", { x: 200 });
a.stop();
Событие oncancel срабатывает при отмене:
a.oncan cel = () => {
console.log("анимация отменена");
};