В системе анимации частиц в mo.js плотность определяется не только
количеством объектов, но и тем, как они распределяются в пространстве,
времени и направлении. Основные параметры, влияющие на плотность,
находятся в конфигурации Burst, Shape и
пользовательских композициях через timeline.
Ключевой параметр, задающий базовую плотность, — count.
Он определяет число частиц, создаваемых за один эмитт:
const burst = new mojs.Burst({
radius: { 0: 100 },
count: 20,
children: {
shape: 'circle',
radius: 5,
fill: 'cyan'
}
});
При увеличении count плотность возрастает линейно, но
визуальное восприятие зависит также от радиуса распределения и углового
разброса.
В mo.js частицы часто распределяются по окружности или внутри
расширяющегося радиуса. Параметр radius может задавать
диапазон:
radius: { 0: 120 }
Здесь частицы стартуют из центра и расходятся наружу. При фиксированном количестве частиц увеличение радиуса снижает визуальную плотность, так как площадь распределения увеличивается.
Плотность в радиальном распределении можно условно рассматривать как отношение количества частиц к площади круга:
Для более управляемого эффекта используется комбинация
radius и angleSpread.
Параметр angleSpread контролирует сектор, в котором
появляются частицы:
children: {
angle: { 0: 360 },
angleSpread: 180
}
При angleSpread: 360 частицы распределяются равномерно
по окружности. При уменьшении значения формируется направленный
поток.
Фактически, плотность в угловом измерении становится функцией:
Чем меньше угол при том же count, тем выше локальная
плотность потока.
mo.js поддерживает вариативность через диапазоны значений. Это ключевой механизм создания «естественной» плотности.
Пример случайного радиуса:
children: {
radius: { 3: 8 },
duration: { 500: 1200 },
delay: 'stagger(50)'
}
Диапазоны создают неравномерность, которая визуально воспринимается как более высокая сложность распределения.
Использование stagger добавляет временную плотность:
частицы не появляются одновременно, а формируют поток.
Плотность — это не только пространственная характеристика, но и временная.
Параметры:
duration — длительность жизни частицыdelay — задержка появленияstagger() — последовательный запускПример временного сгущения:
const burst = new mojs.Burst({
radius: { 0: 150 },
count: 30,
timeline: { delay: 0 },
children: {
shape: 'circle',
radius: 4,
duration: 800,
delay: 'stagger(10)',
fill: 'orange'
}
});
При уменьшении duration частицы быстрее исчезают,
освобождая пространство и снижая накопленную плотность. При увеличении
задержек возникает эффект волнового распределения.
Одним из наиболее мощных способов управления распределением является
вложение нескольких Burst с разными параметрами.
const burst = new mojs.Burst({
radius: { 0: 120 },
count: 10,
children: {
shape: 'circle',
radius: 6,
fill: 'yellow'
}
});
const innerBurst = new mojs.Burst({
radius: { 0: 60 },
count: 30,
children: {
shape: 'circle',
radius: 3,
fill: 'white'
}
});
Комбинация создаёт неоднородное распределение:
Так формируется визуальная глубина без усложнения геометрии.
Помимо радиальных систем, mo.js позволяет строить линейные потоки, где плотность определяется расстоянием между частицами.
const lineBurst = new mojs.Burst({
radius: { 0: 200 },
angle: 0,
count: 15,
children: {
shape: 'line',
stroke: 'white',
strokeWidth: 3,
radius: { 10: 50 },
angle: { 0: 0 }
}
});
В линейных распределениях плотность зависит от:
Чем меньше расстояние между элементами при фиксированной длине, тем выше визуальная плотность потока.
Плотность может изменяться по радиусу или времени через функции масштабирования.
children: {
radius: (progress) => 5 + 10 * progress,
opacity: { 1: 0 }
}
Функции позволяют задавать нелинейные распределения. Это создаёт эффект:
Такая техника особенно полезна для имитации взрывов, дыма или энергии.
Полная случайность редко используется без ограничений, так как она разрушает читаемость композиции. Поэтому применяется ограниченный рандом:
children: {
x: { -50: 50 },
y: { -50: 50 },
radius: { 2: 6 }
}
Это создаёт равномерное распределение внутри заданного квадрата.
Для кругового распределения используется комбинация угла и радиуса:
children: {
angle: { 0: 360 },
radius: { 20: 100 }
}
Так формируется плотность внутри кольца, а не по окружности.
В сложных сценах плотность определяется не одним burst, а суммой всех активных систем.
Если одновременно работают:
то возникает перекрытие частиц, что увеличивает визуальную насыщенность.
Контроль достигается через:
timelinecountВысокая плотность напрямую влияет на производительность, так как mo.js оперирует DOM-элементами или canvas-слоями в зависимости от конфигурации.
Основные ограничения:
count увеличивает количество узловduration приводит к накоплению частицПрактика управления плотностью включает:
children: {
isShowStart: false,
easing: 'sin.out',
duration: 600
}
Также используется ограничение одновременных анимаций через контроль запуска:
if (!isAnimating) {
burst.replay();
}
Плотность может изменяться в зависимости от внешних параметров: скорости курсора, частоты кликов, или состояния интерфейса.
Пример адаптивного подхода:
document.addEventListener('mousemove', (e) => {
new mojs.Burst({
left: e.pageX,
top: e.pageY,
count: Math.min(10, Math.floor(e.movementX)),
radius: { 0: 50 },
children: {
shape: 'circle',
fill: 'blue'
}
}).play();
});
Здесь плотность напрямую зависит от интенсивности движения.
В продвинутых сценах используются математические модели:
Пример равномерного шага:
const count = 12;
const step = 360 / count;
children: Array.from({ length: count }).map((_, i) => ({
angle: i * step
}));
Такая модель создаёт строгую симметрию и контролируемую плотность без случайности.
Плотность в mo.js воспринимается не математически, а визуально через:
Одинаковое количество частиц может выглядеть по-разному в зависимости от:
radiusopacitydurationПоэтому плотность является многомерным параметром, зависящим от всей
конфигурации анимации, а не от одного значения count.