TijdlijnMax een inleiding tot Tweening

Wat je gaat creëren

In de oude dagen van animatie tweening was een term die werd gebruikt om een ​​beeld-voor-beeld reeks te beschrijven, of wat soms wordt aangeduid als 'tussenafstand'. Het is die plaats waar een enkele beweging naar de volgende leidt om een ​​vloeiende beweging te creëren. Voor degenen die grijs haar hebben, kun je Flash herinneren; een toepassing die deze term gebruikte bij het verwijzen naar frame-bewegingen. Laten we een inzichtelijke blik werpen op een paar voorbeelden en dit tweening-ding een goede klassieke manier van proberen geven.

Tweening met TweenMax

Voor beide voorbeelden in deze zelfstudie zal ik TweenMax.min.js laden. Dit geeft ons toegang tot TimelineMax en alle andere fantastische kerntools die GSAP te bieden heeft. Als je terugdenkt aan onze TimelineMax-primer, besprak ik het laden van TweenMax.min.js omdat dit handiger is, plus dit ene bestand bevat vrijwel alles wat we nodig hebben (ook wat 99% van de tijd door GreenSock wordt aanbevolen).

TweenMax breidt TweenLite uit en voegt veel handige (maar niet-essentiële) functies toe, zoals herhaling(), herhalingsvertraging(), yoyo (), updateTo (), en meer. TweenMax is gebouwd voor het gemak en biedt een enkel JavaScript-bestand met alles wat u vaak nodig zult hebben voor het animeren van DOM-elementen. In wezen kunnen auteurs afzonderlijke bewegingen specificeren, terwijl TimelineMax geketende methoden accepteert om een ​​complexere reeks tweens / sequenties te creëren.

Loader-reeks

Laders zijn die objecten die aan gebruikers worden gegeven wanneer ze wachten op het laden van een proces. Ze geven ons de kracht om kleine, micro-kleine elementen te ontdekken die complexe of zelfs simplistische interacties kunnen hebben - plus ze zijn een knaller om te maken.

Bekijk deze demo van "String of Pearls" snel:

Laten we de volgorde afbreken voor een beter begrip van hoe dit hele 'tweening'-ding werkt.

Voor het maken van deze reeks is het gebruik van de methode staggerTo vereist. Als je je niet herinnert wat een methode is, raad ik je aan om dit moment te stoppen en mijn tutorial over mechanica te lezen.

Volgens de documentatie van GreenSock, de staggerTo ()  methode:

"Tweens een reeks doelen naar een gemeenschappelijke set bestemmingswaarden. 

In ons geval zijn die meerdere doelen elk van de cirkels binnen de gehele SVG. 

  1. Ons eerste argument voor staggerTo accepteert de selector die we voor de kringen gebruiken (in dit geval cirkels).
  2. Het tweede argument is onze duur (hoe lang de animatie duurt). 
  3. Het derde argument is een letterlijk object met de eigenschappen die we willen tweenen.
  4. En het laatste argument zal onze spreidingswaarde (de hoeveelheid tijd tussen de begin van elke animatie). 

Dit zou het volgende tot gevolg hebben; ervan uitgaande dat cirkels bevat drie objecten ...

tijdlijn.staggerTo (cirkels, 15, x: 0, 0.2) // cirkel 1 begint op tijdstip 0 // cirkel 2 begint op tijdstip 0.2 // cirkel 3 begint op tijdstip 0.4

Laderinstelling

Om goed te beginnen, moeten we een nieuwe tijdlijn en een paar instellingen voor onze configuratie definiëren.

var loader = new TimelineMax (repeat: -1, yoyo: true), circles = $ ('svg circle'), stagger_options = opacity: 0, y: -800, ease: Elastic.easeInOut;

Om deze tijdlijn in de omgekeerde richting te herhalen, gebruik ik de yoyo sleutel en de waarde ervan instellen op waar. Nogmaals, dit zorgt ervoor dat onze reeks in de tegenovergestelde richting wordt gespeeld zodra de animatie zijn eindframe bereikt. Als u de animatie triggert, moet u elke cirkel binnen de SVG targeten en precies waarom we een referentie nodig hebben met behulp van de kracht van jQuery.

Er zijn een aantal manieren aangegeven door de documenten om selectors door te geven (voel je vrij om hier meer over te lezen). Voor dit voorbeeld selecteer ik alle kringen in één keer met behulp van de typische selector-syntaxis van jQuery. Het is ook een beetje sneller om onze referentie op te slaan in een variabele voor later gebruik, vandaar cirkels = $ ('svg-cirkel').

De stagger_options variabele is een letterlijk object dat de eigenschappen bevat om deze animatie zijn leven te geven. We verplaatsen onze objecten met behulp van de Y sleutel omdat de GSAP CSSPlugin intelligent converteert transformeren waarden voor Matrix equivalenten en uiteindelijk versnelt dingen voor ons. Er is een hele lijst van korte-handeigenschappen die veel beter zijn en veel gemakkelijker te gebruiken tegenover typische CSS-transformaties:

GSAP gelijk aan CSS-eigenschappen

CSS GSAP
translateX () X
translateY () Y
translateZ () z
draaien() omwenteling
rotateY () rotationY
rotateX () rotationX
scaleX () scaleX
scaleY () scaleY
skewX () skewX
skewY () skewY

We kunnen ook de versnelling (het gevoel van de animatie) regelen en verschillende bewegingstypen doorgeven. Voor de visuele liefhebbers die er zijn, kun je het gemak visualizer door GreenSock uitchecken om een ​​beter begrip te krijgen van de talloze eases beschikbaar.

Het laatste stuk aan deze creatie is het bevestigen van de staggerTo methode aan onze tijdlijn toevoegen en de eerder gedefinieerde variabelen invoegen in de juiste volgorde voor deze specifieke methode (elementen, duur, opties, staffel).

loader.staggerTo (cirkels, 0.875, stagger_options, 0.025);

Een tweede Tween koppelen

Als je honger hebt om een ​​andere reeks te maken als de spreidingsvolgorde voltooid is, kun je een andere methode, zoals van naar zoals zo:

loader.staggerTo (circles, 0.875, stagger_options, 0.025) .fromTo (doel: Object, duration: Number, fromVars: , toVars: );

Verder nemen

Laten we dit eens proberen met een SVG die ik "Polyman" noem. Onlangs schreef ik een artikel voor CSS-Tricks over het animeren van polygonen en besloot om datzelfde voorbeeld te gebruiken voor een andere tweening-oefening hier. Laten we het gebruiken staggerFromTo () methode en zie welke soort magie we kunnen oproepen.

De volgende SVG-uitvoer (de XML) is enigszins afgekort omwille van de discussie, maar zoals u zult zien bevat onze SVG een paar tags; specifiek  en . Merk ook op dat de paden die correleren met het gezicht van de man gegroepeerd zijn als secties om fijnere controle te hebben over de verspringing (bijvoorbeeld oren, ogen, neus ...).

       

Voor de initiële tijdlijnopstelling zullen we onze globale opties definiëren met behulp van een letterlijk object dat de initiële animatie zal vertragen, de reeks zal herhalen, de animatie op herhaling zal vertragen en de animatie uiteindelijk in omgekeerde volgorde zal afspelen.

var tmax_options = delay: 0.25, repeat: -1, repeatDelay: 0.25, yoyo: true;

Transformatiewaarden dwingen

De volgende is een vrij nieuwe en ongedocumenteerde eigenschap die ervoor zorgt dat transformatiewaarden in het SVG-transformatieattribuut worden geplaatst (in tegenstelling tot een CSS-stijl). 

CSSPlugin.useSVGTransformAttr = true;

Deze eigenschap is toegevoegd om het de ontwikkelaars gemakkelijker te maken om een ​​bug in Safari te omzeilen en te combineren ondoorzichtigheid en transformaties (zoals transformeren: schaal () bijvoorbeeld) zou een vreemd resultaat opleveren. Vanaf 1.16.0 useSVGTransformAttr ingesteld op waar automatisch en specifiek gericht op onze Pal Safari, dus het is niet langer nodig voor auteurs om te definiëren zoals ik hierboven heb.

Sinds de staggerFromTo methode accepteert afzonderlijke argumenten voor van en naar posities Ik vind het leuk om zowel objectliterals buiten de methode in te stellen voor organisatorische doeleinden als voor leesbaarheid.

var stagger_opts_from = opacity: 0, scale: 0, transformOrigin: 'center center'; var stagger_opts_to = opacity: 1, scale: 1, ease: Elastic.easeInOut, force3D: true;

We definiëren twee object-letterwoorden omdat we al onze objecten nodig hebben van en naar eigenschappen die zijn gedefinieerd om deze animatie te laten werken. Als het niet duidelijk is, gaan we van de waarden die in ons zijn gedefinieerd stagger_opts_from en eindigend met de waarden die zijn ingesteld in stagger_opts_to.

De force3D toetsingskrachten GSAP om een ​​3D-waarde toe te passen op de transformatie van het element; betekenis Matrix3D () in plaats van Matrix(), of translate3d () in plaats van vertalen(). Dit resulteert meestal in de browser die het getargete element op zijn eigen laag van de compositor plaatst, wat zorgt voor efficiëntere updates met animaties. 

Standaard force3D ingesteld op auto (vanaf 1.15.0) dus eigenlijk is het helemaal niet nodig om het te gebruiken (tenzij je specifiek het gedrag van wilt waar in plaats van auto voor die tween).

// Lagen de doelen aan het begin van de tween en // houdt ze op die manier met behulp van een 3D-matrix, indien van toepassing // (voor 2D- en 3D-transformaties). force3D: true // gelaagde de doelen aan het begin van de tween en // deselecteert ze ook aan het einde van de tween (terugschakelen naar een 2D-matrix of // transforms). Hiermee wordt voorkomen dat // je honderden gelaagde elementen kunt maken en ophangen (waardoor de prestaties afnemen) en wordt er ook voor gezorgd dat tekst // die mogelijk is gerasterd tijdens de tween terugkeert naar // scherp is. force3D: auto

U kunt de globale instellen force3D waarde voor alle tweens met de defaultForce3D property geleverd door CSSPlugin:

// accepteert ook 'false' of 'auto' CSSPlugin.defaultForce3D = true;

Of u kunt dit op een tween-basis instellen in plaats van:

// houdt element gelaagd nadat tween voltooid is timeline.to (element, 1, x: 300, force3D: true); // houdt element gelaagd nadat tween voltooid is timeline.to (element, 1, x: 300, force3D: false);

Hide on Window Load

Als uw animatie CSS-eigenschappen probeert te onderdrukken, moet u ervoor zorgen dat uw specifieke specificiteit niet botst met wat is gedeclareerd in uw JavaScript, anders hebben de native CSS-waarden voorrang en reageert uw animatie niet zoals verwacht.

/ * Vereist Polyman Styles * / .polyman-pad opacity: 0; 

De bovenstaande CSS verbergt Polyman bij het laden van het eerste venster, dus we zien onze bebaarde kerel in eerste instantie niet zoals je zou ervaren met wat gewoonlijk wordt aangeduid als FOUT (Flash Of Unstyled Text).

Aangezien het merendeel van onze configuratie is gedefinieerd, kunnen we eindelijk beginnen met het instellen van onze tijdlijn, de SVG-paden targeten en een staffelfunctie definiëren (stagger_val) En afwerking door te definiëren hoe lang de hele animatie duurt (looptijd).

var tl = new TimelineMax (tmax_options), path = $ ('svg.polyman path'), stagger_val = 0.0125, duration = 1.25;

Net als dat, en met de delicate golf van onze toverstaf en een kleine hoeveelheid eenhoornstof, passeren we alle vereiste variabelen die werden gedefinieerd als argumenten in de staggerFromTo methode!

tl.staggerFromTo (pad, duur, stagger_opts_from, stagger_opts_to, stagger_val, 0);

Altviool! In een eenvoudige rij begint de Polyman te ademen en een echt levend ding te worden (en niet echt). Best cool he?

De volgende keer

In de volgende tutorial van onze TweenMax-serie zullen we kijken hoe je een pauzepunt op de tijdlijn kunt maken, zodat de animatie automatisch pauzeert wanneer het het gewenste punt bereikt. De methode addPause () is relatief nieuw en u kunt overal in een tijdlijn een pauze plaatsen. Het is veel nauwkeuriger dan het gebruiken van een callback die een functie oproept om de functie te onderbreken (wat je daarvoor moest doen) addPause () bestaand). Tot de volgende keer dat je goed tweent! 

Een speciale dank aan de lezers die deze GreenSock-reis volgen!