Цветовые переходы

Интерполяция цвета как базовый механизм анимации

Цветовые переходы в анимационных системах строятся на принципе интерполяции — вычисления промежуточных значений между начальным и конечным состоянием. В mo.js цвет рассматривается как числовая модель, независимо от исходного формата записи: HEX, RGB или HSL. Внутренний механизм приводит значения к единому представлению и выполняет плавное изменение каналов.

При переходе от одного цвета к другому отдельно обрабатываются компоненты:

  • красный канал
  • зелёный канал
  • синий канал
  • альфа-канал при наличии прозрачности

Каждый из каналов изменяется по функции easing, заданной в анимации. Это означает, что визуальная динамика цвета может быть линейной, ускоренной, замедленной или сложной кривой.


Базовая анимация цвета в Shape-модулях

В mo.js цветовые переходы чаще всего применяются к объектам Shape, где доступны свойства заливки и обводки.

const circle = new mojs.Shape({
  shape: 'circle',
  fill: { '#ff4d4d': '#4d79ff' },
  radius: 40,
  duration: 1200
});

circle.play();

В этом примере происходит интерполяция между двумя цветами заливки. Важно, что библиотека автоматически определяет тип значения и применяет корректный алгоритм преобразования.

Цвет может быть задан и для обводки:

const ring = new mojs.Shape({
  shape: 'circle',
  fill: 'none',
  stroke: { '#00e5ff': '#ffcc00' },
  strokeWidth: 8,
  radius: 50,
  duration: 1500
});

Форматы представления цвета

Поддерживаются несколько распространённых форматов записи:

  • HEX (#ff0000)
  • RGB (rgb(255, 0, 0))
  • RGBA (rgba(255, 0, 0, 0.5))
  • HSL (hsl(0, 100%, 50%))

При интерполяции mo.js приводит все значения к единому внутреннему виду. Это позволяет смешивать разные форматы без дополнительных преобразований со стороны разработчика.

fill: { 'rgb(255,0,0)': 'hsl(240,100%,50%)' }

Несмотря на различие синтаксиса, переход выполняется корректно за счёт конвертации в RGB-пространство.


Управление динамикой цветового перехода через easing

Цветовой переход не является изолированным процессом — он подчиняется общей временной функции анимации.

const shape = new mojs.Shape({
  shape: 'rect',
  fill: { '#111111': '#ffffff' },
  easing: 'cubic.out',
  duration: 1000
});

Различные easing-функции изменяют восприятие цвета:

  • линейная интерполяция создаёт равномерное изменение
  • ease-in усиливает плавное «разгоняющееся» изменение
  • ease-out делает переход более мягким к завершению
  • сложные кривые дают нелинейные цветовые эффекты

Цвет в таком случае перестаёт быть статической характеристикой и становится функцией времени.


Цветовые переходы в Burst-анимациях

В Burst-эффектах цвет часто используется для создания визуального расширения или «взрыва» частиц.

const burst = new mojs.Burst({
  radius: { 0: 100 },
  count: 8,
  children: {
    shape: 'circle',
    fill: { '#ff3d00': '#00c853' },
    radius: 10,
    duration: 800
  }
});

Каждая частица наследует собственный цветовой переход, что позволяет формировать сложные визуальные паттерны без ручного управления каждым элементом.

При увеличении количества частиц цветовые переходы начинают играть роль синхронизирующего визуального параметра.


Непрерывные и дискретные цветовые изменения

В mo.js цвет может изменяться как непрерывно, так и дискретно.

Непрерывный переход

Происходит плавное изменение каналов цвета:

fill: { '#ff0000': '#0000ff' }

Дискретная смена

Цвет может меняться ступенчато через последовательность ключевых значений:

fill: {
  '#ff0000': '#00ff00',
  '#00ff00': '#0000ff'
}

При наличии нескольких ключей интерполяция выполняется по сегментам, создавая эффект «переключения» оттенков.


Цвет в timeline-анимациях

Timeline в mo.js позволяет синхронизировать цветовые переходы между несколькими объектами.

const timeline = new mojs.Timeline();

timeline.add(
  new mojs.Shape({
    shape: 'circle',
    fill: { '#ff1744': '#651fff' },
    duration: 1000
  }),
  new mojs.Shape({
    shape: 'rect',
    fill: { '#00e676': '#ffea00' },
    duration: 1000,
    delay: 200
  })
);

timeline.play();

Цветовые изменения в этом контексте становятся частью временной композиции, где каждый элемент имеет собственную фазу перехода.


Альфа-канал и прозрачность в цветовых переходах

Цветовые переходы включают поддержку прозрачности, что позволяет создавать эффекты растворения и появления.

fill: { 'rgba(255,0,0,1)': 'rgba(255,0,0,0)' }

Такие переходы особенно важны при комбинировании с трансформациями масштаба и перемещения, создавая эффект исчезновения объекта в пространстве.

Прозрачность интерполируется так же, как и цветовые каналы, что обеспечивает равномерное затухание.


Влияние цветовых переходов на восприятие анимации

Цветовые изменения влияют на восприятие скорости, направления и структуры движения. Даже при одинаковой геометрической траектории различные цветовые кривые создают разные визуальные впечатления.

Характерные эффекты:

  • холодные оттенки усиливают ощущение ускорения
  • тёплые цвета создают визуальную плотность движения
  • резкие контрастные переходы воспринимаются как импульс
  • мягкие градиенты формируют ощущение непрерывности

В mo.js цвет становится не декоративным элементом, а полноценным параметром анимационной модели.


Смешивание цветовых переходов с трансформациями

Цветовые переходы часто комбинируются с изменениями масштаба, вращения и позиции, создавая многомерные анимации.

const box = new mojs.Shape({
  shape: 'rect',
  fill: { '#ff6d00': '#2962ff' },
  scale: { 0: 1 },
  rotate: { 0: 180 },
  duration: 1200
});

В таких случаях цвет перестаёт быть изолированным свойством и становится частью общей трансформационной матрицы анимации.


Цветовые градиенты и псевдопереходы

Хотя mo.js не использует классические CSS-градиенты как основной механизм анимации, псевдоградиенты можно моделировать через последовательные цветовые ключи или множество слоёв объектов.

Пример приближения градиентного эффекта:

fill: {
  '#ff0000': '#ff8f00',
  '#ff8f00': '#ffff00'
}

Такая структура создаёт эффект постепенного изменения спектра без явного использования gradient-объектов.


Производительность цветовых анимаций

Цветовые переходы в mo.js оптимизированы для работы через requestAnimationFrame и минимизируют нагрузку на браузер. Однако сложность интерполяции возрастает при большом количестве одновременно анимируемых объектов.

Факторы влияния на производительность:

  • количество shape-объектов
  • частота обновления кадров
  • сложность easing-функций
  • использование прозрачности

При масштабировании сцен цветовые переходы становятся одним из ключевых факторов стабильности рендеринга.


Синхронизация цвета с пользовательскими свойствами

mo.js позволяет использовать пользовательские свойства, которые могут быть связаны с цветом через кастомные tween-значения.

const custom = new mojs.Tween({
  duration: 2000,
  onUpdate: function(progress) {
    const color = `rgb(${progress * 255}, 100, 150)`;
    element.style.background = color;
  }
});

Хотя это выходит за пределы стандартного API Shape, такой подход позволяет интегрировать цветовые переходы в любые DOM-элементы.


Цвет как параметр состояния анимационной системы

В рамках mo.js цвет может рассматриваться как индикатор состояния объекта:

  • начальное состояние — нейтральные или тёмные оттенки
  • активное состояние — насыщенные контрастные цвета
  • завершение — прозрачность или десатурация

Такой подход позволяет использовать цветовые переходы как средство кодирования логики анимации без дополнительных визуальных маркеров.