В anime.js анимации создаются с помощью объектов и таймеров, которые остаются активными в памяти до завершения анимации или явного их удаления. Понимание того, как правильно управлять этими объектами, позволяет избежать утечек памяти и повышает производительность приложения.
Каждая анимация в anime.js создаётся функцией anime() и
возвращает анимационный объект. Этот объект содержит
ключевые свойства:
paused — состояние паузы анимации.completed — флаг завершения.currentTime — текущее время анимации.play(), pause(),
restart(), seek(), remove().Важно: объекты анимации продолжают удерживаться в памяти, если на них существуют ссылки. После завершения анимации ссылки на объект должны быть удалены, иначе они будут препятствовать сборке мусора.
let animation = anime({
targets: '.box',
translateX: 250,
duration: 1000
});
// После завершения анимации
animation = null; // позволяет сборщику мусора освободить память
Для остановки анимации и предотвращения утечек памяти используется
метод remove(). Он удаляет все анимационные эффекты с
указанных элементов и очищает внутренние таймеры:
anime.remove('.box'); // остановит все анимации на элементах с классом 'box'
Если анимации создаются динамически, важно вызывать
remove() перед удалением DOM-элементов:
let dynamicBox = document.createElement('div');
document.body.appendChild(dynamicBox);
let animation = anime({
targets: dynamicBox,
translateY: 300,
duration: 2000
});
// Перед удалением элемента из DOM
anime.remove(dynamicBox);
dynamicBox.remove();
Анимации с loop: true или
direction: 'alternate' создают непрерывные циклы, которые
могут удерживать ссылки на DOM и внутренние объекты. Если необходимо
остановить такую анимацию:
let loopAnimation = anime({
targets: '.circle',
translateX: 200,
loop: true,
duration: 1500
});
// Остановить цикл и очистить память
loopAnimation.pause();
loopAnimation = null;
При анимации динамически создаваемых элементов, следует следить за тем, чтобы ссылки на элементы не удерживались в глобальных массивах или замыканиях:
const elements = [];
for (let i = 0; i < 100; i++) {
let el = document.createElement('div');
document.body.appendChild(el);
elements.push(el);
anime({
targets: el,
opacity: [0, 1],
duration: 500
});
}
// Очистка ссылок
elements.forEach(el => anime.remove(el));
elements.length = 0;
Anime.js позволяет использовать колбэки begin,
update, complete. Необходимо избегать
удержания больших структур данных внутри колбэков, так как они сохраняют
ссылки до завершения анимации:
anime({
targets: '.box',
translateX: 300,
duration: 1000,
complete: function(anim) {
// Ссылка на anim может быть удалена после завершения
anim = null;
}
});
finished PromiseСвойство finished возвращает промис, который разрешается
после завершения анимации. После завершения промис можно использовать
для очистки ресурсов:
let anim = anime({
targets: '.box',
translateX: 400,
duration: 1000
});
anim.finished.then(() => {
anime.remove('.box');
anim = null;
});
remove() для динамических элементов
перед удалением из DOM.loop: true) при смене
сцены или компонента.finished для безопасной очистки
памяти после завершения анимаций.Правильное управление памятью в anime.js предотвращает утечки, повышает производительность и делает приложение устойчивым к длительной работе с большим количеством анимаций.