Этот вопрос проверяет понимание роли requestAnimationFrame в оптимизации анимаций и предотвращении проблем с производительностью и визуальными артефактами.
requestAnimationFrame (rAF) — это API браузера, который позволяет планировать выполнение функции перед следующей перерисовкой (repaint) экрана. Его основная цель — синхронизировать выполнение анимационного кода с частотой обновления дисплея устройства (обычно 60 Гц, т.е. 60 кадров в секунду).
Если использовать обычный setInterval или рекурсивный setTimeout для цикла анимации, возникает несколько проблем:
Вот простой пример анимации движения элемента. Сначала — проблемная версия с setInterval:
// ПЛОХО: использование setInterval
const element = document.getElementById('box');
let pos = 0;
const intervalId = setInterval(() => {
pos += 5;
element.style.left = pos + 'px';
if (pos > 500) clearInterval(intervalId);
}, 16); // ~60 кадров/сек (1000/16)А теперь правильная версия с requestAnimationFrame:
// ХОРОШО: использование requestAnimationFrame
const element = document.getElementById('box');
let pos = 0;
function animate() {
pos += 5;
element.style.left = pos + 'px';
if (pos < 500) {
requestAnimationFrame(animate);
}
}
requestAnimationFrame(animate);Этот API используется не только для перемещения DOM-элементов. Он критически важен для:
Браузер автоматически оптимизирует вызовы rAF: приостанавливает их в неактивных вкладках, синхронизирует с VSync и объединяет несколько изменений DOM в одну перерисовку.
Вывод: Всегда используйте requestAnimationFrame для любых визуальных обновлений, которые должны происходить плавно и синхронно с частотой обновления экрана. Это обеспечивает оптимальную производительность, экономию энергии и предотвращает визуальные артефакты. Таймеры (setInterval/setTimeout) подходят только для задач, не связанных с рендерингом.