Анимация с помощью requestAnimationFrame
Создавайте плавные анимации canvas с помощью цикла кадров анимации
«Анимация с помощью requestAnimationFrame» — бесплатный урок HTML Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения HTML Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс HTML Academy содержит 4 уроков всего.
Зачем нужен requestAnimationFrame?
requestAnimationFrame (rAF) планирует обратный вызов перед следующим перерисовыванием браузера, синхронизируя анимацию с частотой обновления экрана (обычно 60 FPS). В отличие от setInterval, rAF приостанавливается, когда вкладка скрыта, экономя ресурсы CPU и заряд батареи.
Базовый цикл анимации
Цикл rAF: определите функцию animate, которая рисует текущий кадр, а затем вызывает requestAnimationFrame(animate), чтобы запланировать следующий. Браузер вызывает animate перед каждым перерисовыванием, создавая непрерывную анимацию с частотой кадров экрана.
function animate(timestamp) {
ctx.clearRect(0, 0, canvas.width, canvas.height);
// draw frame at current state
draw(timestamp);
requestAnimationFrame(animate);
}
requestAnimationFrame(animate);Параметр временной метки
rAF передаёт в обратный вызов временную метку высокой точности DOM (миллисекунды с момента загрузки страницы). Используйте её для вычисления движения, независимого от частоты кадров: delta = timestamp - lastTimestamp. Умножайте скорость на delta, чтобы объект проходил одинаковое расстояние в секунду независимо от частоты кадров.
Движение, независимое от частоты кадров
Вычисляйте время, прошедшее с последнего кадра, и соответственно масштабируйте перемещение. Объект, движущийся со скоростью 100 пикселей в секунду, проходит 100 * (delta / 1000) пикселей за кадр. Это обеспечивает одинаковую физику на экранах с частотой 30 FPS и 144 FPS.
Остановка анимации
rAF возвращает дескриптор. Отмените его с помощью cancelAnimationFrame(handle). Сохраните дескриптор в переменной, проверяйте флаг выполнения внутри цикла или отменяйте анимацию при очистке компонента. Всегда отменяйте циклы, когда элемент удаляется из DOM.
Шаблон анимации холста
На каждом кадре: (1) очистите весь холст с помощью clearRect, (2) обновите переменные состояния (позицию, угол, время), (3) нарисуйте все объекты в новых позициях, (4) вызовите requestAnimationFrame для следующего кадра. Никогда не пропускайте clearRect — старые кадры будут накапливаться в виде шлейфа.
CSS-переходы и rAF
Используйте CSS-переходы и анимации для простых анимаций на основе свойств (эффекты при наведении, выезжающие модальные окна). Применяйте rAF для сложных интерактивных анимаций — игровых циклов, физических симуляций и отрисовки на холсте, — когда нужен детальный контроль над каждым кадром.
Двойная буферизация на холсте
Для сложных сцен сначала рисуйте на холсте вне экрана, а затем одной операцией переносите его с помощью drawImage на видимый холст. Это предотвращает мерцание: частично нарисованный кадр никогда не отображается, и видимый холст обновляется атомарно на каждом кадре.
Ограничение до целевой частоты кадров
Ограничьте частоту кадров меньшим значением (например, 30 FPS): перед отрисовкой проверяйте, прошло ли достаточно времени с последнего рисования. if (timestamp - lastDraw >= 1000/30) { draw(); lastDraw = timestamp; }. Планируйте rAF в любом случае, чтобы сохранять отзывчивость.
Отладка анимации
Панель производительности Chrome DevTools записывает обратные вызовы rAF на пламенной диаграмме JS. Ищите длинные обратные вызовы, превышающие 16 мс: они приводят к пропуску кадров. Используйте счётчик FPS (Визуализация → Счётчик FPS), чтобы наблюдать частоту кадров в реальном времени во время взаимодействия.
Альтернатива для веб-анимаций
Для более простых декларативных анимаций без ручного управления временем используйте: element.animate(keyframes, options). WAAPI обрабатывает функции синхронизации, режимы заполнения и повторы, передавая вычисление кадров браузеру. Используйте rAF для пользовательской логики отрисовки, которую WAAPI не может выразить.
Проверка знаний
Почему скорость анимации нужно умножать на время delta в цикле requestAnimationFrame?
Итоги
requestAnimationFrame синхронизирует анимацию JavaScript с частотой обновления экрана и приостанавливается для скрытых вкладок. Параметр временной метки обеспечивает движение, независимое от частоты кадров, благодаря масштабированию по времени delta. Шаблон цикла анимации холста (очистить, обновить, нарисовать, запланировать) в сочетании с cancelAnimationFrame для очистки служит основой плавных и эффективных веб-анимаций.
Часто задаваемые вопросы
Урок «Анимация с помощью requestAnimationFrame» бесплатный?
Да — полный текст урока «Анимация с помощью requestAnimationFrame» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс HTML Academy, подпишись на CoddyKit PRO. Курс HTML Academy содержит 4 уроков всего.
Чему я научусь в уроке «Анимация с помощью requestAnimationFrame»?
Создавайте плавные анимации canvas с помощью цикла кадров анимации Ты практикуешь HTML Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать HTML Academy?
Предыдущий опыт не требуется. HTML Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Анимация с помощью requestAnimationFrame»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке HTML Academy?
Да. Каждый урок HTML Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Настройка canvas и двумерного контекста
- Рисование прямоугольников и контуров
- Текст и изображения на canvas
- Анимация с помощью requestAnimationFrame