Циклические keyframes представляют собой механизм построения анимации, в которой последовательность состояний не завершается на последнем кадре, а возвращается к началу или повторяется по заданному правилу. В Popmotion keyframes описываются как массив значений, между которыми происходит интерполяция во времени, а цикличность добавляется через параметры повторения, зацикливания или зеркального воспроизведения.
Базовая идея заключается в том, что анимация рассматривается как функция времени:
Keyframes задаются как последовательность значений:
import { keyframes } from "popmotion";
const animation = keyframes({
values: [0, 100, 50, 200],
duration: 2000
});
Поведение по умолчанию:
Цикличность в таком виде отсутствует, и добавляется отдельно.
Повторение реализуется через параметр loop или обёртки
повторного запуска.
import { keyframes, loop } from "popmotion";
const animation = loop(
keyframes({
values: [0, 100, 50, 200],
duration: 2000
})
);
Поведение:
Циклические keyframes в таком варианте формируют непрерывное движение без пауз.
Последовательность повторяется без изменения направления:
loop(
keyframes({
values: [0, 1, 0.5, 1],
duration: 1000
})
);
Особенности:
Зеркальная цикличность обеспечивает обратное воспроизведение keyframes.
import { keyframes, yoyo } from "popmotion";
const animation = yoyo(
keyframes({
values: [0, 100, 200],
duration: 1500
})
);
Модель поведения:
Зеркальная цикличность устраняет резкий скачок в начале цикла.
Цикличность может быть дискретной:
import { keyframes, repeat } from "popmotion";
const animation = repeat(
keyframes({
values: [0, 50, 100],
duration: 800
}),
5
);
Семантика:
Внутри Popmotion keyframes интерполяция строится на нормализованной шкале времени:
При циклизации происходит повторная нормализация:
t = (t % 1)
Для зеркального режима применяется отражение:
t = 1 - t
в зависимости от фазы цикла.
Keyframes могут быть определены с явными временными смещениями:
const animation = keyframes({
values: [0, 100, 0],
times: [0, 0.5, 1],
duration: 1200
});
Циклическая интерпретация таких данных позволяет:
loop(
keyframes({
values: [1, 1.3, 1],
duration: 600
})
);
Используется для:
yoyo(
keyframes({
values: [-20, 20],
duration: 800
})
);
Используется для:
loop(
keyframes({
values: [0, 50, 100, 50],
duration: 1200
})
);
Особенности:
При работе с несколькими анимациями важно учитывать:
Пример синхронизации:
const a = loop(keyframes({ values: [0, 100], duration: 1000 }));
const b = loop(keyframes({ values: [100, 0], duration: 1000 }));
Результат:
При длительных циклах возможны:
Компенсация достигается через:
Easing внутри циклических keyframes влияет на форму повторения:
В цикле easing повторяется вместе с фазой анимации, что создаёт характерный «рисунок» движения.
Типичный сценарий:
loop(
keyframes({
values: [0, 360],
duration: 2000
})
);
Используется для:
Комбинация с scale и opacity позволяет создавать сложные составные циклы:
loop(
keyframes({
values: [0, 1, 0],
duration: 900
})
);
Циклическая keyframes-анимация в Popmotion строится из следующих компонентов:
Каждый цикл проходит одинаковый путь вычислений, что обеспечивает предсказуемость поведения вне зависимости от количества повторений.