Фабрики анимаций

Фабрики анимаций в Velocity.js используются для генерации повторно применяемых конфигураций анимаций, которые инкапсулируют поведение, параметры и логику трансформаций элементов. Такой подход устраняет дублирование, упрощает масштабирование интерфейсных эффектов и позволяет строить предсказуемую систему анимаций, основанную на композиции и параметризации.

Фабрика анимаций в контексте Velocity.js чаще всего реализуется как функция, возвращающая объект конфигурации или готовый вызов Velocity. Базовая идея заключается в отделении описания анимации от её исполнения.

const fadeFactory = (duration = 300, easing = "ease-in-out") => {
  return {
    properties: {
      opacity: [1, 0]
    },
    options: {
      duration,
      easing
    }
  };
};

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

Применение фабрики с Velocity.js

Фабрика может использоваться как источник конфигурации для вызова Velocity:

const element = document.querySelector(".box");

const fadeIn = fadeFactory(500, "ease-out");

Velocity(element, fadeIn.properties, fadeIn.options);

Разделение на properties и options соответствует архитектуре Velocity.js, где свойства описывают конечное состояние анимации, а опции управляют временем, кривыми и дополнительным поведением.

Параметризация анимаций

Фабрики приобретают гибкость при добавлении параметров, влияющих на динамику эффектов. Это позволяет строить универсальные анимационные шаблоны.

const moveFactory = (x = 0, y = 0, duration = 400) => {
  return {
    properties: {
      translateX: x,
      translateY: y
    },
    options: {
      duration,
      easing: "ease-in-out"
    }
  };
};

Использование:

Velocity(element, moveFactory(100, 0, 600).properties, moveFactory(100, 0, 600).options);

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

Фабрики как слой композиции

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

const scaleFactory = (scale = 1.2, duration = 200) => ({
  properties: {
    scale
  },
  options: {
    duration,
    easing: "spring"
  }
});

const pulseFactory = () => {
  return [
    scaleFactory(1.2, 150),
    scaleFactory(1.0, 150)
  ];
};

Применение последовательности:

const sequence = pulseFactory();

Velocity(element, sequence[0].properties, sequence[0].options);
Velocity(element, sequence[1].properties, sequence[1].options);

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

Фабрики и очереди Velocity.js

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

const queueFactory = (name = "fx") => {
  return {
    properties: {
      opacity: 0
    },
    options: {
      duration: 300,
      queue: name
    }
  };
};

Использование очередей позволяет изолировать анимации по контекстам, предотвращая пересечение эффектов внутри одного элемента.

Velocity(element, queueFactory("intro").properties, queueFactory("intro").options);

Интеграция easing-стратегий

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

const easingFactory = (type = "ease-in") => {
  const map = {
    smooth: "ease-in-out",
    sharp: "ease-in",
    bounce: "spring"
  };

  return map[type] || "linear";
};

Использование внутри фабрики движения:

const slideFactory = (distance = 200, type = "smooth") => {
  return {
    properties: {
      translateX: distance
    },
    options: {
      duration: 400,
      easing: easingFactory(type)
    }
  };
};

Фабрики сложных составных анимаций

При росте интерфейса возникает необходимость комбинировать несколько трансформаций одновременно: перемещение, масштабирование, изменение прозрачности.

const modalFactory = (visible = true) => {
  return {
    properties: {
      opacity: visible ? 1 : 0,
      scale: visible ? 1 : 0.8,
      translateY: visible ? 0 : 20
    },
    options: {
      duration: 250,
      easing: "ease-out"
    }
  };
};

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

Фабрики с состоянием

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

const counterFactory = () => {
  let step = 0;

  return () => {
    step += 1;

    return {
      properties: {
        translateY: step * 10
      },
      options: {
        duration: 200
      }
    };
  };
};

Использование:

const animateStep = counterFactory();

Velocity(element, animateStep().properties, animateStep().options);
Velocity(element, animateStep().properties, animateStep().options);

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

Фабрики и нормализация параметров

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

const normalizeDuration = (d) => Math.max(100, Math.min(d, 2000));

const normalizedFactory = (opacity = 1, duration = 300) => {
  return {
    properties: {
      opacity
    },
    options: {
      duration: normalizeDuration(duration),
      easing: "ease-in-out"
    }
  };
};

Подобная логика снижает риск неконсистентного поведения интерфейса при различных условиях исполнения.

Фабрики как основа дизайн-системы анимаций

При развитии интерфейсных систем фабрики анимаций становятся слоем абстракции, аналогичным токенам в дизайн-системах. Они задают стандарты поведения:

  • длительности переходов
  • типы easing-кривых
  • базовые трансформации
  • структуру появления и исчезновения элементов
const animationTokens = {
  duration: {
    fast: 150,
    base: 300,
    slow: 600
  },
  easing: {
    default: "ease-in-out",
    entrance: "ease-out",
    exit: "ease-in"
  }
};

Фабрика, использующая такие токены:

const tokenizedFactory = () => {
  return {
    properties: {
      opacity: 1
    },
    options: {
      duration: animationTokens.duration.base,
      easing: animationTokens.easing.default
    }
  };
};

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

Фабрики как инструмент масштабирования Velocity.js

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