CSS umožÅuje vytváÅet jednoduché animace zcela bez JavaScriptu.
V JavaScriptu můžeme CSS animace ÅÃdit nebo je vylepÅ¡it krátkým kódem.
CSS pÅechody
MyÅ¡lenka CSS pÅechodů je jednoduchá. Uvedeme vlastnost a způsob, jak se majà animovat jejà zmÄny. Když se vlastnost zmÄnÃ, prohlÞeÄ vykreslà animaci.
To znamená, že nám staÄà zmÄnit vlastnost a prohlÞeÄ zobrazà plynulý pÅechod.
NapÅÃklad následujÃcà CSS animace mÄnà vlastnost background-color bÄhem 3 sekund:
.animováno {
transition-property: background-color;
transition-duration: 3s;
}
Když nynà má nÄjaký element tÅÃdu .animováno, každá zmÄna jeho background-color bude animována v průbÄhu 3 sekund.
KliknutÃm na následujÃcà tlaÄÃtko spustÃte animaci jeho pozadÃ:
<button id="barva">KliknÄte na mÄ</button>
<style>
#barva {
transition-property: background-color;
transition-duration: 3s;
}
</style>
<script>
barva.onclick = function() {
this.style.backgroundColor = 'red';
};
</script>
K popisu CSS pÅechodů sloužà 4 vlastnosti:
transition-propertytransition-durationtransition-timing-functiontransition-delay
Probereme je za okamžik. ProzatÃm poznamenejme, že spoleÄná vlastnost transition umožÅuje deklarovat vÅ¡echny najednou v poÅadÃ: property duration timing-function delay, stejnÄ jako animovat vÃce vlastnostà souÄasnÄ.
NapÅÃklad toto tlaÄÃtko animuje vlastnosti color a font-size:
<button id="rostoucÃ">KliknÄte na mÄ</button>
<style>
#rostoucà {
transition: font-size 3s, color 2s;
}
</style>
<script>
rostoucÃ.onclick = function() {
this.style.fontSize = '36px';
this.style.color = 'red';
};
</script>
Nynà probereme animaÄnà vlastnosti jednu po druhé.
transition-property
Ve vlastnosti transition-property uvádÃme seznam vlastnostÃ, které majà být animovány, napÅÃklad: left, margin-left, height, color. Nebo můžeme napsat all, což znamená âanimovat vÅ¡echny vlastnostiâ.
VÅ¡imnÄte si vÅ¡ak, že existujà vlastnosti, které animovat nelze. NicménÄ vÄtÅ¡ina obecnÄ užÃvaných vlastnostà je animovatelná.
transition-duration
Ve vlastnosti transition-duration můžeme specifikovat, jak dlouho má animace trvat. Äas by mÄl být v Äasovém formátu CSS: v sekundách s nebo milisekundách ms.
transition-delay
Ve vlastnosti transition-delay můžeme specifikovat prodlevu pÅed animacÃ. NapÅÃklad pokud transition-delay je 1s a transition-duration je 2s, pak se animace spustà 1 sekundu po zmÄnÄ vlastnosti a jejà celková doba trvánà budou 2 sekundy.
Povoleny jsou i záporné hodnoty. Pak se animace spustà okamžitÄ, ale jejà poÄáteÄnà bod bude v zadané hodnotÄ (Äase). NapÅÃklad pokud transition-delay je -1s a transition-duration je 2s, spustà se animace pÅesnÄ od poloviny a bude trvat celkem 1 sekundu.
NásledujÃcà animace posouvá ÄÃsla od 0 do 9 pomocà CSS vlastnosti translate:
pás.onclick = function() {
pás.classList.add('animace');
};#ÄÃslice {
width: .5em;
overflow: hidden;
font: 32px monospace;
cursor: pointer;
}
#pás {
display: inline-block
}
#pás.animace {
transform: translate(-90%);
transition-property: transform;
transition-duration: 9s;
transition-timing-function: linear;
}<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="style.css">
</head>
<body>
KliknutÃm sem spustÃte animaci:
<div id="ÄÃslice"><div id="pás">0123456789</div></div>
<script src="script.js"></script>
</body>
</html>Vlastnost transform se animuje následovnÄ:
#pás.animace {
transform: translate(-90%);
transition-property: transform;
transition-duration: 9s;
}
V uvedeném pÅÃkladu JavaScript pÅidá elementu tÅÃdu .animace â a animace zaÄne:
pás.classList.add('animace');
Pomocà záporné transition-delay bychom mohli také zaÄÃt nÄkde uprostÅed pÅechodu, od urÄitého ÄÃsla, napÅ. odpovÃdajÃcÃho aktuálnà sekundÄ.
Když zde kliknete na ÄÃslici, animace se spustà od aktuálnà sekundy:
pás.onclick = function() {
let sekunda = new Date().getSeconds() % 10;
pás.style.transitionDelay = '-' + sekunda + 's';
pás.classList.add('animace');
};#ÄÃslice {
width: .5em;
overflow: hidden;
font: 32px monospace;
cursor: pointer;
}
#pás {
display: inline-block
}
#pás.animace {
transform: translate(-90%);
transition-property: transform;
transition-duration: 9s;
transition-timing-function: linear;
}<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="style.css">
</head>
<body>
KliknutÃm sem spustÃte animaci:
<div id="ÄÃslice"><div id="pás">0123456789</div></div>
<script src="script.js"></script>
</body>
</html>JavaScript to provádà Åádkem navÃc:
pás.onclick = function() {
let sekunda = new Date().getSeconds() % 10;
// napÅÃklad -3s zde spustà animaci od 3. sekundy
pás.style.transitionDelay = '-' + sekunda + 's';
pás.classList.add('animace');
};
transition-timing-function
Äasovacà funkce popisuje, jak je animaÄnà proces rozložen podél své Äasové linie. Zda zaÄne pomalu a pak zrychlÃ, nebo naopak.
Na prvnà pohled vypadá jako nejsložitÄjšà vlastnost, ale pokud jà vÄnujete trochu Äasu, zaÄne vám pÅipadat velice jednoduchá.
Tato vlastnost pÅijÃmá dva druhy hodnot: Bézierovu kÅivku nebo kroky. ZaÄneme kÅivkou, jelikož ta se použÃvá ÄastÄji.
Bézierova kÅivka
Äasovacà funkce může být nastavena jako Bézierova kÅivka se 4 ÅÃdÃcÃmi body, které splÅujà tyto podmÃnky:
- Prvnà ÅÃdÃcà bod je
(0,0). - Poslednà ÅÃdÃcà bod je
(1,1). - Hodnota
xmezilehlých bodů musà být v intervalu0..1,ymůže být jakákoli.
Syntaxe Bézierovy kÅivky v CSS: cubic-bezier(x2, y2, x3, y3). Zde musÃme specifikovat jen 2. a 3. ÅÃdÃcà bod, protože prvnà je pevnÄ stanoven jako (0,0) a Ätvrtý jako (1,1).
Äasovacà funkce popisuje, jak rychle animaÄnà proces probÃhá.
- Osa
xpÅedstavuje Äas:0â zaÄátek,1â konectransition-duration. - Osa
yspecifikuje mÃru dokonÄenà procesu:0â poÄáteÄnà hodnota vlastnosti,1â koneÄná hodnota.
Nejjednoduššà varianta je ta, kdy animace probÃhá rovnomÄrnÄ, stále stejnou lineárnà rychlostÃ. To můžeme specifikovat kÅivkou cubic-bezier(0, 0, 1, 1).
Tato kÅivka vypadá následovnÄ:
â¦Jak vidÃte, je to obyÄejná pÅÃmka. Když probÃhá Äas (x), proces animace (y) rovnomÄrnÄ pokraÄuje od 0 k 1.
V následujÃcÃm pÅÃkladu jede vláÄek zleva doprava stálou rychlostà (kliknÄte na nÄj):
.vláÄek {
position: relative;
cursor: pointer;
width: 177px;
height: 160px;
left: 0;
transition: left 5s cubic-bezier(0, 0, 1, 1);
}<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="style.css">
</head>
<body>
<img class="vláÄek" src="https://js.cx/clipart/train.gif" onclick="this.style.left='450px'">
</body>
</html>CSS vlastnost transition je založena na této kÅivce:
.vláÄek {
left: 0;
transition: left 5s cubic-bezier(0, 0, 1, 1);
/* kliknutà na vláÄek nastavà vlastnost left na 450px, ÄÃmž spustà animaci */
}
â¦A jak můžeme zobrazit zpomalujÃcà vláÄek?
Můžeme použÃt jinou Bézierovu kÅivku: cubic-bezier(0.0, 0.5, 0.5 ,1.0).
Graf:
Jak vidÃme, proces zaÄÃná rychle: kÅivka strmÄ vzroste, ale pak zpomaluje a zpomaluje.
Äasovacà funkce v akci (kliknÄte na vláÄek):
.vláÄek {
position: relative;
cursor: pointer;
width: 177px;
height: 160px;
left: 0px;
transition: left 5s cubic-bezier(0.0, 0.5, 0.5, 1.0);
}<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="style.css">
</head>
<body>
<img class="vláÄek" src="https://js.cx/clipart/train.gif" onclick="this.style.left='450px'">
</body>
</html>CSS:
.vláÄek {
left: 0;
transition: left 5s cubic-bezier(0, .5, .5, 1);
/* kliknutà na vláÄek nastavà vlastnost left na 450px, ÄÃmž spustà animaci */
}
Existuje nÄkolik vestavÄných kÅivek: linear, ease, ease-in, ease-out a ease-in-out.
linear je zkratka pro cubic-bezier(0, 0, 1, 1) â pÅÃmku, jakou jsme popsali výše.
Dalšà názvy jsou zkratky pro následujÃcà cubic-bezier:
ease* |
ease-in |
ease-out |
ease-in-out |
|---|---|---|---|
(0.25, 0.1, 0.25, 1.0) |
(0.42, 0, 1.0, 1.0) |
(0, 0, 0.58, 1.0) |
(0.42, 0, 0.58, 1.0) |
* â nenÃ-li uvedena Äasovacà funkce, standardnÄ se použÃvá ease.
Pro náš zpomalujÃcà vláÄek bychom tedy mohli použÃt ease-out:
.vláÄek {
left: 0;
transition: left 5s ease-out;
/* totéž jako transition: left 5s cubic-bezier(0, .5, .5, 1); */
}
Vypadá to však trochu jinak.
Bézierova kÅivka může způsobit, že animace pÅekroÄà svůj rozsah.
ÅÃdÃcà body kÅivky mohou mÃt jakékoli souÅadnice y, dokonce záporné nebo obrovské. Pak se i Bézierova kÅivka roztáhne velmi nÃzko nebo vysoko a způsobÃ, že animace opustà svůj obvyklý rozsah.
NásledujÃcà pÅÃklad obsahuje tento animaÄnà kód:
.vláÄek {
left: 100px;
transition: left 5s cubic-bezier(.5, -1, .5, 2);
/* kliknutà na vláÄek nastavà vlastnost left na 450px */
}
Vlastnost left by mÄla být animována od 100px do 400px.
Když vÅ¡ak kliknete na vláÄek, uvidÃte tohle:
- Nejprve vláÄek jede dozadu:
leftpoklesne pod100px. - Pak jede dopÅedu, o nÄco dál než
400px. - A pak znovu zpÄt â na
400px.
.vláÄek {
position: relative;
cursor: pointer;
width: 177px;
height: 160px;
left: 100px;
transition: left 5s cubic-bezier(.5, -1, .5, 2);
}<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="style.css">
</head>
<body>
<img class="vláÄek" src="https://js.cx/clipart/train.gif" onclick="this.style.left='400px'">
</body>
</html>ProÄ se tak dÄje, nám bude zcela jasné, když se podÃváme na graf zadané Bézierovy kÅivky:
SouÅadnici y druhého bodu jsme nastavili pod nulu a tÅetÃho bodu nad 1, takže kÅivka vybÄhla ze svého âbÄžnéhoâ kvadrantu. SouÅadnice y je mimo âstandardnÃâ rozsah 0..1.
Jak vÃme, y znamená âmÃru dokonÄenà procesu animaceâ. Hodnota y = 0 odpovÃdá poÄáteÄnà hodnotÄ vlastnosti a hodnota y = 1 koncové hodnotÄ. Hodnoty y<0 tedy posunujà vlastnost pÅed poÄáteÄnà left a hodnoty y>1 za koncovou left.
To je samozÅejmÄ âmÄkkáâ varianta. Jestliže nastavÃme hodnoty y tÅeba na -99 a 99, pak vláÄek vyskoÄà z rozsahu mnohem dál.
Jak ale vytvoÅÃme Bézierovu kÅivku pro specifický úkol? K tomu existuje mnoho nástrojů.
- Můžeme to napÅÃklad udÄlat na stránce https://cubic-bezier.com.
- Také prohlÞeÄové vývojáÅské nástroje majà zvláštnà podporu pro Bézierovy kÅivky v CSS:
- OtevÅete si vývojáÅské nástroje klávesou F12 (Mac: Cmd+Opt+I).
- Zvolte záložku
Elements(Prvky) a vÄnujte pozornost subpaneluStyles(Styly) na pravé stranÄ. - CSS vlastnosti se slovem
cubic-bezierbudou mÃt pÅed tÃmto slovem ikonu. - Po kliknutà na tuto ikonu můžete editovat kÅivku.
Kroky
Äasovacà funkce steps(poÄet kroků[, start/end]) umožÅuje rozdÄlit pÅechod do vÃce kroků.
PodÃvejme se na to v pÅÃkladu s ÄÃslicemi.
Zde je seznam ÄÃslic bez jakýchkoli animacÃ, jen jako zdroj:
#ÄÃslice {
border: 1px solid red;
width: 1.2em;
}
#pás {
display: inline-block;
font: 32px monospace;
}<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="style.css">
</head>
<body>
<div id="ÄÃslice"><div id="pás">0123456789</div></div>
</body>
</html>V HTML je pás ÄÃslic uzavÅen do <div id="ÄÃslice"> pevné délky:
<div id="ÄÃslice">
<div id="pás">0123456789</div>
</div>
Element #digit má pevnou Å¡ÃÅku a ohraniÄenÃ, proto vypadá jako Äervené okno.
VytvoÅÃme ÄasovaÄ: ÄÃslice se budou objevovat nespojitÄ jedna po druhé.
Abychom toho docÃlili, skryjeme #pás mimo #ÄÃslice pomocà overflow: hidden a pak budeme #pás posunovat doleva krok za krokem.
Bude to mÃt 9 kroků, pro každou ÄÃslici jeden krok-posun:
#pás.animate {
transform: translate(-90%);
transition: transform 9s steps(9, start);
}
Prvnà argument funkce steps(9, start) je poÄet kroků. PÅechod bude rozdÄlen na 9 Äástà (každá 10%). Äasový interval se rovnÄž automaticky rozdÄlà na 9 ÄástÃ, takže transition: 9s nám dává 9 sekund na celou animaci â 1 sekundu na každou ÄÃslici.
Druhý argument je jedno ze dvou slov: start nebo end.
start znamená, že prvnà krok potÅebujeme udÄlat okamžitÄ na zaÄátku animace.
V akci:
#ÄÃslice {
width: .5em;
overflow: hidden;
font: 32px monospace;
cursor: pointer;
}
#pás {
display: inline-block
}
#pás.animace {
transform: translate(-90%);
transition-property: transform;
transition-duration: 9s;
transition-timing-function: steps(9, start);
}<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="style.css">
</head>
<body>
KliknutÃm sem spustÃte animaci:
<div id="ÄÃslice"><div id="pás">0123456789</div></div>
<script>
ÄÃslice.onclick = function() {
pás.classList.add('animace');
}
</script>
</body>
</html>Po kliknutà se ÄÃslice okamžitÄ zmÄnà na 1 (prvnà krok) a pak se zmÄnà na zaÄátku dalšà sekundy.
Proces postupuje následovnÄ:
0sâ-10%(prvnà zmÄna na zaÄátku 1. sekundy, okamžitÄ)1sâ-20%- â¦
8sâ-90%- (poslednà sekunda ukazuje koneÄnou hodnotu.)
Prvnà zmÄna zde probÄhla okamžitÄ v důsledku start ve steps.
Druhá možná hodnota end by znamenala, že zmÄna se nebude aplikovat na zaÄátku, ale na konci každé sekundy.
Proces pro steps(9, end) tedy bude probÃhat takto:
0sâ0(bÄhem prvnà sekundy se nic nezmÄnÃ)1sâ-10%(prvnà zmÄna na konci 1. sekundy)2sâ-20%- â¦
9sâ-90%
Následuje steps(9, end) v akci (vÅ¡imnÄte si prodlevy pÅed prvnà zmÄnou ÄÃslice):
#ÄÃslice {
width: .5em;
overflow: hidden;
font: 32px monospace;
cursor: pointer;
}
#pás {
display: inline-block
}
#pás.animace {
transform: translate(-90%);
transition-property: transform;
transition-duration: 9s;
transition-timing-function: steps(9, end);
}<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="style.css">
</head>
<body>
KliknutÃm sem spustÃte animaci:
<div id="ÄÃslice"><div id="pás">0123456789</div></div>
<script>
ÄÃslice.onclick = function() {
pás.classList.add('animace');
}
</script>
</body>
</html>Pro steps(...) existujà i nÄkteré pÅeddefinované zkratky:
step-startâ totéž jakosteps(1, start). To znamená, že animace zaÄne okamžitÄ a bude trvat 1 krok. ZaÄne a skonÄà tedy okamžitÄ, jako by žádná animace nebyla.step-endâ totéž jakosteps(1, end): vykoná animaci v jediném kroku na koncitransition-duration.
Tyto hodnoty se použÃvajà málokdy, jelikož nepÅedstavujà skuteÄnou animaci, ale jednokrokovou zmÄnu. UvádÃme je jen pro úplnost.
Událost: âtransitionendâ
Když CSS animace skonÄÃ, spustà se událost transitionend.
Zhusta se použÃvá k provedenà akce po skonÄenà animace. Můžeme také spojovat animace.
NapÅÃklad loÄ v následujÃcÃm pÅÃkladu zaÄne po kliknutà plout sem a tam, pokaždé dál a dál doprava:
Animaci spustila funkce pluj, která se znovu spouÅ¡tà pokaždé, když pÅechod skonÄÃ, a obrátà smÄr plavby:
boat.onclick = function() {
//...
let kolikrát = 1;
function pluj() {
if (kolikrát % 2) {
// plujeme doprava
boat.classList.remove('back');
boat.style.marginLeft = 100 * kolikrát + 200 + 'px';
} else {
// plujeme doleva
boat.classList.add('back');
boat.style.marginLeft = 100 * kolikrát - 200 + 'px';
}
}
pluj();
boat.addEventListener('transitionend', function() {
kolikrát++;
pluj();
});
};
Objekt události transitionend má dvÄ specifické vlastnosti:
událost.propertyName- Vlastnost, jejÞ animace skonÄila. Může se hodit, když animujeme vÃce vlastnostà souÄasnÄ.
událost.elapsedTime- Doba trvánà animace (v sekundách) bez
transition-delay.
Keyframes
Pomocà CSS pravidla @keyframes můžeme spojit vÃce jednoduchých animacà dohromady.
Specifikuje ânázevâ animace a pravidla â co, kdy a kde animovat. Pak můžeme pomocà vlastnosti animation pÅipojit animaci k elementu a specifikovat jejà dalšà parametry.
Následuje pÅÃklad s vysvÄtlenÃm:
<div class="postup"></div>
<style>
@keyframes pluj-zleva-doprava { /* pojmenujeme ji: "pluj-zleva-doprava" */
from { left: 0px; } /* zaÄátek animace left: 0px */
to { left: calc(100% - 50px); } /* konec animace left: 100%-50px */
}
.postup {
animation: pluj-zleva-doprava 3s infinite alternate;
/* aplikujeme animaci "pluj-zleva-doprava" na element
trvánà 3 sekundy
poÄet opakovánÃ: nekoneÄný (infinite)
pokaždé zmÄnà smÄr (alternate)
*/
position: relative;
border: 2px solid green;
width: 50px;
height: 20px;
background: lime;
}
</style>
O @keyframes existuje mnoho Älánků a detailnà specifikace.
PravdÄpodobnÄ nebudete potÅebovat @keyframes Äasto, pokud na vaÅ¡ich stránkách nenà vÅ¡echno v neustálém pohybu.
Výkonnost
VÄtÅ¡inu CSS vlastnostà je možné animovat, protože vÄtÅ¡ina z nich má ÄÃselné hodnoty. NapÅÃklad width, color, font-size jsou vÅ¡echny ÄÃsla. Když je budete animovat, prohlÞeÄ postupnÄ tato ÄÃsla mÄnà krok za krokem, ÄÃmž vytváÅà plynulý efekt.
Ne vÅ¡echny animace vÅ¡ak budou vypadat tak hladce, jak byste si pÅáli, protože zmÄna různých CSS vlastnostà trvá různou dobu.
Technické podrobnosti jsou takové, že když nastane zmÄna stylu, prohlÞeÄ projde 3 fáze, aby zobrazil nový vzhled:
- Layout (rozloženÃ): pÅepoÄÃtá geometrii a pozici každého elementu, pak
- Paint (kreslenÃ): pÅepoÄÃtá, jak má vÅ¡echno vypadat na svých mÃstech, vÄetnÄ pozadà a barev,
- Composite (složenÃ): zobrazà koneÄné výsledky do pixelů na obrazovce a aplikuje CSS pÅechody, pokud nÄjaké jsou.
BÄhem CSS animace se tento proces opakuje v každém snÃmku. AvÅ¡ak CSS vlastnosti, které nemajà vliv na geometrii nebo pozici, napÅ. color, mohou pÅeskoÄit fázi rozloženÃ. Pokud se zmÄnà color, prohlÞeÄ nepoÄÃtá žádnou novou geometrii a jde rovnou na kreslenà â složenÃ. Existuje i nÄkolik vlastnostÃ, které pÅecházejà pÅÃmo ke složenÃ. Delšà seznam CSS vlastnostà a fázÃ, které spouÅ¡tÄjÃ, najdete na https://csstriggers.com.
Tyto výpoÄty mohou nÄjakou dobu trvat, zejména na stránkách s mnoha elementy a složitým rozloženÃm. A na vÄtÅ¡inÄ zaÅÃzenà jsou tyto prodlevy viditelné, což vede k âtrhánÃâ, ménÄ plynulým animacÃm.
Animace vlastnostÃ, které pÅeskakujà fázi rozloženÃ, jsou rychlejÅ¡Ã. JeÅ¡tÄ lepšà je, když je pÅeskoÄeno i kreslenÃ.
Vlastnost transform je skvÄlá volba, protože:
- CSS pÅechody ovlivÅujà box cÃlového elementu jako celek (otáÄejà ho, obracejÃ, roztahujÃ, pÅesunujÃ).
- CSS pÅechody nikdy neovlivÅujà sousednà elementy.
â¦ProhlÞeÄe tedy aplikujà transform ânadâ existujÃcÃmi výpoÄty rozloženà a kreslenÃ, ve fázi složenÃ.
Jinými slovy, prohlÞeÄ vypoÄÃtá rozloženà (velikosti, pozice), ve fázi kreslenà vykreslà barvy, pozadà atd., a pak aplikuje transform na boxy elementů, které ji potÅebujÃ.
ZmÄny (animace) vlastnosti transform nikdy nevyvolajà kroky rozloženà a kreslenÃ. KromÄ toho prohlÞeÄ využÃvá pro CSS pÅechody grafický akcelerátor (speciálnà Äip na CPU nebo grafické kartÄ), dÃky Äemuž jsou velmi efektivnÃ.
NaÅ¡tÄstà je vlastnost transform velmi silná. PoužÃvánÃm transform na elementu jej můžete otáÄet, pÅevracet, roztahovat a zmenÅ¡ovat, pÅesunovat a mnoho dalÅ¡Ãho. MÃsto vlastnostà left/margin-left tedy můžeme použÃt transform: translateX(â¦), pro zvÄtÅ¡ovánà elementu můžeme použÃt transform: scale atd.
RovnÄž vlastnost opacity nikdy nespustà rozloženà (v Mozille Gecku pÅeskakuje i kreslenÃ). Můžeme ji použÃvat pro efekty zobrazenÃ/skrytà nebo zjevovánÃ/mizenÃ.
Spojenà transform a opacity nám obvykle dokáže vyÅeÅ¡it vÄtÅ¡inu naÅ¡ich potÅeb a poskytnout plynulé, pÄknÄ vypadajÃcà animace.
NapÅÃklad zde kliknutÃm na element #loÄ pÅidáte tÅÃdu s transform: translateX(300px) a opacity: 0, což pÅimÄje loÄ pÅesunout se o 300px doprava a zmizet:
<img src="https://js.cx/clipart/boat.png" id="loÄ">
<style>
#loÄ {
cursor: pointer;
transition: transform 2s ease-in-out, opacity 2s ease-in-out;
}
.posun {
transform: translateX(300px);
opacity: 0;
}
</style>
<script>
loÄ.onclick = () => loÄ.classList.add('posun');
</script>
NásledujÃcà pÅÃklad je složitÄjšà a obsahuje @keyframes:
<h2 onclick="this.classList.toggle('animated')">kliknutà sem spustà / zastavà animaci</h2>
<style>
.animated {
animation: hello-goodbye 1.8s infinite;
width: fit-content;
}
@keyframes hello-goodbye {
0% {
transform: translateY(-60px) rotateX(0.7turn);
opacity: 0;
}
50% {
transform: none;
opacity: 1;
}
100% {
transform: translateX(230px) rotateZ(90deg) scale(0.5);
opacity: 0;
}
}
</style>
ShrnutÃ
CSS animace umožÅujà plynulé (nebo krokové) animované zmÄny jedné nebo vÃce CSS vlastnostÃ.
Hodà se pro vÄtÅ¡inu animaÄnÃch úloh. Pro animace můžeme použÃvat i JavaScript. Tomu je vÄnována pÅÃÅ¡tà kapitola.
Omezenà CSS animacà ve srovnánàs JavaScriptovými animacemi:
- Jednoduché vÄci se dÄlajà jednoduÅ¡e.
- Rychlé a nenároÄné na CPU.
- JavaScriptové animace jsou flexibilnÃ. Mohou implementovat jakoukoli animaÄnà logiku, napÅ. âexploziâ elementu.
- UmÄjà nejen zmÄny vlastnostÃ, ale v JavaScriptu můžeme v rámci animace i vytváÅet nové elementy.
V poÄáteÄnÃch pÅÃkladech v našà kapitole jsme animovali font-size, left, width, height atd. Ve skuteÄných projektech bychom mÄli pro lepšà výkon použÃvat transform: scale() a transform: translate().
VÄtÅ¡inu animacà lze implementovat pomocà CSS podle popisu v této kapitole. Událost transitionend umožÅuje po skonÄenà animace spustit JavaScript, takže se dobÅe integruje s kódem.
V následujÃcà kapitole vÅ¡ak budeme provádÄt animace v JavaScriptu, abychom pokryli složitÄjšà pÅÃpady.
KomentáÅe
<code>, pro nÄkolik Åádků je obalte znaÄkou<pre>, pro vÃce než 10 Åádků vložte odkaz na pÃskoviÅ¡tÄ (plnkr, jsbin, codepenâ¦)