Механизм случайных значений в библиотеке mo.js реализован через
специальный инструмент Rand, который позволяет задавать
диапазоны, распределения и динамически изменяющиеся параметры анимации.
Это ключевой элемент при создании «живых», органичных эффектов, где
отсутствует строгая повторяемость.
В отличие от статических значений, Rand обеспечивает
вариативность: каждое воспроизведение анимации может выглядеть немного
иначе, что особенно важно для эффектов частиц, всплесков, взрывов и
природных движений.
В mo.js случайные значения задаются строкой с использованием конструкции:
'rand(min, max)'
Пример:
radius: 'rand(10, 50)'
Это означает, что при каждом запуске анимации радиус будет случайным числом в диапазоне от 10 до 50.
Rand можно применять практически к любым числовым параметрам:
x: 'rand(-100, 100)',
y: 'rand(-50, 50)',
radius: 'rand(20, 80)'
fill: ['red', 'rand(blue, green)'] // чаще комбинируется с массивами
angle: 'rand(0, 360)'
duration: 'rand(300, 1000)'
mo.js поддерживает комбинирование случайностей:
radius: {
0: 'rand(10, 20)',
100: 'rand(50, 100)'
}
В этом случае:
Каждый элемент анимации получает собственную траекторию.
Часто используется совместно с массивами для создания сложных вариаций:
scale: [1, 'rand(1.5, 3)']
или
fill: ['#ff0000', '#00ff00', '#0000ff']
radius: ['rand(10, 20)', 'rand(30, 60)']
При работе с stagger (например, в
mojs.Burst) Rand усиливает эффект распределения:
children: {
radius: 'rand(5, 20)',
delay: 'stagger(0, rand(10, 50))'
}
Каждый элемент:
По умолчанию Rand вычисляется один раз. Чтобы добиться
изменения значений при каждом запуске:
repeat: 3,
radius: 'rand(10, 50)'
Однако значение всё равно фиксируется на цикл.
На практике для полной случайности создаётся новый экземпляр:
const createAnimation = () => new mojs.Shape({
radius: 'rand(10, 50)'
});
Для более сложной логики допускается использование функций:
radius: () => Math.random() * 40 + 10
Преимущества:
Стандартный rand(min, max) использует равномерное
распределение. Для более реалистичных эффектов:
radius: () => Math.pow(Math.random(), 2) * 50
radius: () => Math.random() * Math.random() * 50
radius: () => 50 - Math.random() * Math.random() * 50
new mojs.Burst({
count: 10,
children: {
radius: 'rand(5, 15)',
angle: 'rand(0, 360)',
duration: 'rand(300, 800)',
delay: 'rand(0, 200)'
}
});
Результат:
Использование случайных значений:
Рекомендации:
Randradius: {
0: 'rand(10, 20)',
100: 'rand(50, 100)',
easing: 'quad.out'
}
x: [0, 'rand(-200, 200)'],
y: [0, 'rand(-200, 200)']
x: () => (Math.random() - 0.5) * 100
| Подход | Преимущества | Недостатки |
|---|---|---|
rand() |
Простота, встроенность | Ограниченная гибкость |
Math.random() |
Полный контроль | Более многословный код |
Rand выполняет роль:
Без него большинство эффектов выглядели бы повторяющимися и искусственными.
x: 'rand(-1000, 1000)'
Приводит к хаотичности и потере визуального контроля.
Слишком широкий диапазон делает анимацию нечитабельной.
Случайность должна быть подчинена общей логике движения.
Для более управляемых эффектов:
RandПример:
radius: ['rand(10, 20)', 'rand(30, 40)']
Rand особенно эффективен в цепочках анимаций:
const timeline = new mojs.Timeline();
for (let i = 0; i < 5; i++) {
timeline.add(new mojs.Shape({
x: 'rand(-100, 100)',
delay: i * 100
}));
}
Создаётся ощущение естественного распределения событий.
Rand — это не просто генератор случайных чисел, а инструмент формирования визуального разнообразия. Его грамотное использование позволяет создавать анимации, приближенные к естественным процессам, избегая повторяемости и шаблонности.