Popmotion обрабатывает анимации как последовательность числовых преобразований, где ключевая задача — корректно интерполировать значения между начальным и конечным состоянием. При работе с CSS это усложняется тем, что свойства могут иметь разные единицы измерения: пиксели, проценты, градусы, относительные величины и комбинированные форматы.
В основе механизма лежит разделение значения на числовую и строковую
части. Это позволяет библиотеке понимать структуру "100px",
"50%", "rotate(180deg)" и строить корректные
переходы между ними.
Любое CSS-значение в Popmotion интерпретируется как составное выражение:
translateX,
rotate, scale)Пример:
100px → { value: 100, unit: "px" }
50% → { value: 50, unit: "%" }
При несовпадении единиц библиотека либо пытается привести значения к общему формату, либо выполняет строковую интерполяцию, если преобразование невозможно.
Когда стартовое и конечное значение используют одинаковую единицу измерения, применяется числовая интерполяция:
100px → 300px
Фактически рассчитывается линейная функция:
value = start + (end - start) * progress
где progress изменяется от 0 до
1.
Такой подход обеспечивает стабильную анимацию без потери точности и без перерасчёта контекста DOM.
Сложности возникают при смешении единиц:
100px → 50%
В этом случае Popmotion не может выполнить прямое числовое преобразование, так как проценты зависят от контекста (ширины или высоты родительского элемента).
Применяется один из подходов:
Строковая интерполяция даёт промежуточные состояния вроде:
calc(100px + 25%)
Если поддерживается вычисление контекста, процент переводится в пиксели:
50% от 800px = 400px
Процентные значения в CSS не являются абсолютными. Они зависят от свойства:
width → от ширины родителяheight → от высоты родителяtransform → от собственной геометрии элементаPopmotion при работе с процентами опирается на текущие вычисленные стили DOM:
const parentWidth = element.parentNode.offsetWidth;
const target = parentWidth * 0.5;
Это позволяет превратить процентное значение в абсолютное число перед интерполяцией.
Свойства transform представляют отдельную категорию, так
как содержат:
translateX(px, %)translateY(px, %)rotate(deg)scale(unitless)Popmotion разбивает трансформацию на компоненты и интерполирует каждую отдельно.
Пример:
translateX(0px) → translateX(100px)
rotate(0deg) → rotate(180deg)
Для каждого параметра используется своя шкала:
Градусы требуют особого подхода из-за цикличности:
350deg → 10deg
Прямая интерполяция дала бы некорректный путь через 180°, поэтому Popmotion выбирает кратчайший путь:
Это снижает визуальную нагрузку и делает анимации предсказуемыми.
Если значения невозможно привести к числам, применяется строковая модель.
Пример:
"translateX(10px) scale(1)" → "translateX(200px) scale(2)"
Алгоритм:
Такая модель используется как fallback для сложных CSS-значений.
Popmotion анализирует входные данные и классифицирует их:
CSS-единицы рассматриваются как часть токена, а не как часть строки.
Проценты зависят от состояния DOM в момент вычисления. Это означает:
Popmotion не фиксирует процентные значения автоматически, если не используется явное измерение перед стартом анимации.
При использовании ключевых кадров возможны комбинации:
0% → 0px
50% → 50%
100% → 200px
В таком случае Popmotion строит промежуточные значения через нормализацию:
Если нормализация невозможна, применяется строковая модель.
Для повышения производительности используются следующие подходы:
getComputedStyleОсобенно важно избегать повторного измерения layout внутри анимационного цикла.
Числа без единиц считаются универсальными значениями:
opacity: 0 → 1
scale: 1 → 2
zIndex: 0 → 10
Такие значения не требуют контекстной привязки и всегда интерполируются напрямую.
При комбинировании разных типов значений Popmotion выбирает стратегию по приоритету:
Это позволяет сохранить визуальную непрерывность даже при сложных стилевых переходах.
Некоторые комбинации CSS не имеют однозначного математического соответствия:
auto → 100pxmin-content → 50%fit-content → fixed valueВ таких случаях Popmotion не выполняет числовую интерполяцию и переключается на дискретное или строковое изменение.
Внутренний пайплайн обработки CSS-значений можно описать как последовательность: