Что такое FLIP-техника для анимаций

Ответ

FLIP — техника анимации, оптимизирующая производительность за счёт расчёта изменений заранее. Аббревиатура расшифровывается:

  1. First — запоминаем начальное состояние (например, getBoundingClientRect())
  2. Last — фиксируем конечное состояние после изменений (например, после добавления класса)
  3. Invert — вычисляем разницу и применяем transform для имитации исходного положения
  4. Play — запускаем анимацию к конечному состоянию

Пример:

// Запоминаем начальную позицию
const first = element.getBoundingClientRect();

// Применяем изменения (например, добавляем класс)
element.classList.add('animate');

// Получаем конечную позицию
const last = element.getBoundingClientRect();

// Вычисляем разницу
const deltaX = first.left - last.left;
const deltaY = first.top - last.top;

// Инвертируем через transform
element.style.transform = `translate(${deltaX}px, ${deltaY}px)`;

// Запускаем анимацию
requestAnimationFrame(() => {
  element.style.transition = 'transform 0.5s ease';
  element.style.transform = '';
});

Преимущества: работает на GPU (transform/opacity), избегает дорогих вычислений в процессе анимации.

Ответ 18+ 🔞

А, слушай, вот есть такая штука — FLIP, ну просто пиздец как хитрая техника для анимаций. Суть в том, чтобы не ебашить браузер вычислениями в реальном времени, а всё прикинуть заранее, как шахматист на три хода вперёд. Расшифровывается просто:

  1. First — сначала хватаем элемент за его начальные координаты, типа getBoundingClientRect(). Запомнили, где он сидит.
  2. Last — потом делаем то, что хотели (добавляем класс, меняем стили), и сразу же смотрим, где он должен оказаться в итоге. Снова getBoundingClientRect().
  3. Invert — а вот тут магия, блядь. Берём разницу между «было» и «стало», и с помощью transform откатываем элемент НАЗАД, на старую позицию. Для зрителя он как будто никуда не двигался, но технически он уже готов к прыжку.
  4. Play — и тут включаем анимацию! Убираем наш инвертирующий трансформ, и элемент плавно едет на своё законное, заранее вычисленное место. А всё потому, что анимируем мы только transform и opacity — это ж почти бесплатно для видеокарты!

Смотри, как это в коде выглядит, ёпта:

// F — хватаем начальное состояние
const first = element.getBoundingClientRect();

// L — врубаем финальные стили (например, класс)
element.classList.add('animate');
// И сразу ловим, куда он должен приехать
const last = element.getBoundingClientRect();

// I — считаем, насколько надо откатить
const deltaX = first.left - last.left;
const deltaY = first.top - last.top;
// И откатываем! Элемент визуально на месте, но технически — уже нет.
element.style.transform = `translate(${deltaX}px, ${deltaY}px)`;

// P — Поехали, мать его!
requestAnimationFrame(() => {
  element.style.transition = 'transform 0.5s ease';
  // Убираем трансформ — и он летит на нужное место.
  element.style.transform = '';
});

В чём прикол-то? Всё самое тяжёлое (получение позиций) делается ДО анимации, одним махом. А в процессе самой анимации браузер тупо двигает картинку силами GPU, не пересчитывая всю вёрстку каждые полмиллисекунды. Итог — анимации гладкие, даже если элементов овердохуища. Хитрая жопа, но работает, блядь, как часы.