Animacja CSS w jednym przykładzie
Animacja składa się z dwóch części: @keyframes, które opisuje kroki, oraz właściwości animation, która przypisuje je do elementu z określonym czasem trwania. Ta karta wsuwa się i pojawia po załadowaniu strony:
Zmień kod (albo ustaw czas trwania na 2s), a podgląd się przeładuje i znów zobaczysz, jak karta się pojawia. Blok @media (prefers-reduced-motion: reduce) zastępuje klatki kluczowe samym przenikaniem u osób, które mają w systemie włączone ograniczenie ruchu.
Składnia @keyframes
@keyframes pulse {
0% { transform: scale(1); }
50% { transform: scale(1.08); }
100% { transform: scale(1); }
}
fromoznacza to samo co0%, atoto samo co100%.- Dodaj tyle kroków procentowych, ile potrzebujesz. Kroki z tymi samymi stylami mogą dzielić jedną linię:
0%, 100% { ... }. - Właściwość, której brakuje w pierwszej lub ostatniej klatce kluczowej, jest animowana od albo do własnej wartości elementu.
- Nazwę (
pulse) przekazujesz doanimation-name. Wielkość liter ma znaczenie, a nazwa nie może być słowem kluczowym, takim jaknone.
Właściwości animacji
| Właściwość | Co ustawia | Domyślnie |
|---|---|---|
animation-name | które @keyframes uruchomić | none |
animation-duration | długość jednego cyklu | 0s |
animation-timing-function | krzywa prędkości między klatkami kluczowymi | ease |
animation-delay | czas oczekiwania przed pierwszym cyklem (wartość ujemna zaczyna w trakcie) | 0s |
animation-iteration-count | liczba cykli albo infinite | 1 |
animation-direction | normal, reverse, alternate, alternate-reverse | normal |
animation-fill-mode | style przed i po: none, forwards, backwards, both | none |
animation-play-state | running albo paused | running |
Zapis skrócony przyjmuje je w niemal dowolnej kolejności. Jedyna zasada: pierwsza wartość czasu to czas trwania, a druga to opóźnienie:
.loader {
animation: pulse 1.2s ease-in-out 0.2s infinite alternate both;
/* name duration timing delay count direction fill */
}
direction i fill-mode na żywo
Wybierz kierunek, tryb wypełnienia i liczbę powtórzeń, a potem naciśnij Play. Kwadrat przesuwa się o 200px na koniec toru. Komunikat pokazuje, gdzie się zatrzymał po zakończeniu animacji:
Na co zwrócić uwagę:
fill-mode: none(domyślnie): po ostatniej klatce kwadrat wraca do x = 0 i znów robi się bursztynowy.forwards: zostaje na ostatniej klatce kluczowej. Przynormalto x = 200 i kolor zielony; przyreversekończy na x = 0 i w kolorze niebieskim, bo ostatnią odtworzoną klatką byłofrom.alternatez liczbą 2 idzie tam i z powrotem, więc nawet zforwardskończy na x = 0.
Nieskończone pętle: wskaźnik ładowania
infinite powtarza animację bez końca, a animation-delay na każdym dziecku przesuwa je w czasie, więc ruszają się po kolei. Pętle powinny być spokojne: powolne, niewielkie, bez migania.
role="status" razem z aria-label informuje użytkowników czytników ekranu, że coś się ładuje, czego same kropki nie mówią. Obracające się kółko znajdziesz na stronie o rotate.
Pauzowanie i sterowanie animacjami
animation-play-state: paused zatrzymuje animację w miejscu, a running wznawia ją od tego punktu. Najedź kursorem na pasek poniżej, żeby go zatrzymać:
W JavaScripcie element.getAnimations() zwraca działające animacje CSS, a każda ma pause(), play(), cancel() i currentTime, które możesz odczytać albo ustawić. Zdarzenie animationend zachodzi, gdy kończy się animacja, która nie jest nieskończona, a animationiteration na końcu każdego cyklu.
Szanuj ograniczony ruch i nigdy nie migaj
Dwie zasady dostępności dotyczą każdej animacji:
- Ograniczony ruch. Użytkownicy mogą poprosić system o mniej ruchu, bo ruch na ekranie źle na nich wpływa. Najbezpieczniej dodawać ruch tylko wtedy, gdy nie prosili o jego ograniczenie:
@media (prefers-reduced-motion: no-preference) {
.hero-title { animation: slide-in 0.8s ease-out both; }
}
- Bez migania. Treść, która miga więcej niż trzy razy na sekundę, może wywołać napad padaczkowy. Całkowicie unikaj szybkiego, kontrastowego migania.
Płynne animacje
Animuj transform i opacity, kiedy tylko możesz. Przeglądarka stosuje je bez ponownego układania strony, więc pozostają płynne nawet na słabych telefonach. Animowanie width, height, top, left albo margin przelicza układ w każdej klatce. Do przesuwania elementu użyj translate() ze strony o transform.
Częste błędy
- Brak czasu trwania.
animation: fade;nic nie robi, bo domyślny czas trwania to0s. - Niepasująca nazwa.
animation-namemusi dokładnie odpowiadać nazwie w@keyframes, łącznie z wielkością liter. - Powrót na końcu. Dodaj
forwards(alboboth), żeby zachować ostatnią klatkę kluczową. - Mignięcie przed startem opóźnionej animacji. W czasie
animation-delayelement pokazuje swoje zwykłe style.backwards(alboboth) stosuje pierwszą klatkę kluczową w czasie opóźnienia. - Restart animacji przez ustawienie tej samej wartości. Ponowne ustawienie tego samego
animationnic nie daje. Usuń ją, wymuś ponowne przeliczenie układu (el.offsetWidth) i ustaw ją znowu, tak jak robi to przycisk Play powyżej. - Animowanie
display. Ta właściwość przełącza się od razu. Zamiast niej animujopacityitransform.
Najczęściej zadawane pytania
Jak zrobić animację w CSS?
Zdefiniuj kroki za pomocą @keyframes name { from { ... } to { ... } }, a potem przypisz ją do elementu właściwością animation z czasem trwania: animation: name 1s ease-out;. Czas trwania jest wymagany, bo domyślnie wynosi 0s.
Co robi animation-fill-mode: forwards?
Zachowuje style ostatniej klatki kluczowej po zakończeniu animacji. Bez tego element od razu wraca do swoich zwykłych stylów. backwards stosuje pierwszą klatkę kluczową w czasie opóźnienia, a both robi jedno i drugie.
Jak zapętlić animację CSS w nieskończoność?
Ustaw animation-iteration-count: infinite albo dodaj infinite do skróconego zapisu: animation: spin 1s linear infinite;. Dodaj alternate, żeby w każdym cyklu animacja szła do przodu, a potem do tyłu.
Czym różni się animation od transition w CSS?
Transition animuje właściwość między dwiema wartościami, gdy ta się zmienia, zwykle przy najechaniu kursorem albo zmianie klasy. Animation uruchamia się sama zaraz po przypisaniu, może mieć dowolną liczbę klatek kluczowych i może się powtarzać, odwracać i zatrzymywać.
Jak zatrzymać animację CSS?
Ustaw na elemencie animation-play-state: paused, na przykład w :hover albo przez klasę dodaną w JavaScripcie. Ustawienie z powrotem running wznawia ją od miejsca, w którym stanęła.
Jak wyłączyć animacje dla osób, które wolą ograniczony ruch?
Umieść animację w @media (prefers-reduced-motion: no-preference) { ... } albo usuń ją wewnątrz @media (prefers-reduced-motion: reduce) { ... }. To zapytanie odczytuje ustawienie ograniczenia ruchu w systemie operacyjnym użytkownika.