Documente Academic
Documente Profesional
Documente Cultură
Animaţiile CSS par foarte complexe, dar au bază ingrediente ale animaţiei care sunt simple.
Pentru a realiza o mişcare este nevoie de un nume, de cadre cheie şi de indicaţii care să indice
direcţia de deplasare.
Să începem cu ingredientele de bază necesare pentru a crea o animaţie în CSS. Sunt două tipuri
principale în orice animaţie CSS:
1. Definirea animaţiei.
2. Atribuirea acesteia unui element (unor elemente) specific(e) HTML.
Aceste două etape se pot face în orice ordine.
Regula @keyframes
Pentru a defini animaţia CSS, trebuie definite cadrele cheie folosind regula @keyframes. De
asemenea, animaţia trebuie să poarte un nume care va fi folosit ulterior.
De exemplu, la crearea unei animaţii pentru a muta o maşină pe ecran, animaţia poate fi
numită "drive'' (conducere), iar regula @keyframes poate începe astfel:
@keyframes drive { }
Ce este un cadru cheie?
Prin cadre cheie se înţelege o listă care descrie ce se petrece (ce proprietăţi trebuie modificate,
cum şi când) de-a lungul animaţiei.
Fiecare trecere prin lista de acţiuni este considerată o iterare a animaţiei. Orice proprietate
care poate fi animată şi va fi afişată într-un ciclu al animaţiei trebuie să se afle în lista cu cadre
cheie. O listă de proprietăţi care pot fi animate se află pe siteul Mozilla Developer Network.
În animaţia tradiţională, cadrele cheie sunt desenate în puncte cheie din animaţie. Cadrele
cheie CSS funcţionează astfel: se specifică valorile pentru proprietăţile animaţiei la diferite
puncte din animaţie cu cadre cheie, iar browserul construieşte animaţia dintre cadrele cheie, la fel
ca în programele After Effects sau Flash.
---- Aici se poate previzualiza exemplul pe codepen, sau aici se poate vedea rezultatul lui. ----
Încă ceva...
Există două proprietăţi suplimentare care trebuie definite explicit pentru toate animaţiile. Sunt
rare cazurile când se scrie o animaţie, după care nu se mai modifică deloc. Din acest motiv, este
utilă definirea explicită a unei proprietăţi pentru timp animation-timing-function şi una pentru
numărare animation-iteration-count a fiecărei animaţii create.
animation-timing-function
Proprietatea animation-timing-function are o valoare implicită pentru mişcarea lină (ease). Dar se
poate seta şi o valoare explicită pentru a avea un alt impact asupra animaţiei. (Detalii în capitolul
3). Pentru acest exemplu, se poate seta funcţia la ease-in:
animation-timing-function: ease-in;
animation-iteration-count
Proprietatea animation-iteration-count este utilă chiar dacă se foloseşte valoarea implicită.
Această proprietate determină de câte ori se va repeta animaţia şi valoarea implicită este unu.
animation-iteration-count: 1;
Cu aceste adăugiri, codul CSS arată astfel:
.car {
animation-name: drive; animation-duration: 2s; animation-timing-function: ease-in;
animation-iteration-count: 1;
} @keyframes drive {
from {transform: translate(0);} to {transform: translate(400px);}
}
Rezultatul final arata ca aici. Destul de bine pentru o animatie simplă!
animation-fill-mode: backwards
Proprietatea fill-mode cu backwards este utilă atunci când se lucrează cu animaţii cu întârziere.
În exemplu, animaţia are o întârziere de două secunde, după care se mută întâi la stânga, apoi la
dreapta. Fără setarea animation-fill-mode, mingea revine la cadrul cheie 0% atunci când animaţia
începe după întârziere.
Când se adaugă o proprietate animation-fill-mode cu backwards, mingea va reveni la cadrul
cheie 0% după / în timpul întârzierii specificate
animation-fill-mode: backwards;
----Aici poate fi văzut rezultatul, si aici se poate modifica animatia live pe codepen.----
Ca notă, se poate ca ţinta animaţiei să stea pe loc atunci când nu se include cadrul cheie 0%
(sau from). Browser-ul va folosi stilurile deja aplicate la țintă ca şi cadru cheie de pornire a
animației în locul cadrului cheie inițial care lipseşte, deci elementul țintă stă pe loc în timpul unei
întârzieri. Acest lucru nu poate fi întotdeauna fezabil, pentru că depinde de ceea ce se doreşte de
la animaţie.
animation-fill-mode: both
Opţiunea both combină comportamentul modurilor forwards şi backwards. Înainte de animaţie,
ţinta animaţiei se află la primul cadru cheie. După terminarea animaţiei, va rămâne la ultimul
cadru cheie.
În exemplu, folosind opţiunea both, mingea se află la primul cadru cheie înainte de începerea
animaţiei şi rămâne la ultimul cadru cheie după terminarea animaţiei.
animation-fill-mode: both;
Codul CSS final arată astfel:
.ball {
animation-name: ballmove; animation-duration: 2s; animation-timing-function: ease-in-
out; animation-iteration-count: 1; animation-delay: 1s; animation-fill-mode: both;
} @keyframes ballmove {
0% {transform: translateX(100px) rotate(0);}
20% {transform: translateX(-10px) rotate(-0.5turn);}
100% {transform: translateX(450px) rotate(2turn);}
}
----Previzualizarea rezultatelor exemplului , sau editarea exemplului animation-fill-mode live
pe codepen.----
animation-direction
Setările pentru proprietatea animation-direction pot fi: normal, reverse, alternate şi alternate-
reverse.
----Pe codepen poate fi modificată proprietatea animation- direction pentru a vedea imediat
diferenţa.----
Setarea implicită este normal şi mută obiectul înainte prin declaraţiile listate pentru fiecare
iteraţia a animaţiei.
Cod scurt
Codul pentru proprietăţile animaţiei poate fi scris în varianta scurtă, de exemplu:
animation: myAnimation 1s ease-in-out 2s 4;
<animation-name> <animation-duration> <animation-timing-function> <animation-delay>
<animation-iteration-count>.
Ordinea elementelor poate să difere. Ordinea termenilor similari (valorile pentru durată şi
întârzierea) par să fie mai importante decât ordinea generală.
----Nota W3C:
"[the] order is important within each animation definition: the first value that can be parsed as a
<time> is assigned to the animation- duration, and the second value that can be parsed as a
<time> is assigned to animation-delay."
Ordinea este importantă pentru definirea fiecărei animaţii: prima valoare care poate fi parsată ca
<timp> este atribuită proprietăţii animation-duration, iar a doua valoare care poate fi parsată ca
<timp> este atribuită proprietăţii animation-delay.
----
Consorţiul W3C defineşte ordinea proprietăţilor astfel:
<single-animation> = <single-animation-name> || <time> || <single-animation-timing-function>
|| <time> || <single-animation- iteration-count> || <single-animation-direction> || <single-
animation-fill-mode> || <single-animation-play-state>
Pentru a defini mai multe animaţii pentru un element folosind codul scurt, trebuie separate
valorile pentru fiecare animaţie cu virgule. Deci un element care are aplicate două animaţii
aplicate, arată astfel:
animation: myAnimation 1s ease-in-out 2s 4, myOtherAnimation 4s ease-out 2s;
Obiectul se mişcă cu aceeaşi viteză; viteza este constantă în întreaga animaţie. Această mişcare
este percepută ca fiind mecanică şi nenaturală, deoarece în lumea reală nimic nu se mişcă cu
viteză constantă.
Aceeaşi ilustraţie pentru ease-in:
Mişcarea este mai lentă la început, apoi accelerată pe măsură ce se apropie de final. În general,
acest stil de mişcare creează momentul accelerării. Rata cu care obiectul este accelerat poate
sugera greutatea acestuia sau alte forţe care acţionează asupra lui.
Mişcarea „ease-out” are efect opus. Animaţia începe rapid şi este încetinită pe măsură ce se
apropie de capăt:
Combinând cele două concepte ease-in şi ease-out se obţine ease-in-out, în care obiectul are
viteza cea mai mare la centru şi este încetinit la capete.
Curbele Bezier
Pentru mai multe opţiuni se pot folosi curbele Bezier. Mişcarea „ease” poate fi obţinută prin
curbe Bezier. Când se doreşte mai mult control, se pot crea propriile curbe Bezier pentru funcţia
de timp.
Ceaser este un instrument de generare curbe Bezier care oferă mai multe setări şi permite
tragerea punctelor pentru a crea curbe Bezier şi afişează mişcarea creată. După obţinerea unui
rezultat care vă place, codul este generat dinamic şi se poate copia în fişierul CSS. Ceaser oferă
şi ecuaţii echivalente CSS cu Penner easing equations folosite de obicei în Flash şi pot fi portate
în JavaScript, CSS şi altele.
Ceaser nu este singurul loc de unde se pot obţine informaţii utile pentru mişcarea „ease”.
Easings.net afişează versiuni interactive pentru diferite curbe Bezier şi mişcarea care rezultă din
ecuaţie. Lea Verou de pe cubic-bezier.com permite crearea, compararea şi obţinerea funcţiilor
Bezier. Animaţia este un lucru vizual, deci aceste editoare ajută la obţinerea stilului de mişcare
dorit. Folosirea lor este ami eficientă decât tastarea unor cifre şi verificarea rezultatelor.
Descrierea principiilor care se referă la mişcarea „ease”, timp şi animaţie se poate găsi în
diverse cărţi: Disney's twelve basic principles of animation, sau Timing for Animation şi The
Animator's Survival Kit.
----Aici poate fi văzut codul final, unde cei doi nori se comportă diferit, chiar dacă folosesc
aceleaşi cadre cheie.----
Refolosirea animaţiei la mai multe elemente este o caracteristică foarte utilă din animaţia CSS.
Făcând proprietăţile diferite pentru fiecare folosire, setul de cadre cheie poate fi foarte versatil.
Ca şi la alte funcţii pentru timp, etapele constau dintr-o listă de cadre cheie pentru a defini
animaţia. Se creează o definiţie pentru cadrele cheie, se denumeşte cu „walker” şi se definesc
două cadre cheie:
@keyframes walker {
0% {background-position: 0 0;}
100% {background-position: 0 -4000px;}
}
Înălţimea totală a imaginii este de 4000 pixeli şi se foloseşte un număr negativ pentru ca
imaginea să urce în sus. Pe măsură ce imaginea urcă, vor fi afişate cadrele de jos. Folosind
cadrele cheie de mai sus, se va muta imaginea de la poziţia 0 0 până la poziţia 0 -4000px.
Animaţia poate fi simplificată prin eliminarea cadrului cheie 0%. Chiar dacă nu se specifică
cadrul cheie de la începutul animaţiei (aici cadrul cheie 0%), stilurile aplică elementului punctul
de începere a animaţiei. Poziţia de pornire a imaginii din fundal a fost deja aleasă la 0 0 când
imaginea de fundal a fost atribuită la clasa .sprite, deci nu mai este nevoie să se repete
instrucţiunea în cadrele cheie. Comanda siimplificată:
@keyframes walker {
100% {background-position: 0 -4000px;}