Menu

Animacje CSS: @keyframes, właściwości i przykłady

Animacje CSS prowadzą element przez kroki zdefiniowane w @keyframes, samodzielnie i tyle razy, ile chcesz. Poznaj składnię @keyframes, wszystkie osiem właściwości animation, fill-mode i direction, wskaźniki ładowania, pauzowanie i szacunek dla ograniczonego ruchu.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

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); }
}
  • from oznacza to samo co 0%, a to to samo co 100%.
  • 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 do animation-name. Wielkość liter ma znaczenie, a nazwa nie może być słowem kluczowym, takim jak none.

Właściwości animacji

WłaściwośćCo ustawiaDomyślnie
animation-namektóre @keyframes uruchomićnone
animation-durationdługość jednego cyklu0s
animation-timing-functionkrzywa prędkości między klatkami kluczowymiease
animation-delayczas oczekiwania przed pierwszym cyklem (wartość ujemna zaczyna w trakcie)0s
animation-iteration-countliczba cykli albo infinite1
animation-directionnormal, reverse, alternate, alternate-reversenormal
animation-fill-modestyle przed i po: none, forwards, backwards, bothnone
animation-play-staterunning albo pausedrunning

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. Przy normal to x = 200 i kolor zielony; przy reverse kończy na x = 0 i w kolorze niebieskim, bo ostatnią odtworzoną klatką było from.
  • alternate z liczbą 2 idzie tam i z powrotem, więc nawet z forwards koń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:

  1. 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; }
}
  1. 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 to 0s.
  • Niepasująca nazwa. animation-name musi dokładnie odpowiadać nazwie w @keyframes, łącznie z wielkością liter.
  • Powrót na końcu. Dodaj forwards (albo both), żeby zachować ostatnią klatkę kluczową.
  • Mignięcie przed startem opóźnionej animacji. W czasie animation-delay element pokazuje swoje zwykłe style. backwards (albo both) stosuje pierwszą klatkę kluczową w czasie opóźnienia.
  • Restart animacji przez ustawienie tej samej wartości. Ponowne ustawienie tego samego animation nic 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 animuj opacity i transform.

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.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ