Hack Frontend Community

requestAnimationFrame и requestIdleCallback в JavaScript

requestAnimationFrame

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

Синтаксис requestAnimationFrame

const id = requestAnimationFrame(callback);

Пример requestAnimationFrame

function animate(time) {
  // обновляем состояние или перемещаем элемент
  box.style.transform = `translateX(${time / 10}px)`;
  requestAnimationFrame(animate); // продолжаем цикл
}

requestAnimationFrame(animate);

Преимущества:

  • Синхронизирован с частотой обновления экрана (обычно 60 FPS).
  • Браузер может оптимизировать производительность, пропуская кадры, если вкладка не активна.
  • Лучше, чем setInterval / setTimeout для анимации.

requestIdleCallback

requestIdleCallback — это метод, который позволяет выполнять задачи, когда браузер "свободен" — в периоды простоя.

Подходит для задач, не критичных к времени выполнения: фоновая аналитика, неважный рендеринг, работа с localStorage и т. д.

Синтаксис requestIdleCallback

const id = requestIdleCallback(callback, { timeout: 1000 });

Пример requestIdleCallback

requestIdleCallback((deadline) => {
  while (deadline.timeRemaining() > 0 && tasks.length > 0) {
    doTask(tasks.shift());
  }
});

Аргумент deadline

  • deadline.timeRemaining() — сколько миллисекунд осталось до перерисовки.
  • deadline.didTimeout — флаг, если сработал timeout.

Важно:

requestIdleCallback не поддерживается во всех браузерах (например, Safari), поэтому стоит использовать полифил или fallback на setTimeout.

Когда использовать

  • requestAnimationFrame — при создании анимаций, прогресс-баров, слайдеров, канваса.
  • requestIdleCallback — для неприоритетных задач: загрузка вторичных скриптов, аналитика, синхронизация с бэкендом.