В современных браузерах процесс отрисовки кадра разбивается на несколько ключевых этапов:
Последний этап — composite — выполняется графическим процессором и не требует пересчёта геометрии или перерисовки пикселей. Это делает его самым дешёвым с точки зрения производительности.
Именно на этом этапе становятся критически важными compositor-friendly свойства — CSS-свойства, которые могут изменяться без запуска layout и paint.
Свойство считается compositor-friendly, если:
Такие свойства позволяют выполнять анимации с высокой частотой кадров (60 FPS и выше), минимизируя нагрузку на main thread.
В контексте Motion One это ключевая оптимизация: библиотека стремится переводить максимальное количество анимаций в compositing layer.
Главное свойство для производительных анимаций.
transform: translateX(100px) scale(1.2) rotate(45deg);
В Motion One трансформации разбиваются на отдельные атомарные свойства:
Причина эффективности: transform применяется на уровне compositing layer без изменения layout дерева.
opacity: 0.5;
Изменение прозрачности полностью обрабатывается GPU.
Особенности:
filter: blur(10px);
Поддержка зависит от браузера и сложности фильтра.
Часто:
могут переводиться в GPU-пайплайн, но при сложных комбинациях возможен fallback на paint.
will-change: transform, opacity;
Это не анимационное свойство, а подсказка браузеру.
Функции:
Используется умеренно, так как чрезмерное применение увеличивает память GPU.
Motion One автоматически старается избегать анимации следующих свойств, так как они вызывают layout или paint:
Любое изменение этих параметров запускает reflow, что критично снижает производительность.
Они требуют перерасчёта пикселей и перерисовки слоя.
Motion One использует Web Animations API и собственный слой нормализации свойств, который:
Motion One позволяет работать с более абстрактными свойствами:
animate(element, {
x: 100,
y: 50,
rotate: 180,
scale: 1.2
});
Эти значения автоматически трансформируются в:
transform: translateX(100px) translateY(50px) rotate(180deg) scale(1.2);
Преимущество такого подхода:
Когда элемент становится анимируемым через transform или opacity:
Важно учитывать:
| Тип свойства | Pipeline | Производительность |
|---|---|---|
| transform | composite | высокая |
| opacity | composite | высокая |
| filter | paint/composite | средняя |
| width | layout + paint | низкая |
| margin | layout | низкая |
Наиболее оптимальный вариант:
animate(element, { x: 200 });
Альтернатива, менее эффективная:
animate(element, { left: 200 });
Причина: left вызывает перерасчёт layout.
animate(element, { scale: 1.5 });
Полностью compositor-friendly операция.
animate(element, { opacity: 0 });
Обрабатывается GPU без участия layout.
animate(element, {
x: 100,
y: 50,
rotate: 45,
scale: 1.1
});
Все изменения объединяются в один transform pipeline, что минимизирует количество слоёв и операций.
При запуске анимации происходит несколько этапов:
Анализ свойств объекта keyframes
Разделение на:
Преобразование transform-значений
Передача в Web Animations API
Фоллбек на JS-анимацию при необходимости
Особое внимание уделяется тому, чтобы compositor-friendly свойства всегда оставались в GPU pipeline.
Использование:
animate(element, { marginLeft: 100 });
Проблема:
will-change: transform;
will-change: opacity;
Ошибка:
animate(element, {
x: 100,
width: 200
});
Результат:
Подход библиотеки строится на принципах:
Использование compositor-friendly свойств напрямую влияет на:
Motion One использует эти свойства как базовую единицу производительности, а не как дополнительную оптимизацию.