INAPOI

Dezvoltare de animatii cu CSS si JS

Costruirea de animatii pentru un website este un proces de continuu de iterare.

De la identificarea elementelor care pot fi dinamice si animate in design-ul unui website pana la transpunerea si finalizarea acestor idei in programare, pot trece prin multiple variante, unele simple si altele crazy, dar intotdeauna gasim o varinta care sa multumeasca nu numai clientul dar si pe noi.

Indiferent de cat de frumos arata design-ul, daca animatiile introduse nu sunt fluide atunci vizitatorii vor ramane cu o impresie urata care ii vor face sa nu mai revina pe website.

Vorbind despre Javascript si CSS, sunt foarte multe metode de a scrie cod care face acelasi lucru, dar unele sunt mai eficiente decat altele. Website-ul INOVEO a trecut printr-o sumedenie de schimbari de la lansarea lui in decembrie si pana acum, majoritatea axate pe imbunatatirea performantei care sa ne permita sa adaugam toate proiectele din portofoliul nostru stufos.

Unele din primele optimizari a fost reducerea elementelor care vor fi animate si ce elemente CSS vor fi afectate. Ca o regula simpla pentru programatori, este recomandat sa se animeze tag-urile CSS transform si opacity, iar alte tipuri sa fie evitate sau folosite intr-un numar redus. Acest lucru ne va permite sa rulam animatiile importante cu accelerare grafica. Aceasta schimbare va ajuta si cu unul din principalele bottleneck-uri de performanta la website-urile medii si mari: recalcularea style-ului de catre browser. Aceasta recalculare forteaza browser-ul sa redeseneze intreaga pagina, un process intensiv care va rezulta in miscari cu micro-stutters (sacadari) si cu framerate redus foarte variabil.

Un exemplu de schimbare pozitiva si simpla ar fi urmatorul cod CSS care va muta un div 300 de pixeli.

Before:

.clasa-animata{
  left: 0px;
  animation: move 1s ease-in-out;
}
@keyframes move{
  to {left: 300px}
}

After:

.clasa-animata{
  transform: translateX(0px);
  animation: move 1s ease-in-out;
}
@keyframes move{
  to {transform: translateX(300px)}
}

Animatiile realizate cu Javascript au potentialul de a intalni mai multe bottleneck-uri decat daca este folosit doar CSS, dar iti permite sa realizezi lucruri mult mai complicate. In cazul website-ului INOVEO am legat scroll-ul vertical cu miscarea orizontala a proiectelor pe homepage. Initial testele s-au facut cu un numar redus de proiecte, dar in momentul in care a fost finalizata introducerea tuturor proiectelor au probleme mari la animatia de scroll, in special pe calculatoare mai vechi sau slabe. S-a ajuns la concluzia ca intreg backend-ul trebuia sa fie rescris si optimizat daca voiam sa vedem noul nostru site intr-o stare de functionare buna.

Unul din tool-urile folosite pentru a verifica performanta si bottleneck-urile posibile ale unui website este DevTool-ul integrat in browsere, in acest caz cel din Chrome.
S-au identificat multiple puncte care se puteau imbunatati, unele dintre cele mai importante fiind: numarul de call-uri facute catre DOM cand rula functia pentru scroll, numarul de elemente afectate in timpul animatiei de scroll si ordinea efectuarii calculelor si modificarii elementelor din pagina.

Mai jos avem un screenshot la cum aratau graficele inainte de a se efectua toate schimbarile:

Codul JS a suferit modificari majore dar putem exemplifica intr-um mod simplu care poate fi inteles si de incepatori. Voi folosi JS simplu aici, dar noi avem implementat ES6 in codul sursa la website si recomand tuturor sa invete ES5/ES6.

Before:

function scrollHome(){
  var var1Elem, var2Elem, var3Scroll, var4Scroll;
  var1Elem = document.querySelectorAll(‘.elemente-mari’);
  var3Scroll = window.pageYOffset;
  for(var i=0; i<var1Elem.lenght; i++){
   var1Elem[i].style.transform = ‘translate3d(‘+var3Scroll+’px, 0px, 0px)’;
  }
  var2Elem = document.querySelectorAll(‘.elemente-mici’);
  var4Scroll = var3Scroll/2;
  for(var i=0; i<var2Elem.lenght; i++){
   var2Elem[i].style.transform = ‘translate3d(‘+var4Scroll+’px, 0px, 0px)’;
  }
}

After:

var var1Elem, var2Elem, var1Len, var3Len;
var1Elem = document.getElementsByClassName(‘elemente-mari’);
var2Elem = document.getElementsByClassName(‘elemente-mici’);
var1Len = var1Elem.lenght;
var2Len = var2Elem.lenght;
function scrollHome(){
  var var3Scroll = window.pageYOffset, var4Scroll = var3Scroll/2;
  for(var i=0; i<var1Len; i++){
   var1Elem[i].style.transform = ‘translate3d(‘+var3Scroll+’px, 0px, 0px)’;
  }
  for(var i=0; i<var1Len; i++){
   var2Elem[i].style.transform = ‘translate3d(‘+var4Scroll+’px, 0px, 0px)’;
  }
}

Modificarile efectuate dupa aceste teste au reusit sa reduca frametime-ul de la peste 100ms la aproape de 30ms, sa reduca significativ timpul de executare a codului JS, numarul de redesenari ale paginii fortate si a numarului de sacadari in timpul scroll-ului.

Website-ul INOVEO a vazut multe transformari de la lansare pana acum si vom continua sa-l imbunatatim in fiecare zi.

Mai multe articole

INOVEO a scris

Rebrandingul POSTEI ROMANE – transformarea unei institutii intr-un brand modern

Your browser does not support the video tag. Rebrandingul POSTEI ROMANE – primul pas spre transformare Procesul de rebranding semnat de INOVEO marcheaza inceputul unei transformari organizationale. Este tranzitia de la traditional la modern. De la o [...]

Citeste tot articolul from Dezvoltare de animatii cu CSS si JS

Citeste tot articolul

INOVEO a scris

Category Entry Points: cum legi brandul de contexte clare?

Category Entry Points sunt momentele si contextele prin care consumatorii isi amintesc un brand. Afla cum sa folosesti category entry points in branding si rebranding, cu exemple romanesti si internationale. De ce category entry points [...]

Citeste tot articolul from Dezvoltare de animatii cu CSS si JS

Citeste tot articolul

INOVEO a scris

Intalnirile fizice – cheia succesului in branding

Preferam sa ne vedem cu clientii fizic de la prima pana la ultima intalnire. Evident pot fi situatii in care comunicam si transmitem informatii telefonic sau online dar aceste sunt pentru detalii tehnice sau de [...]

Citeste tot articolul from Dezvoltare de animatii cu CSS si JS

Citeste tot articolul

INOVEO a scris

Brand rebranding & mere exposure effect: de ce repetitia vinde?

Mere Exposure Effect in rebranding Mere Exposure Effect este unul dintre cele mai utile principii de psihologie aplicata in branding si mai ales in rebranding. Oamenii se obisnuiesc cu ce vad des, iar repetitia este [...]

Citeste tot articolul from Dezvoltare de animatii cu CSS si JS

Citeste tot articolul

INOVEO
Prezentarea generala

Folosim cookie-urile pentru a va oferi cea mai buna experienta pe site-ul nostru. Informatiile privind cookie-urile sunt stocate in browserul dvs. si indeplinesc functii, cum ar fi recunoasterea dvs. atunci cand reveniti pe site-ul nostru si ajutati echipa noastra sa inteleaga ce sectiuni ale site-ului vi se par cele mai interesante si utile.

Cititi Politica de Cookie-uri si Politica de Confidentialitate.