Właściwość CSS `animation-duration` dokładnie określa, ile czasu trwa jeden pełny cykl animacji – od początku do końca zdefiniowanych klatek kluczowych (`@keyframes`). Jeśli ustawisz `animation-duration: 2s;`, to przeglądarka ma 2 sekundy na przejście od stanu początkowego do końcowego w danej animacji. Moim zdaniem warto to sobie wyobrazić jak czas trwania jednego „przejścia” animacji, zanim ewentualnie zacznie się kolejny obrót, jeśli używasz `animation-iteration-count`. Technicznie jest to czas trwania pojedynczej iteracji, zgodnie ze specyfikacją CSS Animations (W3C). W praktyce wygląda to np. tak: `.box { animation-name: fadeIn; animation-duration: 1.5s; }`. Tu element będzie się „pojawiał” przez 1,5 sekundy. Jeśli dodasz `animation-iteration-count: 3;`, to ta 1,5 sekundowa animacja zostanie odtworzona trzy razy, ale sama długość pojedynczego cyklu nadal wynosi 1,5 s. Częsty dobry nawyk w front-endzie to trzymanie się krótkich, płynnych animacji, zwykle w zakresie 150–500 ms dla prostych efektów (hover, focus), a dłuższych, do 1–2 sekund, dla bardziej złożonych przejść, żeby użytkownik nie czuł się znużony. `animation-duration` przyjmuje wartości w sekundach (`s`) lub milisekundach (`ms`), np. `300ms`. Można też ustawiać różne czasy dla wielu animacji naraz, rozdzielając wartości przecinkami. Warto pamiętać, że jeśli nie podasz `animation-duration`, domyślna wartość to `0s`, czyli animacja tak naprawdę się nie odtworzy – to jeden z częstszych powodów, czemu początkującym „nie działa animacja”. Dobrą praktyką jest zawsze jawne ustawianie `animation-duration` oraz spójne używanie jednostek czasu w całym projekcie, żeby interfejs wyglądał konsekwentnie i profesjonalnie.
W CSS animacje składają się z kilku powiązanych ze sobą właściwości i dość łatwo jest je pomylić, zwłaszcza na początku. Kluczowe jest zrozumienie, że `animation-duration` nie odpowiada ani za opóźnienie startu, ani za liczbę powtórzeń, ani za kierunek animacji, tylko za czas trwania pojedynczego cyklu. To jest fundament, na którym buduje się całą resztę. Często myli się `animation-duration` z `animation-delay`. To drugie faktycznie określa, po jakim czasie od wyrenderowania elementu i zastosowania stylu animacja ma w ogóle wystartować. Czyli `animation-delay: 2s;` oznacza: poczekaj 2 sekundy, a dopiero potem zacznij odtwarzać animację. Natomiast tempo i długość pojedynczego przebiegu animacji nadal definiuje `animation-duration`. Inny typowy błąd to przypisywanie `animation-duration` roli kontrolowania liczby powtórzeń. Od tego jest `animation-iteration-count`, gdzie możesz podać konkretną liczbę (np. `3`) albo słowo kluczowe `infinite`, jeśli animacja ma się zapętlać. Logicznie patrząc: czas trwania cyklu i liczba cykli to dwa zupełnie różne parametry, więc mają osobne właściwości. Kolejna rzecz to kierunek animacji. Tym zarządza `animation-direction`, które przyjmuje wartości takie jak `normal`, `reverse`, `alternate`, `alternate-reverse`. Dzięki temu możesz np. sprawić, że animacja będzie raz odtwarzana w przód, a potem w tył. Sam `animation-duration` w ogóle nie ingeruje w kierunek, jedynie w to, jak długo trwa przejście od klatki początkowej do końcowej w danym kierunku. Z mojego doświadczenia wynika, że błędne kojarzenie tych właściwości wynika z chęci „upchania” zbyt wielu funkcji w jednym parametrze, zamiast traktować animację jak zestaw niezależnych gałek do kręcenia: czas trwania (`animation-duration`), opóźnienie (`animation-delay`), liczba powtórzeń (`animation-iteration-count`), kierunek (`animation-direction`), funkcja timingowa (`animation-timing-function`) itd. Dopiero poprawne zrozumienie ich podziału pozwala projektować płynne, przewidywalne animacje zgodne z dobrymi praktykami UX.