В веб-разработке при работе с анимациями и интерактивными элементами
часто возникает необходимость контролировать частоту срабатывания
функций. Это критично, когда события происходят часто, например
scroll, mousemove, resize, или
пользователь быстро нажимает кнопки. Без контроля каждая активация
события может запускать анимацию, перегружая браузер и снижая
производительность. Две основные техники для управления частотой вызовов
— throttling и debouncing.
Throttling ограничивает количество вызовов функции в единицу времени. Функция будет выполняться не чаще, чем заданный интервал, независимо от того, сколько событий произошло. Это особенно полезно для событий, происходящих очень часто, таких как прокрутка страницы.
function throttle(fn, limit) {
let lastCall = 0;
return function(...args) {
const now = Date.now();
if (now - lastCall >= limit) {
lastCall = now;
fn.apply(this, args);
}
};
}
Применение в anime.js:
const box = document.querySelector('.box');
window.addEventListener('scroll', throttle(() => {
anime({
targets: box,
translateY: window.scrollY,
duration: 500,
easing: 'easeOutQuad'
});
}, 100));
В этом примере анимация translateY будет обновляться не
чаще одного раза каждые 100 миллисекунд, несмотря на постоянное движение
скролла.
Ключевые моменты throttling:
Debouncing откладывает выполнение функции до момента, когда поток событий прекращается на определённое время. Это идеально подходит для событий, где имеет смысл реагировать только после того, как пользователь закончил действие, например, ввод в поле поиска.
function debounce(fn, delay) {
let timer;
return function(...args) {
clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(this, args);
}, delay);
};
}
Пример использования с anime.js:
const input = document.querySelector('#search-box');
const results = document.querySelector('.results');
input.addEventListener('input', debounce(() => {
anime({
targets: results,
opacity: [0, 1],
translateY: [-20, 0],
duration: 300,
easing: 'easeOutCubic'
});
}, 300));
В этом примере анимация срабатывает только после того, как пользователь перестал печатать на 300 миллисекунд, предотвращая множественные анимации при каждом символе.
Ключевые моменты debouncing:
| Характеристика | Throttling | Debouncing |
|---|---|---|
| Частота срабатываний | Регулярная, через фиксированный интервал | Только после окончания активности |
| Применение | События scroll, resize, mousemove | Поиск, autocomplete, ввод текста |
| Поведение при длительной активности | Функция выполняется периодически | Функция срабатывает один раз после остановки активности |
| Загрузка браузера | Контролируемая | Минимальная, но задержка |
limit
для throttling или delay для debouncing зависит от
конкретной анимации: слишком короткий интервал может перегрузить
браузер, слишком длинный — сделать анимацию заметно запаздывающей.duration анимации: если период throttling меньше
длительности анимации, возможны пересечения и дергания.const items = document.querySelectorAll('.item');
function animateItems() {
items.forEach((el, index) => {
anime({
targets: el,
opacity: [0, 1],
translateY: [20, 0],
delay: index * 100,
duration: 400,
easing: 'easeOutSine'
});
});
}
window.addEventListener('scroll', throttle(animateItems, 200));
В этом сценарии каждый элемент анимируется с задержкой, а запуск анимации контролируется через throttling, что обеспечивает стабильность производительности на длинной странице с множеством элементов.
Throttling и debouncing становятся неотъемлемыми инструментами при разработке интерактивных анимаций с anime.js, позволяя сохранить плавность движения и стабильность производительности даже при высокой частоте событий.