Kurs HTML

17.1. Wprowadzenie do Animacji CSS (@keyframes)

Strona główna > Kurs CSS > Rozdział 17: Animacje CSS (@keyframes) > Wprowadzenie do Animacji CSS (@keyframes)

Czym są Animacje CSS?

Animacje CSS pozwalają na tworzenie bardziej złożonych i kontrolowanych sekwencji zmian stylów niż przejścia (transitions). Podczas gdy przejścia animują zmianę właściwości między dwoma stanami (początkowym i końcowym), animacje pozwalają zdefiniować **wiele stanów pośrednich**, zwanych **klatkami kluczowymi (keyframes)**, przez które element ma przejść w trakcie animacji.

Animacje definiuje się za pomocą reguły @keyframes oraz stosuje do elementów za pomocą właściwości z rodziny animation-*.

Podstawowa koncepcja: @keyframes i animation

Tworzenie animacji CSS składa się z dwóch głównych kroków:

  1. Definicja animacji (@keyframes): Tworzymy regułę @keyframes, nadajemy jej unikalną nazwę i definiujemy w niej style dla poszczególnych klatek kluczowych (etapów) animacji. Klatki kluczowe określa się za pomocą procentów (od 0% do 100%) lub słów kluczowych from (odpowiednik 0%) i to (odpowiednik 100%).
  2. Zastosowanie animacji (właściwości animation-*): Do elementu, który ma być animowany, dodajemy właściwości z rodziny animation, aby powiązać go z definicją @keyframes i określić parametry animacji, takie jak czas trwania, liczba powtórzeń, kierunek, opóźnienie itp.

Przykład prostej animacji zmiany koloru:

/* 1. Definicja animacji o nazwie 'zmianaKoloru' */
@keyframes zmianaKoloru {
  from { /* Stan początkowy (0%) */
    background-color: blue;
  }
  to { /* Stan końcowy (100%) */
    background-color: red;
  }
}

/* 2. Zastosowanie animacji do elementu */
.element {
  width: 100px;
  height: 100px;
  /* Powiązanie z @keyframes 'zmianaKoloru' */
  animation-name: zmianaKoloru;
  /* Czas trwania jednego cyklu animacji */
  animation-duration: 2s; 
  /* Można dodać inne właściwości animation-*, np. liczbę powtórzeń */
  animation-iteration-count: infinite; /* Powtarzaj w nieskończoność */
  animation-direction: alternate; /* Zmieniaj kierunek w każdym cyklu */
}

W tym przykładzie tło elementu .element będzie płynnie zmieniać się z niebieskiego na czerwony przez 2 sekundy, a następnie z czerwonego na niebieski (dzięki alternate) i tak w nieskończoność (dzięki infinite).

Animacje vs. Przejścia (Transitions)

Chociaż oba mechanizmy służą do animowania zmian stylów, istnieją kluczowe różnice:

Cecha Przejścia (Transitions) Animacje (@keyframes)
Definicja Właściwości transition-* na elemencie Reguła @keyframes + właściwości animation-* na elemencie
Stany Animują zmianę między dwoma stanami (początkowy i końcowy) Mogą definiować wiele stanów pośrednich (klatek kluczowych)
Wyzwalanie Automatycznie przy zmianie wartości animowanej właściwości (np. przez :hover, JS) Automatycznie po zastosowaniu właściwości animation (mogą startować od razu po załadowaniu strony)
Kontrola powtórzeń Brak wbudowanej kontroli (animacja trwa tylko podczas zmiany stanu) Możliwość ustawienia liczby powtórzeń (animation-iteration-count), w tym nieskończonej
Kontrola kierunku Brak wbudowanej kontroli (zawsze od stanu A do B i z B do A) Możliwość zmiany kierunku (animation-direction: normal, reverse, alternate, alternate-reverse)
Stan wstrzymania Brak wbudowanej kontroli Możliwość wstrzymania i wznowienia animacji (animation-play-state)

Generalnie, **przejścia** są idealne do prostych animacji interakcji (np. efekty hover), podczas gdy **animacje** dają większą kontrolę i nadają się do tworzenia bardziej złożonych, powtarzalnych lub niezależnych od interakcji sekwencji.

FAQ - Najczęściej zadawane pytania

Czy nazwa @keyframes musi być unikalna?

Tak, nazwa zdefiniowana w @keyframes nazwaAnimacji { ... } służy jako identyfikator. Musi być unikalna w obrębie całego arkusza stylów lub importowanych arkuszy. Tej samej nazwy używa się potem we właściwości animation-name.

Czy mogę używać from/to i procentów w tej samej regule @keyframes?

Tak, można mieszać te zapisy. from jest równoważne 0%, a to jest równoważne 100%. Można zdefiniować np. 0%, 50% i to w jednej regule.

Co jeśli nie zdefiniuję stylu dla 0% (from) lub 100% (to)?

Jeśli brakuje definicji dla 0% lub 100%, przeglądarka użyje obliczonych stylów elementu dla tych klatek. Animacja będzie przebiegać od/do normalnego stanu elementu.

Czy animacje CSS są wydajne?

Podobnie jak w przypadku przejść, animowanie właściwości transform i opacity jest zazwyczaj bardzo wydajne i często akcelerowane sprzętowo. Animowanie właściwości wpływających na layout (np. width, height, top, left) może być bardziej kosztowne dla przeglądarki.