0Pricing
HTML Academy · Урок

Анимация с помощью 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 — локальная установка не требуется.

Все уроки этого курса

  1. Настройка canvas и двумерного контекста
  2. Рисование прямоугольников и контуров
  3. Текст и изображения на canvas
  4. Анимация с помощью requestAnimationFrame
← Назад к HTML Academy