Ответ
requestAnimationFrame и setTimeout работают в разных частях цикла событий:
- requestAnimationFrame:
- Вызывается перед ререндерингом страницы (в фазе
BeforePaint). - Оптимизирован для анимаций, синхронизируется с частотой обновления экрана (обычно 60fps).
- Браузер может объединять вызовы или пропускать кадры для оптимизации.
- Вызывается перед ререндерингом страницы (в фазе
function animate() {
element.style.left = `${pos++}px`;
requestAnimationFrame(animate);
}
requestAnimationFrame(animate);
- setTimeout:
- Попадает в общую очередь макрозадач.
- Нет гарантии точного времени выполнения (может задерживаться из-за других задач).
- Минимальная задержка ≈4мс в современных браузерах.
function move() {
element.style.left = `${pos++}px`;
setTimeout(move, 16); // ~60fps
}
setTimeout(move, 16);
Ключевое отличие: rAF - для визуальных изменений, setTimeout - для общего отложенного кода. Браузер может приостановить rAF при скрытой вкладке.