Greensock Tween Tipps

Auf www.greensock.com gibt es verschiedene Frameworks für Flash und auch Javascript. Eine der bekanntesten Bibliotheken sind TweenLite und TweenMax.

Inhalt

 

 

Download and Get Started

Hier eine tolle Einführung und der Download Link oben rechts auf der folgenden Seite: Get Started Greensock Animation Platform

Hier die komplette online Dokumentation

Entpacken hochladen

Lade den Ordner src/js auf deinen Server hoch. Der Ordner uncompressed wird nicht hochgeladen, wenn du die komprimierte Version eingebunden hast, die man an dem Wörtchen min erkennt.

TweenLite die Kernversion

<script type="text/javascript" src="js/TweenLite.min.js"></script>

CSS Eigenschaften, spezielle dynanmische Bewegungen "easing"

<script type="text/javascript" src="js/plugins/CSSPlugin.min.js"></script>
<script type="text/javascript" src="js/easing/EasePack.min.js"></script>
<script type="text/javascript" src="js/TweenLite.min.js"></script>

Alles , wenn die Dateigröße keine Rolle spielt.

<script type="text/javascript" src="js/TweenMax.min.js"></script>


Basic

Beispiel

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Greensock Tween</title>
<script type="text/javascript" src="js/TweenMax.min.js"></script>

<script>
var myTween, photo;

function init(){
photo = document.getElementById("photo");
myTween = new TweenLite(photo, 1.5, {width:337, height:104});
}
</script>

</head>

<body>

<img src="../img/easelJS_header.png" width="66" height="20" id="photo">
<button onClick="init()">start</button>

</body>
</html>


TweenLite kann jede numerische Eigenschaft eines Javascript Objekts tweenen.

var obj = {objEigschft:0};
bild = document.getElementById("photo"); TweenLite.to(bild, 2, {objEigschft:100});

Der erste Parameter ist das Zielobjekt, der zweite Parameter die Zeit in Sekunden, es folgt ein Objekt in geschweiften Klammern, in dem eine oder mehrere Eigenschaft:Wert Zuweisungen mit Kommata getrennt aufgeführt werden. Der Wert ist der Endwert der Animation. Im obigen Beispiel beträgt er 100 und wird nach 2 Sekunden erreicht.

var photo = document.getElementById("photo"); //oder benutze JQuery's Selektor $("#photo")
TweenLite.to(photo, 1.5, {width:100, x:100});


Tween Methoden

to() tweened vom aktuellen Wert zum angegeben Wert

TweenLite.to(photo, 1.5, {width:100, height:200});

from() tweend von dem angegeben Wert zum aktuellen Wert

TweenLite.from(photo, 1.5, {width:0, height:0});

fromTo() hier werden Anfangs- und Endwerte angegeben

TweenLite.fromTo(photo, 1.5, {width:0, height:0}, {width:100, height:200});

Tween Kontrolle

Beispiel

Im folgenden wird das Tweening nicht automatisch gestartet, sondern angehalten. Durch die Methode resume() kann man das Tweening dann starten oder besser gesagt, es startet ab der Stelle, an der es angehalten wurde.

var myTween = new TweenLite(photo, 1.5, {width:100, paused:true});

myTween.resume();

Weitere Methoden Tweenings zu kontrollieren

//Pause

tween.pause();

//resume (honors direction - rückwärts oder nicht)

tween.resume();

//restart(startet vom Anfang)

tween.restart();

//reverse (geht zurück zum Anfang)

tween.reverse();

//springt exakt 0.5 Sekunden in das Tweening

tween.seek(0.5);

//lässt das Tweening mit halber Geschwindigkeit laufen

tween.timeScale(0.5);

//Tweening läuft mit doppelter Geschwindigkeit

tween.timeScale(2);

//Entfernt das Tweening und macht es für den Garbage Collector verfügbar

tween.kill();

//Man kann alle Tweens eines Elementes folgendermaßen entfernen.

TweenLite.killTweensOf(myElement);

Event Target, das angeklickte Objekt animieren

Mittels Javascript event.target kann man das Element ansprechen, welches eine Funktion über einen Event aufgerufen hat.

<div onClick="turnMe(event)"></div>

In der Funktion kann man auf folgende Art auf das angeklickte Objekt zugreifen:

function turnMe(event){

var element=event.target;

}

so sieht`s aus

 


Spezielle Eigenschaften

delay Verzögerung des Starts in Sekunden

TweenLite.to(photo, 1.5, {width:100, delay:2});

onComplete Funktionsaufruf nach Ablauf des Tweens

TweenLite.to(photo, 1.5, {width:100, delay:0.5, onComplete:myFunction});

Man beachte den Zugriff auf das zuvor getweente Element mit this.target in der nachfolgenden Funktion.

so sieht`s aus

Counter

Ich habe in dem Beispiel auch einen counter eingefügt, der einmal dafür sorgt, dass die Element alle nebeneinander liegen und dass der Farbtonwert bei jedem Element etwas höher gesetzt wird, damit Regenbogenfarben entstehen. Das sieht komplizierter aus als es ist. Ohne Variable counter würde die Hintergrundfarbe folgendermaßen definiert.

backgroundColor:"hsl(30,100%,50%)"

Nun geht es darum den Farbwert durch den numerischen Wert mit Variable zu ersetzen. Den kann ich aber nicht einfach in den String einfügen, sondern muss den String in 2 Teile aufteilen und mittels + Pluszeichen die Variable dazwischen einfügen.

backgroundColor:"hsl("+counter*30+",100%,50%)"

Parameter

Man kann auch Parameter übergeben, das sieht dann so aus

TweenLite.to(element, 1, {css:{width:"50%"}, onComplete:myFunction, onCompleteParams:["param1", "param2"], onCompleteScope:this});

function myFunction(p1, p2) {

    console.log("tween completed. Received parameters: " + p1 + " and " + p2 + ". The scope is: " + this);

}

Das gilt auch für: onUpdate, onUpdateParams, onUpdateScope, onStart, onStartParams, and onStartScope.

onStart Funktionsaufruf beim Start des Tweens

TweenLite.to(photo, 1.5, {width:100, delay:0.5, onStart:myFunction});

onUpdate Funktionsaufruf beim Start des Tweens

TweenLite.to(photo, 1.5, {width:100, delay:0.5, onUpdate:myFunction});

Siehe auch die Dokumentation

 

 


Easing

Mit Easing sind eine Reihe dynamischer Bewegungen gemeint. Das heißt die Bewegung läuft nicht gleichmäßig, sondern wird beispielsweise zum Ende hin schneller oder langsamer.

TweenLite.to(photo, 1, {width:100, ease:Power2.easeOut});

Es gibt sehr viele Möglichkeiten, die man an diesem Tool ausprobieren kann.

 

  • Duration:
  • Plugins

    Mit Plugins werden Eigenschaften hinzugefügt, die in der Standardversion nicht enthalten sind. Durch diese dynamischen Erweiterungen kann man die Dateigröße klein halten. Jede Eigenschaft wird mit dem Eigenschaftsnamen verknüpft. So geht es beim CSSPlugin um css Eigenschaften.

    TweenLite.to(photo, 1, {css:{scaleX:0.5, rotation:30}, ease:Power3.easeOut});

    Selbstverständlich muss das CSSPlugin geladen sein, denn sonst würde TweenLite versuchen eine photo.css Eigenschaft zu verändern.
    Mit dem RoundPropsPlugin kann man Werte auf Kommastellen runden.

    RoundPropsPluginTweenLite.to(photo, 1, {width:100, height:200, roundProps:"width,height"});


    CSS

    Die Werte müssen in Camel Case geschrieben werden: anstatt background-color schreibe: backgroundColor

    TweenLite.to(element, 1, {css:{top:"20px", left:"100px", backgroundColor:"#FF0000"}, ease:Power2.easeOut});

    Es ist möglich die Werte folgendermaßen zu mischen. In den meisten Fällen wird der Wert in Pixeln angegeben. Man kann px setzen oder es weglassen.

    TweenLite.fromTo(myBox, 1.5, {css:{width:50%, height:20%}}, {css:{width:200px, height:200px}});

    TweenLight kann auch komplexe Werte tweenen, z.B.:

    boxShadow:"0px 0px 20px 20px red"

    borderRadius:"50% 50%"

    border:"5px solid rgb(0,255,0)"

    2D Transformationen kann man intuitiv setzen und braucht sich nicht um Kompatibiltätsprobleme der verschiedenen Browser und Versionen zu kümmern.

    rotation, scaleX, scaleY, scale, skewX, skewY, x, and y

    TweenLite.to(element, 2, {css:{rotation:30, scaleX:0.8}});

    Der Drehwinkel wird standarmäßig in Grad "degree" definiert. Man kann aber auch das Bogenmaß "radians" benutzen.

    TweenLite.to(element, 2, {css:{rotation:"1.25rad", skewX:"30deg"}});

    Einige Regeln zum Thema 2D Transfomation:

    1. Man sollte die CSS "position" der Elemente auf "absolute" setzen, um zu verhindern, dass in einigen Browsern Teile abgeschnitten werden.
    2. Man kann "scale" nutzen, wenn man "scaleX" und "scaleY" gleichermaßen transformieren will.
    3. Die Reihenfolge der Eigenschaften spielt keine Rolle.
    4. Wenn man die x/y Position eines Elementes ändern will, ist es besser "top" und "left" einzusetzen.
    5. TweenLite hat nichts mit der Rendering Qualität in den einzelnen Browsern zu tun.

    3D Transformation

    3D Transformationen werden von den meisten modernen Browsern unterstützt und können intuitiv in TweenLite eingesetzt werden:

    TweenLite.to(element, 2, {css:{rotationX:45, scaleX:0.8, z:-300}});

    Siehe dazu: http://caniuse.com/transforms3d

    Beispiele findet man hier: http://www.greensock.com/css3/

    Wenn man mit 3D arbeiten will, muss man den "perspective" Wert setzen. Er bewirkt, wie stark sich die Verzerrung auswirkt. Man kann diesen Wert generell setzen, so dass er für alle Elemente gültig ist. Oder man setzt ihn auf das Eltern Element, oder auf ein einzelnes Element.
    Weitere Infos zum Thema Perspektive setzten, findet man in diesem Beitrag.

     

    //Es ist die Beste Möglichkeit, die Perspektive des Elternelements zu setzen.

    TweenLite.set(container, {css:{perspective:500}});

     

    //Standard Perspektive für alle Elemente

    CSSPlugin.defaultTransformPerspective = 500;

     

    //Perspektive für ein einzelnes Element mit der Eigenschaft"transformPerspective"

    TweenLite.set(element, {css:{transformPerspective:500}});

    Reihenfolge der Eigenschaften

    Im normalen CSS ist die Reihenfolge der 3D Eigenschaften von Bedeutung. Um Einheitlichkeit zu bewahren sollte man es in TweenLight genauso halten.

    scale, dann rotation (genauso wie rotationZ), dann rotationY, dann rotationX, dann translation (x, y, z).

     

     

    //sample css:

    .myClass {  transform: scale(1.5, 1.5) rotateY(45deg) translate3d(10px, 0px, -200px)}

      

    //corresponding GSAP transform (tweened over 2 seconds):

    TweenLite.to(element, 2, {css:{scale:1.5, rotationY:45, x:10, y:0, z:-200}});

     

    //sample css that uses a perspective():

    .myClass {    transform: perspective(500px) rotate(120deg) translateY(50px)}

     

    //corresponding GSAP transform (set, not tweened):

    TweenLite.set(element, {css:{transformPerspective:500, rotation:120, y:50}});

    Im folgenden Beispiel hat jedes Element einen anderen transformPerspektive Wert. siehe Beispiel


    Drehen um einen bestimmten Punkt

    Wenn man ein Element um einen Punkt im 3D-Raum drehen will, benutze die Eigenschaft transformOrigin (siehe unten). Standardmäßig ist der Drehpunkt das Zentrum des Elements (50% 50%). Man kann Keywords nutzen wie "top", "left", "right", "bottom" oder man kann Prozentzahlen einsetzen (untere rechte Kante wäre dann 100% 100%) oder Pixel. Im folgenden Beispiel wird ein Element um die linke, obere Ecke gedreht.

    TweenLite.to(element, 2, {css:{rotation:360, transformOrigin:"left top"}});

    Beispiel

    Will man einen Drehpunkt im 3D Raum bestimmen, kann man der Eigenschaft transformOrigin auch einen dritten Parameter zuweisen, transformOrigin: " x y z"

    shortRotation wählt für die Drehung den kürzesten Weg.

    TweenLite.to(element, 2, {css:{shortRotation:-170}});


    autoAlpha ist das gleiche wie opacity. Hier wird ein Transparenzwert von 0 bis 1 erwartet. Wenn autoAlpha auf 0 gesetzt wird, wird die Eigenschaft "visibility" auf "hidden" gesetzt.

    //fade out and set visibility:hidden
    TweenLite.to(element, 2, {css:{autoAlpha:0}});

    //in 2 seconds, fade back in with visibility:visible
    TweenLite.to(element, 2, {css:{autoAlpha:1}, delay:2});


    className bietet die Möglichkeit zwischen den Klassen zu wechseln. Nehmen wir mal an wir haben 2 Klassen class1 und class2. In jeder Klasse gibt es verschiedene CSS Eigenschaftswerte. Mein Element hat die class1 und ich möchte dass es in einem Zeitraum von 2 Sekunden zu den Eigenschaftswerten der class2 morphed oder tweened.

    TweenLite.to(myElement, 1, {css:{className:"class2"}});

    Man kann die Klasse auch an die bestehende Klasse anhängen mit +=
    Um Sie zu entfernen, benutze -=

    TweenLite.to(myElement, 1, {css:{className:"+=class2"}});

    Achtung, es gibt einige CSS Eigenschaften, die man nicht tweenen kann, wie IE Filter und 3D Transforms. Außerdem hat man Geschwindigkeitseinbußen, wenn man mit className arbeitet, da der Rechner die gesamte Klassenstruktur durchlaufen muss.

    autoRound Standardmäßig werden Pixelwerte oder zIndex während des Tweenings gerundet, denn das steigert die Performance. Man kann jedoch dieses Verhalten für einzelene Element außer Kraft setzen, indem man autoRound: false setzt. Wenn man das für ein einzelnes Objekt gemacht hat, kann man dennoch das RoundPropsPlugin nutzen.


    Sonstiges

    Mehrere Objekte tweenen

    TweenLite.to([e1, e2, e3], 1, {css:{autoAlpha:0}});

    Mehrere Objekte zeitversetzt tweenen.

    Siehe Info bei Greensock

    Die Objekte werden mit einer Zeitverzögerung von 0.5 Sekunden animiert.

    tl.staggerTo([e1, e2, e3], 1, {css:{rotation:60}}, 0.5);

    so sieht`s aus

    Yoyo Effekte Tween mit Wiederholung

    Siehe Info bei Greensock

    Im folgenden Beispiel wird eine Animation mehrmals wiederholt. Man kann die Anzahl der Wiederholungen eingeben. Man kann für jede Wiederholung Parameter setzen. Der yoyo Effekt erzeugt eine hin und her Animation.

    so sieht`s aus

    Mehrere Tweenings nacheinander ausführen

    siehe Beispiel

    //erstelle eine TimelineLite Instanz

    var tl = new TimelineLite();

     

    //füge ein to() tween hinzu, außerdem wurde hier noch ein Funktionsaufruf eingefügt, der beim Start ausgeführt wird onStart , Die Funktion startFunction wird weiter unten definiert

    tl.to(element, 1, {css:{width:"50%"}, onStart:startFunction});

     

    //füge ein weiteres tween hinzu (standardmäßig werden die Tweens am Ende der Timeline eingefügt, das macht die Sache einfach)

    tl.to(element, 1, {css:{height:"300px"}, ease:Elastic.easeOut});

     

    //Das nächste Tween bekommt eine Zeitverzögerung von 0.75 Sekunden so dass eine Lücke zwischen dem vorigen und dem neuen Tween entsteht

    tl.to(element, 1, {css:{opacity:0.5}}, 0.75);

     

    //Eine Überlappung des nächsten zum vorigen Tween von einer halben Sekunde wird durch den negativen Offset Wert erzeugt

    tl.to(element, 1, {css:{backgroundColor:"#FF0000"}}, -0.5);

    //hier werden 3 Elemente(e1, e2, and e3) mit einer Drehung von 60 Grad animiert. Dann wird die Startzeit gestapelt mit einer Verzögerung von 0.2 Sekunden

    tl.staggerTo([e1, e2, e3], 1, {css:{rotation:60}}, 0.2);

     

    //zum Schluss könnte man eine Funktionsaufruf einfügen, der nach Ablauf der Timeline ausgeführt wird. Die Funktion muss selbstverständlich noch erzeugt werden.

    tl.call(myFunction);

     

    //Mit folgenden Standardmethoden kann man die Sequenz kontrollieren:

    tl.pause();

    tl.resume();

    tl.restart();

    tl.reverse();

    tl.play();

     

    //Springe genau 2.5 Sekunden in die Animation

    tl.seek(2.5);

    //Verlangsame die Abspielgeschwindigkeit um 10% der Normalgeschwindigkeit

    tl.timeScale(0.1);

     

    //Füge ein label namens "myLabel" nach exakt 3 Sekunden hinzu:

    tl.insert("myLabel", 3);

     

    //Füge ein Tween hinzu, welches bei "myLabel" startet

    tl.insert( TweenLite.to(element, 1, {css:{scale:0.5}}), "myLabel");

     

    //Springe zu "myLabel" und spiele die Zeitleiste ab da ab.:

    tl.play("myLabel");

     

    Draggable Elements

    siehe Greensock Dokumentation

    Es folgt das erste Beispiel der Dokumentation. Es reicht anscheinend nicht aus, TweenMax einzubinden. Es muss auch die Draggable.min.js eingebunden werden.

    Draggable.create("#yourID");

    Beispiel1

    Im zweiten Beispiel dient das Elternelement als Begrenzungsbox (Bounding Box). Außerdem werden Hinweise an die console ausgegeben.

    Beispiel 2

    Draggable.create("#yourID", {
    bounds: document.getElementById("container"),
    throwProps:true,
    onClick:function() {
    console.log("clicked");
    },
    onDragEnd:function() {
    console.log("drag ended"); }
    });

    Im dritten Beispiel wird die Bewegung auf der vertikalen y- Achse eingeschränkt. Eine gute Möglichkeit einen Schieberegler zu erzeugen.

    type:"y",

    Beispiel 3

    Beispiel mit Drehung

    type:"rotation"

    Beispiel 4

    Hier wird die Box nicht verschoben, sondern der Inhalt wird innerhalb der Box gescrollt.

    Beispiel 5

    In diesem Beispiel haben wir wieder die Begrenzungsbox, jedoch hier mit einer Art Einschnappfunktion. Die Elemente springen zurück, wenn man sie über den Rand der Begrenzungsbox hinausschiebt.

    Beispiel 6

    Im folgenden Beispiel kann man einige Photos verschieben. Die ursprüngliche Drehung der Photos wird beim Verschieben auf 0 Grad gesetzt. Außerdem wird das Photo vergrößert und nach dem Vorgang wieder verkleinert. Hier kommen Events zum Einsatz. onPress und onDragEnd. Der selektor this.target verweist auf das Element, welches gerade verschoben wird.

    Beispiel 7