Проверяет понимание механизмов планирования анимаций в браузере и умение выбирать правильный инструмент для плавной отрисовки кадров.
Браузер отрисовывает страницу кадрами, обычно синхронизируясь с частотой монитора (60 Гц, 120 Гц и т.д.). Чтобы анимация выглядела плавно, изменения стилей должны происходить ровно перед очередным кадром. requestAnimationFrame (rAF) как раз для этого и создан: браузер сам вызывает переданный колбэк перед следующим перерисовыванием, передавая в него метку времени.
timestamp, что позволяет считать дельту времени и делать анимацию независимой от FPS.Date.now(), что даёт менее точную дельту.const box = document.getElementById('box');
let start = null;
function step(ts) {
if (!start) start = ts;
const progress = (ts - start) / 1000; // секунды
box.style.transform = `translateX(${progress * 100}px)`;
if (progress < 3) requestAnimationFrame(step);
}
requestAnimationFrame(step);
// Антипример с setTimeout:
// setInterval(() => { x += 2; box.style.left = x + 'px'; }, 16);
// При 60 Гц это даст рывки и лишние перерисовки.
rAF также удобно использовать для отмены анимации через cancelAnimationFrame(id) и для синхронизации нескольких независимых анимаций в одном кадре.
Итог: для любой визуальной анимации в браузере применяйте requestAnimationFrame — он даёт плавность, экономит ресурсы и корректно работает с частотой экрана. setTimeout уместен только для логики, не связанной с рендерингом.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию