Переход между анимационными библиотеками почти всегда связан не только с синтаксисом, но и с изменением модели мышления. В случае перехода с GSAP на Motion One меняется фундамент: от императивной системы управления таймлайнами и твинами к более декларативной модели, опирающейся на Web Animations API и минималистичный runtime.
GSAP исторически строится вокруг концепции полного контроля: создание
твинов, управление позициями в таймлайне, сложные цепочки, ручная
синхронизация. Motion One упрощает этот слой, оставляя только ключевые
примитивы: animate, timeline,
stagger, spring, scroll.
Ключевое отличие проявляется в том, как описывается анимация:
В GSAP типичная анимация строится через gsap.to():
gsap.to(".box", {
x: 300,
opacity: 1,
duration: 1,
ease: "power2.out"
});
В Motion One эквивалент выглядит проще и ближе к Web Animations API:
import { animate } from "motion";
animate(".box", {
x: 300,
opacity: 1
}, {
duration: 1,
easing: "ease-out"
});
Разница не только синтаксическая. В GSAP объект анимации становится
сущностью с методами (pause, reverse,
seek). В Motion One анимация чаще рассматривается как
результат функции.
В GSAP длительность — часть конфигурации твина:
gsap.to(".box", {
x: 400,
duration: 2
});
В Motion One длительность отделена во второй аргумент:
animate(".box", { x: 400 }, { duration: 2 });
Такое разделение усиливает концепцию разделения состояния и поведения: свойства анимации отделены от параметров исполнения.
GSAP использует богатую систему easing-строк и функций:
power1.outpower4.inOutelastic.outbounce.outMotion One опирается на стандартизированные easing-функции CSS:
animate(".box", { x: 200 }, {
easing: "ease-in-out"
});
или кастомные функции:
animate(".box", { x: 200 }, {
easing: (t) => t * t * (3 - 2 * t)
});
В GSAP сложные easing-эффекты встроены в ядро, тогда как Motion One предпочитает минимализм и перенос части сложности в пользовательские функции или CSS.
GSAP timeline — одна из ключевых причин его популярности:
const tl = gsap.timeline();
tl.to(".box", { x: 100, duration: 1 })
.to(".box", { y: 100, duration: 1 })
.to(".box", { rotate: 180, duration: 1 });
В Motion One используется timeline, но концепция
проще:
import { timeline } from "motion";
timeline([
[".box", { x: 100 }, { duration: 1 }],
[".box", { y: 100 }, { duration: 1 }],
[".box", { rotate: 180 }, { duration: 1 }]
]);
Различие заключается в структуре:
Это влияет на читаемость сложных сценариев: Motion One делает их более декларативными и статичными.
В GSAP stagger реализуется через параметр:
gsap.to(".item", {
y: 50,
stagger: 0.1
});
Motion One сохраняет идею, но делает её более функциональной:
animate(".item", {
y: 50
}, {
delay: stagger(0.1)
});
Здесь stagger превращается в функцию, которая генерирует
задержки, а не просто число. Это даёт больше контроля над логикой
распределения времени.
GSAP использует отдельный плагин ScrollTrigger:
gsap.to(".box", {
x: 300,
scrollTrigger: {
trigger: ".box",
start: "top center",
end: "bottom top",
scrub: true
}
});
Motion One интегрирует scroll как часть ядра:
import { scroll } from "motion";
scroll(
animate(".box", { x: 300 })
);
В более сложных сценариях управление прогрессом также упрощается:
scroll(({ progress }) => {
animate(".box", { scale: progress });
});
Разница архитектурная:
GSAP предоставляет богатый API управления:
pause()resume()reverse()seek()Motion One ориентируется на Web Animations API, где контроль
осуществляется через Animation объект:
const animation = animate(".box", { x: 300 });
animation.pause();
animation.play();
animation.cancel();
Модель ближе к браузерной спецификации, но менее расширена по сравнению с GSAP.
GSAP использует собственный движок обновления (ticker), который обеспечивает стабильность между браузерами и сложными сценами.
Motion One опирается на:
Это приводит к следующей модели:
В результате уменьшается размер библиотеки и упрощается интеграция, но часть гибкости переносится на уровень браузера.
GSAP:
gsap.fromTo(".box",
{ opacity: 0 },
{ opacity: 1, duration: 1 }
);
Motion One:
animate(".box",
{ opacity: [0, 1] },
{ duration: 1 }
);
Ключевое изменение: использование массивов значений вместо двух объектов.
GSAP:
gsap.to(".box", {
x: 200,
repeat: 2,
yoyo: true
});
Motion One:
animate(".box", {
x: 200
}, {
repeat: 2,
direction: "alternate"
});
GSAP:
gsap.to(".box", {
x: 200,
delay: 1
});
Motion One:
animate(".box", { x: 200 }, { delay: 1 });
GSAP поддерживает сложные цепочки через timeline или keyframes:
gsap.to(".box", {
keyframes: [
{ x: 100, duration: 1 },
{ y: 100, duration: 1 },
{ rotate: 180, duration: 1 }
]
});
Motion One делает keyframes нативной частью API:
animate(".box", {
x: [0, 100, 100],
y: [0, 0, 100],
rotate: [0, 0, 180]
}, {
duration: 2
});
Модель становится ближе к CSS-анимациям и Web Animations API.
GSAP предоставляет:
Motion One предоставляет:
Переход требует отказа от нескольких привычных паттернов:
Основной эффект миграции заключается в уменьшении уровня абстракции между кодом и браузерной анимацией.