Kurs HTML

17.7. Właściwość animation-fill-mode

Strona główna > Kurs CSS > Rozdział 17: Animacje CSS (@keyframes) > Właściwość animation-fill-mode

Do czego służy animation-fill-mode?

Właściwość animation-fill-mode określa, **jakie style są stosowane do elementu, gdy animacja nie jest aktywna**, czyli przed jej rozpoczęciem (podczas opóźnienia animation-delay) oraz po jej zakończeniu (jeśli nie jest zapętlona).

Domyślnie element zachowuje swoje normalne style poza czasem trwania animacji. animation-fill-mode pozwala to zmienić, np. utrzymać style z ostatniej klatki kluczowej po zakończeniu animacji.

Składnia i wartości

Właściwość animation-fill-mode przyjmuje jedną lub więcej wartości, oddzielonych przecinkami, odpowiadających kolejnym animacjom zdefiniowanym w animation-name.

animation-fill-mode: none | forwards | backwards | both [, ...];
  • none (wartość domyślna): Animacja nie stosuje żadnych stylów do elementu, gdy nie jest aktywna. Element ma swoje normalne style przed startem i wraca do nich po zakończeniu.
  • forwards: Po zakończeniu ostatniego cyklu animacji element **zachowuje style zdefiniowane w ostatniej klatce kluczowej** (100% lub to, lub ostatniej klatce osiągniętej, jeśli animacja zakończyła się wcześniej). Kierunek (animation-direction) wpływa na to, która klatka jest uznawana za ostatnią (np. przy reverse będzie to 0%).
  • backwards: Podczas opóźnienia (animation-delay) element **przyjmuje style zdefiniowane w pierwszej klatce kluczowej** (0% lub from, lub pierwszej relevantnej klatki w zależności od animation-direction). Po zakończeniu animacji element wraca do swoich normalnych stylów (chyba że użyto również forwards).
  • both: Łączy efekty forwards i backwards. Element przyjmuje style z pierwszej klatki podczas opóźnienia i zachowuje style z ostatniej klatki po zakończeniu animacji.

Wartość domyślna: none.

Przykład:

@keyframes zmiana {
  from { opacity: 0; background-color: blue; }
  to { opacity: 1; background-color: red; }
}

.element {
  opacity: 0.5; /* Normalny styl */
  background-color: green; /* Normalny styl */
  animation-name: zmiana;
  animation-duration: 2s;
  animation-delay: 1s;
}

.element-none { /* Domyślnie */
  /* Przed 1s: opacity: 0.5, green */
  /* Od 1s do 3s: animacja od blue do red */
  /* Po 3s: opacity: 0.5, green */
  animation-fill-mode: none;
}

.element-forwards {
  /* Przed 1s: opacity: 0.5, green */
  /* Od 1s do 3s: animacja od blue do red */
  /* Po 3s: opacity: 1, red (styl z 'to') */
  animation-fill-mode: forwards;
}

.element-backwards {
  /* Przed 1s: opacity: 0, blue (styl z 'from') */
  /* Od 1s do 3s: animacja od blue do red */
  /* Po 3s: opacity: 0.5, green (wraca do normalnego) */
  animation-fill-mode: backwards;
}

.element-both {
  /* Przed 1s: opacity: 0, blue (styl z 'from') */
  /* Od 1s do 3s: animacja od blue do red */
  /* Po 3s: opacity: 1, red (styl z 'to') */
  animation-fill-mode: both;
}

Jeśli lista trybów wypełnienia jest krótsza niż lista nazw animacji, wartości są powtarzane.

Praktyczne zastosowania

  • forwards: Najczęściej używana wartość. Idealna, gdy chcemy, aby element pozostał w stanie końcowym po zakończeniu animacji (np. animacja pojawienia się elementu, który ma pozostać widoczny). Bez forwards element "wróciłby" do stanu sprzed animacji.
  • backwards: Przydatne, gdy chcemy, aby element od razu przyjął stan początkowy animacji, nawet jeśli jest ona opóźniona. Zapobiega to "mignięciu" normalnego stylu elementu tuż przed startem opóźnionej animacji.
  • both: Łączy zalety obu powyższych, zapewniając płynny start (bez mignięcia) i utrzymanie stanu końcowego.
  • none: Używane, gdy animacja ma być tylko chwilowym efektem, a element ma zawsze wracać do swojego domyślnego stanu.

FAQ - Najczęściej zadawane pytania

Czy animation-fill-mode działa z animacjami ustawionymi na infinite?

animation-fill-mode ma znaczenie głównie dla animacji, które się kończą (mają skończoną liczbę powtórzeń). Dla animacji infinite, stan końcowy nigdy nie jest osiągany w sensie zatrzymania animacji, więc forwards i both nie mają widocznego efektu *po* animacji. Jednak backwards i both nadal będą stosować style z pierwszej klatki podczas opóźnienia.

Jak animation-direction wpływa na animation-fill-mode?

Kierunek animacji decyduje, która klatka jest uznawana za "pierwszą" i "ostatnią" dla backwards i forwards. Np. przy animation-direction: reverse;, "pierwszą" klatką dla backwards będzie 100% (lub to), a "ostatnią" dla forwards będzie 0% (lub from).

Czy style z animation-fill-mode: forwards; nadpisują inne style?

Tak, style zastosowane przez forwards po zakończeniu animacji mają wyższy priorytet niż normalne style elementu. Aby je nadpisać, trzeba by np. usunąć animację lub zastosować nowe style z wyższą specyficznością lub !important.

Czy backwards działa, jeśli nie ma opóźnienia (animation-delay: 0s;)?

Technicznie tak, ale efekt jest niezauważalny, ponieważ nie ma okresu opóźnienia, podczas którego style z pierwszej klatki mogłyby być widoczne przed startem animacji. backwards jest najbardziej użyteczne przy niezerowym, dodatnim opóźnieniu.