Количество и распределение элементов

В mo.js количество визуальных объектов задаётся не как фиксированная сущность сцены, а как параметр конкретного эффекта или анимационного модуля. Каждый модуль — shape, burst, html, swirl — оперирует собственным способом генерации экземпляров, но общий принцип остаётся одинаковым: один объект конфигурации может порождать множество анимированных сущностей.

Параметр count как основной регулятор

Во многих эффектах ключевым параметром выступает count, определяющий число создаваемых частиц:

const burst = new mojs.Burst({
  radius: { 0: 100 },
  count: 20,
  children: {
    shape: 'circle',
    radius: 5,
    fill: 'cyan'
  }
});

Значение count определяет плотность визуального эффекта. При малых значениях формируется акцентированный минималистичный рисунок, при больших — плотное облако частиц, визуально переходящее в текстуру.

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


Автоматическое распределение элементов внутри коллекции

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

Радиальное распределение

Для burst-эффектов применяется радиальная модель. Каждый элемент получает уникальный угол:

const burst = new mojs.Burst({
  radius: { 0: 120 },
  count: 12,
  children: {
    shape: 'polygon',
    points: 5,
    fill: 'orange',
    angle: { 0: 360 }
  }
});

Внутри происходит равномерное распределение углов:

  • 30°
  • 60°
  • 90°
  • 330°

Это позволяет формировать симметричные всплески, напоминающие взрыв или цветок.


Линейное распределение и смещения

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

const timeline = new mojs.Timeline();

const tween = new mojs.Tween({
  duration: 1000,
  delay: { 0: 500 },
  onUpdate(progress, index) {
    return progress;
  }
});

Хотя timeline не оперирует count напрямую, он демонстрирует принцип: каждый элемент может получать индивидуальный delay, формируя каскадную последовательность.


Распределение через children-конфигурацию

Наиболее важный механизм распределения элементов — объект children. Он определяет шаблон, который будет применён ко всем создаваемым экземплярам.

const burst = new mojs.Burst({
  count: 30,
  children: {
    shape: 'circle',
    radius: { 3: 0 },
    duration: 800,
    easing: 'cubic.out'
  }
});

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


Индексация элементов и параметризация через функции

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

const burst = new mojs.Burst({
  count: 10,
  children: {
    radius: (i) => 10 + i * 2,
    fill: (i) => i % 2 ? 'red' : 'blue'
  }
});

В этом случае:

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

Такой подход превращает набор одинаковых элементов в структурированную систему.


Стохастическое распределение параметров

mo.js активно использует случайность как инструмент распределения. Вместо строгих последовательностей можно задать диапазоны:

const burst = new mojs.Burst({
  count: 25,
  children: {
    radius: { 2: 8 },
    angle: { 0: 360 },
    x: { -50: 50 },
    y: { -50: 50 }
  }
});

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

  • частиц дыма
  • искр
  • пыли
  • абстрактных фонов

Синхронное и асинхронное распределение времени

Количество элементов влияет не только на пространственное, но и на временное распределение. mo.js позволяет растягивать анимации во времени через delay и duration.

const burst = new mojs.Burst({
  count: 15,
  children: {
    duration: { 300: 1000 },
    delay: { 0: 200 }
  }
});

В результате:

  • одни элементы стартуют раньше
  • другие растягиваются по длительности
  • формируется волновая структура анимации

Гридовое распределение элементов

Хотя mo.js не ограничивается радиальными эффектами, можно искусственно формировать сеточную структуру через вычисление координат.

const gridBurst = new mojs.Burst({
  count: 16,
  children: {
    x: (i) => (i % 4) * 20,
    y: (i) => Math.floor(i / 4) * 20,
    shape: 'rect',
    radius: 5
  }
});

Здесь распределение строится по принципу:

  • 4 колонки
  • 4 строки
  • индекс определяет позицию

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


Кластеризация элементов

При увеличении количества частиц важно управлять не только их распределением, но и группировкой. mo.js позволяет создавать несколько слоёв children внутри одного burst:

const burst = new mojs.Burst({
  count: 20,
  children: [
    {
      shape: 'circle',
      radius: { 2: 6 },
      fill: 'yellow',
      degreeShift: 0
    },
    {
      shape: 'circle',
      radius: { 1: 3 },
      fill: 'white',
      degreeShift: 180
    }
  ]
});

В этом случае создаются два подтипа элементов, распределённые по разным характеристикам. Это позволяет формировать:

  • ядро эффекта
  • внешнюю оболочку
  • контрастные группы внутри одного взрыва

Масштабирование количества через динамические параметры

Количество элементов может быть вычисляемым значением, зависящим от внешних факторов: размера экрана, координат клика, интенсивности события.

const size = window.innerWidth;

const burst = new mojs.Burst({
  count: Math.floor(size / 50),
  children: {
    radius: { 2: 10 }
  }
});

Это создаёт адаптивную систему, где плотность эффекта пропорциональна доступному пространству.


Связь количества элементов с визуальной плотностью

Количество элементов напрямую влияет на восприятие сцены:

  • до 10 элементов — акцентные минимальные эффекты
  • 10–30 элементов — декоративные всплески
  • 30–100 элементов — текстурные облака
  • 100+ элементов — фоновые динамические поля

Однако увеличение count без перераспределения параметров приводит к визуальной перегрузке. Поэтому важна синхронизация:

  • уменьшение радиуса при росте count
  • сокращение duration
  • увеличение вариативности углов и позиций

Взаимосвязь количества и производительности

Каждый элемент в mo.js — это отдельный tween. При увеличении count растёт количество одновременно активных анимаций, что влияет на:

  • нагрузку на CPU
  • частоту перерисовки DOM/SVG
  • плавность интерполяций

Оптимизация достигается через:

  • ограничение count
  • использование трансформаций вместо свойств layout
  • группировку элементов в единые контейнеры
  • сокращение количества одновременно активных burst

Параметрическое распределение как основа сложных эффектов

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

  • радиальное + случайное распределение
  • линейное + временное смещение
  • сеточное + вариативное масштабирование
const burst = new mojs.Burst({
  count: 40,
  children: {
    radius: { 1: 8 },
    angle: { 0: 360 },
    delay: { 0: 300 },
    x: (i) => Math.cos(i) * 30,
    y: (i) => Math.sin(i) * 30
  }
});

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