requestAnimationFrame
— это метод, позволяющий планировать выполнение функции непосредственно перед тем, как браузер произведёт перерисовку экрана. Он оптимизирован для работы с анимацией и визуализацией, так как синхронизируется с частотой обновления монитора (обычно 60 кадров в секунду), обеспечивая максимально плавное отображение изменений.
Как работает requestAnimationFrame
?
Когда вы вызываете requestAnimationFrame(callback)
, браузер добавляет вашу функцию callback
в очередь вызовов, которая будет выполнена прямо перед следующей перерисовкой экрана. Таким образом, ваша функция вызывается синхронно с циклом рендеринга браузера, что обеспечивает высокую производительность и плавность анимации.
Пример использования requestAnimationFrame
Рассмотрим простой пример анимации движения квадрата по экрану:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Request Animation Frame Example</title> <style> #square { width: 50px; height: 50px; background-color: red; position: absolute; top: 100px; left: 100px; } </style> </head> <body> <div id="square"></div> <script> const square = document.querySelector('#square'); let posX = 100; let speed = 1; function moveSquare() { posX += speed; square.style.left = `${posX}px`; if (posX >= window.innerWidth - 50 || posX <= 0) { speed *= -1; // Изменяем направление движения } requestAnimationFrame(moveSquare); } requestAnimationFrame(moveSquare); </script> </body> </html>
Пояснение:
- HTML: Создаем div-элемент с идентификатором
#square
, который будет нашим квадратом. - CSS: Определяем стиль для квадрата, устанавливаем его размеры и положение.
- JavaScript:
- Переменная
posX
хранит текущую позицию квадрата по оси X. - Переменная
speed
определяет скорость перемещения квадрата. - Функция
moveSquare
обновляет позицию квадрата, изменяя его координатуleft
на величинуspeed
. Затем проверяется, достиг ли квадрат границы окна, и если да, то меняется направление движения. - Внутри функции
moveSquare
вызываетсяrequestAnimationFrame(moveSquare)
для того, чтобы снова запланировать выполнение этой же функции перед следующим кадром. - Первый вызов
requestAnimationFrame(moveSquare)
запускает цикл анимации.
- Переменная
Преимущества requestAnimationFrame
:
- Оптимизация производительности: Функция синхронизирована с частотой обновления экрана, что предотвращает избыточные перерисовки и экономит ресурсы процессора.
- Плавность анимации: Так как частота вызова функции зависит от частоты обновления экрана, анимация выглядит плавно и стабильно.
- Энергосбережение: Когда вкладка неактивна или скрыта, браузер автоматически приостанавливает вызовы
requestAnimationFrame
, что снижает нагрузку на процессор и продлевает срок службы батареи мобильных устройств.
Заключение
requestAnimationFrame
— мощный инструмент для создания плавных и эффективных анимаций в браузере. Его правильное использование поможет вам создать визуально привлекательные веб-приложения с высокой производительностью.