FLIP (First, Last, Invert, Play) — это методика анимации, направленная на повышение производительности интерфейсов, особенно при работе с DOM-элементами. Основная идея заключается в том, чтобы минимизировать количество перерасчетов стилей и рефлоу, используя трансформации вместо прямого изменения размеров или позиций элементов.
Использование FLIP позволяет добиться высокой частоты кадров, так как
изменения происходят через GPU-ускоренные свойства
(transform и opacity) и не вызывают
дорогостоящих пересчетов стилей.
GSAP предоставляет встроенные механизмы для работы с FLIP-анимациями через плагин Flip, который полностью интегрируется с основной анимационной системой.
import { gsap } from "gsap";
import { Flip } from "gsap/Flip";
gsap.registerPlugin(Flip);
// Сохранение текущего состояния
const state = Flip.getState(".box");
// Изменение DOM
document.querySelector(".container").appendChild(document.querySelector(".box"));
// Анимация с плавным переходом
Flip.from(state, {
duration: 1,
ease: "power1.inOut",
absolute: true
});
Ключевые параметры метода Flip.from:
true, элементы
позиционируются абсолютно для точного воспроизведения перехода.Для коллекций элементов, например сеток или списков, FLIP позволяет
анимировать перестановки, добавления и удаления без прерывания общей
анимации. Важно работать с идентификаторами элементов или ключами
(data-flip-id), чтобы Flip корректно сопоставлял
состояния:
<div class="grid">
<div class="item" data-flip-id="1"></div>
<div class="item" data-flip-id="2"></div>
</div>
const state = Flip.getState(".item");
reorderItems(); // функция перестановки DOM
Flip.from(state, { duration: 0.8, ease: "power2.out" });
Использование уникальных идентификаторов позволяет анимировать только изменившиеся элементы, оставляя остальные без перерасчетов.
FLIP особенно эффективен для динамического контента. Элементы можно анимировать при появлении и исчезновении, предотвращая резкие изменения макета:
const state = Flip.getState(".list-item");
// Добавление нового элемента
const newItem = document.createElement("div");
newItem.classList.add("list-item");
document.querySelector(".list").appendChild(newItem);
Flip.from(state, {
duration: 0.6,
ease: "back.out(1.7)",
stagger: 0.05
});
Плагин автоматически создаёт плавные переходы для новых и удаляемых элементов, синхронизируя изменения в DOM с GPU-ускоренными трансформациями.
FLIP-анимации максимально эффективны при соблюдении следующих правил:
absolute позиционирование при
необходимости — позволяет плавно перемещать элементы без
влияния на соседние элементы.Плагин Flip легко интегрируется с таймлайнами GSAP, позволяя создавать комплексные анимации с синхронизацией переходов и дополнительных эффектов:
const state = Flip.getState(".card");
gsap.timeline()
.add(Flip.from(state, { duration: 0.8, ease: "power2.inOut" }))
.to(".highlight", { scale: 1.1, duration: 0.5, ease: "elastic.out(1, 0.5)" });
Такой подход позволяет комбинировать перестановку элементов, появление и исчезновение контента, а также любые декоративные эффекты в единой последовательности.
Flip.getState на минимальных подмножеств DOM, чтобы снизить
нагрузку.scale, rotation) можно
применять одновременно с FLIP для усиления восприятия движения.stagger создаёт эффект последовательного
перемещения элементов, добавляя динамику интерфейсу.Flip.fit позволяет подстраивать размеры элементов под
новые контейнеры, сохраняя плавность переходов.FLIP-техника в сочетании с GSAP открывает возможности для создания отзывчивых, плавных и визуально насыщенных интерфейсов без потери производительности даже на мобильных устройствах.