Animacje za pomocą requestAnimationFrame
Budowanie płynnych animacji canvas z użyciem pętli klatek animacji
Animacje za pomocą requestAnimationFrame to bezpłatna lekcja HTML Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej HTML Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs HTML Academy zawiera 4 lekcji w sumie.
Dlaczego requestAnimationFrame?
requestAnimationFrame (rAF) planuje wywołanie funkcji zwrotnej przed następnym odświeżeniem przeglądarki, synchronizując animację z częstotliwością odświeżania ekranu (zwykle 60 kl./s). W przeciwieństwie do setInterval, rAF wstrzymuje działanie, gdy karta jest ukryta, oszczędzając procesor i baterię.
Podstawowa pętla animacji
Pętla rAF: zdefiniuj funkcję animate, która rysuje bieżącą klatkę, a następnie wywołuje requestAnimationFrame(animate), aby zaplanować następną. Przeglądarka wywołuje animate przed każdym odświeżeniem, tworząc ciągłą animację z częstotliwością odświeżania ekranu.
function animate(timestamp) {
ctx.clearRect(0, 0, canvas.width, canvas.height);
// draw frame at current state
draw(timestamp);
requestAnimationFrame(animate);
}
requestAnimationFrame(animate);Parametr timestamp
rAF przekazuje do funkcji zwrotnej wartość DOMHighResTimeStamp (liczbę milisekund od załadowania strony). Używaj jej do obliczania ruchu niezależnego od częstotliwości klatek: delta = timestamp - lastTimestamp. Pomnóż prędkość przez delta, aby niezależnie od częstotliwości klatek pokonywać tę samą odległość w ciągu sekundy.
Ruch niezależny od częstotliwości klatek
Oblicz czas, który upłynął od poprzedniej klatki, i odpowiednio przeskaluj ruch. Obiekt poruszający się z prędkością 100px/s pokonuje w każdej klatce 100 * (delta / 1000) pikseli. Zapewnia to spójne działanie fizyki na ekranach 30fps i 144fps.
Zatrzymywanie animacji
rAF zwraca uchwyt. Anuluj animację za pomocą cancelAnimationFrame(handle). Przechowuj uchwyt w zmiennej, sprawdzaj flagę running wewnątrz pętli lub anuluj animację podczas czyszczenia komponentu. Zawsze anuluj pętle, gdy element zostaje usunięty z DOM.
Schemat animacji canvas
W każdej klatce: (1) wywołaj clearRect dla całego canvasu, (2) zaktualizuj zmienne stanu (pozycję, kąt, czas), (3) narysuj wszystkie obiekty w nowych pozycjach, (4) wywołaj requestAnimationFrame dla następnej klatki. Nigdy nie pomijaj clearRect — stare klatki będą się wtedy nakładać i utworzą smugę.
Przejścia CSS a rAF
Używaj przejść i animacji CSS do prostych animacji opartych na właściwościach (efekty po najechaniu, wysuwanie modalu). Używaj rAF do złożonych, interaktywnych animacji — pętli gier, symulacji fizyki i renderowania na canvasie — gdy potrzebujesz precyzyjnej kontroli nad każdą klatką.
Podwójne buforowanie na canvasie
W przypadku złożonych scen najpierw rysuj na canvasie poza ekranem, a następnie w ramach jednej operacji narysuj go za pomocą drawImage na widocznym canvasie. Zapobiega to migotaniu, ponieważ nigdy nie jest wyświetlana częściowo narysowana klatka — widoczny canvas jest aktualizowany atomowo w każdej klatce.
Ograniczanie do docelowej liczby klatek
Ogranicz liczbę klatek do niższej wartości (np. 30fps): przed renderowaniem sprawdź, czy od ostatniego rysowania upłynęło wystarczająco dużo czasu. if (timestamp - lastDraw >= 1000/30) { draw(); lastDraw = timestamp; }. Niezależnie od tego planuj kolejne wywołania rAF, aby zachować responsywność.
Debugowanie animacji
Panel Performance w Chrome DevTools rejestruje wywołania rAF na wykresie płomieniowym JavaScriptu. Szukaj długich wywołań, które trwają ponad 16 ms — powodują one gubienie klatek. Używaj miernika FPS (Rendering → FPS Meter), aby obserwować częstotliwość klatek w czasie rzeczywistym podczas interakcji.
Alternatywa: Web Animations API
W przypadku prostszych animacji deklaratywnych, bez ręcznego zarządzania czasem, użyj: element.animate(keyframes, options). WAAPI obsługuje funkcje czasu, tryby wypełnienia i iteracje, przekazując obliczanie klatek przeglądarce. Używaj rAF do niestandardowej logiki renderowania, której nie można wyrazić za pomocą WAAPI.
Sprawdzenie wiedzy
Dlaczego w pętli requestAnimationFrame prędkość animacji należy pomnożyć przez czas delta?
Podsumowanie
requestAnimationFrame synchronizuje animację JavaScriptu z częstotliwością odświeżania ekranu i wstrzymuje ją na ukrytych kartach. Parametr timestamp umożliwia ruch niezależny od częstotliwości klatek dzięki skalowaniu przez czas delta. Schemat pętli animacji canvas (wyczyść, zaktualizuj, narysuj, zaplanuj) w połączeniu z cancelAnimationFrame podczas czyszczenia stanowi podstawę płynnych i wydajnych animacji internetowych.
Często zadawane pytania
Czy lekcja „Animacje za pomocą requestAnimationFrame” jest bezpłatna?
Tak — pełny tekst „Animacje za pomocą requestAnimationFrame” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu HTML Academy, przejdź na CoddyKit PRO. Kurs HTML Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Animacje za pomocą requestAnimationFrame”?
Budowanie płynnych animacji canvas z użyciem pętli klatek animacji Ćwiczysz HTML Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć HTML Academy?
Nie wymagamy żadnego doświadczenia. HTML Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Animacje za pomocą requestAnimationFrame”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji HTML Academy?
Tak. Każda lekcja HTML Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Konfiguracja canvas i kontekstu 2D
- Rysowanie prostokątów i ścieżek
- Tekst i obrazy na canvas
- Animacje za pomocą requestAnimationFrame