Ondřej Šteigl - Logo ONDŘEJ ŠTEIGL
CSS

Jak udělat animace v CSS

Přechody, @keyframes a plynulý pohyb – jak oživit prvky na stránce bez jediného řádku JavaScriptu.

Čtení 7 min začátečník Naposledy upraveno 28. 10. 2026

Předtím: Web, který funguje na mobilu

Stránka, která se hýbe, působí živěji. Ukážeme si dva způsoby: přechod mezi stavy a animaci, která běží sama od sebe. Nic složitého, jen dvě pravidla a pár vlastností.

Dva způsoby: přechod a animace

Přechod (transition) už znáte z tlačítek. Změní vlastnost ve chvíli, kdy nastane událost, třeba najetí myší. Animace (animation) běží sama od sebe, bez události, a může se opakovat donekonečna.

Keyframes: co se má dít

Animaci popíšete pravidlem @keyframes. Určíte stavy v procentech průběhu: 0 % je začátek, 100 % konec:

@keyframes pulz {
  0%   { transform: scale(1); }
  50%  { transform: scale(1.15); }
  100% { transform: scale(1); }
}

Jméno pulz si zvolíte sami. Samo o sobě ale nic nedělá, je to jen popis. Teprve když ho připojíte k prvku, animace začne.

Připojení animace k prvku

.ikona {
  animation-name: pulz;                /* které pravidlo použít */
  animation-duration: 2s;              /* jak dlouho trvá jeden cyklus */
  animation-iteration-count: infinite; /* opakovat donekonečna */
}

Stejný zápis lze zkrátit na jediný řádek: animation: pulz 2s infinite;. Výsledek vidíte v náhledu:

náhled

Plynulost: timing-function

Vlastnost animation-timing-function určuje, jak se rychlost mění. linear jede stejnou rychlostí, ease-in-out začíná pomalu, zrychlí uprostřed a na konci zase zpomalí. Pro přirozený pohyb se hodí právě ta druhá:

animation-timing-function: ease-in-out;

Jednorázové objevení karty

Po doběhnutí animace se obvykle prvek vrátí na začátek. Pokud má zůstat v konečném stavu, použijte animation-fill-mode: forwards. Hezký vzor je karta, která se při načtení stránky jemně vysune:

.uvod {
  animation: vysun 0.6s ease-out forwards;
}
@keyframes vysun {
  from { opacity: 0; transform: translateY(20px); }
  to   { opacity: 1; transform: translateY(0); }
}
💡 Tip: Některým lidem animace dělají potíže, třeba kvůli závratím. Proto existuje media dotaz prefers-reduced-motion. Pomocí něj animaci vypnete, pokud uživatel v systému preferuje klidnější pohyb:
@media (prefers-reduced-motion: reduce) {
  .pulz-demo-box { animation: none; }
}

Časté chyby

Teď umíte oživit prvky na stránce bez JavaScriptu. Pokud chcete reagovat na kliknutí nebo na posun stránky, k tomu slouží JavaScript v sekci JS. 👍

Všechny návody

Nechcete web řešit sami a chcete ho mít hotový a profesionální?

Podívejte se na tvorbu webů →

© Ondřej Šteigl. Autorem návodů jsem já. Obsah je autorským dílem chráněným podle zákona č. 121/2000 Sb. (autorský zákon). Kopírování, přebírání nebo šíření bez mého předchozího písemného souhlasu je zakázáno. Výukové použití je vítáno – stačí uvést zdroj (osteigl.cz).

← Zpět na všechny návody

Nezmeškejte nový návod

Když vyjde nový návod, pošleme vám krátký e-mail. Žádný spam, odhlásit se jde jedním klikem.

QR platba – dobrovolný příspěvek

☕ Byl návod užitečný?

Můžete mě podpořit dobrovolným příspěvkem – nepovinně, třeba stovkou na provoz a na kafe. Načtěte QR v bankovní aplikaci, nebo pošlete na účet 6048546800/6363. Díky!