GSAP


安裝至Angular

首先 npm 載入

gsap & @types/gsap

https://greensock.com/forums/topic/20112-gsap-angular/


+scrollmagic

https://github.com/janpaepke/ScrollMagic/issues/700


Get Started https://greensock.com/get-started/#loading-gsap

基本概念

TweenMax.to("#logo", 1, {x:100});

target, duration, vars


CSS Plugin

CSS Plugin 好處:

  • 正規化屬性行為,減少跨瀏覽器的bug與不一致性

  • 優化性能,關於一些layer的表現

  • 控制2d 3d transform

  • 控制屬性無需賦予初始值

  • 甚至可於複雜屬性動畫化 borderRadius, boxShadow .. etc

  • 必要時可加入多瀏覽器前綴 prefix

  • 動畫化 css 變數

  • 支援多種色彩格式 rgb, rgba, hsl, hsla, hex

  • 使svg 與 一般dom 元素的變數操作動畫表現一致,(特別是 transform)

  • Even lots more


簡單來說,他解決了你很多頭痛的問題

2D and 3D transforms 比較

CSSPlugin recognizes a number of short codes for transform-related properties:

GSAP

CSS

x: 100

transform: translateX(100px)

y: 100

transform: translateY(100px)

rotation: 360

transform: rotate(360deg)

rotationX: 360

transform: rotateX(360deg)

rotationY: 360

transform: rotateY(360deg)

skewX: 45

transform: skewX(45deg)

skewY: 45

transform: skewY(45deg)

scale: 2

transform: scale(2, 2)

scaleX: 2

transform: scaleX(2)

scaleY: 2

transform: scaleY(2)

xPercent: 50

transform: translateX(50%)

yPercent: 50

transform: translateY(50%)



而在使用Css Plugin 有幾個需要注意之處

  • 請使用 Camel命名法 取代所有使用 “-” 的屬性值,像是 font-size -> fontSize 。

  • 盡量別使用 left, top等值操作動畫,
    對於渲染來說 x, y 是相對容易的。而如果真的需要使用,必須加上 css position value 像是 absolute, relative or fixed.

  • vw vh 目前不支援,但可以很簡單的以原生 js做到:x: window.innerWidth * (50 / 100) == 50 vw


TweenMax & TimelineMax 皆內建了Css Plugin。


特別保留屬性

有些屬性是GSAP特別專屬的

delay:

delay: 3 ->為該動畫在3秒後才會觸發

onComplete:

onUpdate:

ease:


Easing

官網有強大的 Easing Visual Tool

https://greensock.com/get-started/#easing


code

TweenMax.to("#logo", 1, {x:300, ease:Bounce.easeOut});



Callbacks

  • onComplete: 每次動畫完成後皆會觸發

  • onStart: called when the animation begins

  • onUpdate: 每次動畫更新或渲染時會觸發 (on every frame while the animation is active).

  • onRepeat: called each time the animation repeats (only available in TweenMax and TimelineMax).

  • onReverseComplete: called when the animation has reached its beginning again when reversed.

還有這種

  • onCompleteParams:["done!"],有點像是fetch儲存string,onComplete執行function觸發的引入文字


code

TweenMax.to("#logo", 1, {x:100, onComplete:tweenComplete, onCompleteParams:["done!"]});


function tweenComplete(message) {

  console.log(message);

}


相當於

tweenComplete(onCompleteParams);



可取得狀態值,或是直接觸發 function

code

TweenMax.to("#logo", 1 {x:100, onComplete:tweenComplete});


function tweenComplete() {

  console.log("the tween is complete");

}







時間控制

.to()

.from()

.fromTo() :

ex.

TweenMax.fromTo("#logo", 1.5, {width:0, height:0}, {width:100, height:200});

TweenMax.fromTo( target, duration, fromObject, currentObject)

.staggerTo()

.staggerFrom()

.staggerFromTo()

固定間隔的動畫



Controlling Animating

控制動畫之前,你需要上述時間控制的參數

to(), from(), and fromTo()


code

//create a reference to the animation

var tween = TweenMax.to("#logo", 1 {x:100});


//play 播放。如果在reverse()期間觸發,則直接轉為正向播放

tween.play();


//pause 暫停

tween.pause();


//resume (honors direction - reversed or not) 繼續

tween.resume();


//reverse (always goes back towards the beginning) 倒轉

tween.reverse();


//jump to exactly 0.5 seconds into the tween 跳轉秒數

tween.seek(0.5);


//jump to exacty 1/4th into the tween's progress: 跳轉%

tween.progress(0.25);


//make the tween go half-speed 播放速度1/2x

tween.timeScale(0.5);


//make the tween go double-speed 播放速度 2x

tween.timeScale(2);


//immediately kill the tween and make it eligible for garbage collection 直接移除所有tween

tween.kill();


Timeline技巧

當動畫超過一定時間或是更加龐大後

模組化你的動畫code

https://css-tricks.com/writing-smarter-animation-code/



加入時間序列做法

TimelineMax 中有個很好用的作法,使用 add or to 加入Timeline的variable。如果有多項動畫變量,則會依序執行,省去了使用callback或是其他麻煩方式。


code

//create a timeline instance

var tl = new TimelineMax();

//the following two lines do the SAME thing:

tl.add( TweenMax.to("#id", 2, {x:100}) );

tl.to("#id", 2, {x:100}); //shorter syntax!


=======

Method Chaining

如同依序加入,chaining 也是同樣方式,但是更加簡單清楚有效率,就是一次將所有tween加入,也同樣有依序地效果。


code

var tl = new TimelineMax();

//chain all to() methods together on one line

tl.to(".green", 1, {x:200}).to(".orange", 1, {x:200, scale:0.2}).to(".grey", 1, {x:200, scale:2, y:20});


//we recommend breaking each to() onto its own line for legibility

tl.to(".green", 1, {x:200})

  .to(".orange", 1, {x:200, scale:0.2})

  .to(".grey", 1, {x:200, scale:2, y:20});


=======

進階 Timeline 技巧

延遲屬性

在前面3個屬性之後,第4個屬性即為時間控制屬性

  • "+=1" : 前一個動畫結束後1秒開始播放

  • "-=0.5" : 與前一個動畫重疊0.5秒,即是提前0.5秒播放

  • 6 : 如果沒有括弧,只有數字即為從整個tween開始算起,6秒後開始播放。


code

tl.to(element, 1, {x:200})

  //1 second after end of timeline (gap)

  .to(element, 1, {y:200}, "+=1")

  //0.5 seconds before end of timeline (overlap)

  .to(element, 1, {rotation:360}, "-=0.5")

  //at exactly 6 seconds from the beginning of the timeline (absolute)

  .to(element, 1, {scale:4}, 6);


======

add label 同時播放


code

//create a TimelineMax and make it repeat 3 times with 1 second between iterations

var tl = new TimelineMax({repeat:3, repeatDelay:1});


tl.to(".green", 1, {x:200})

 //start 1 second after previous tween ends (gap)

 .to(".orange", 1, {x:200, scale:0.2}, "+=1")

 //add a label at the end

 .addLabel("greyAndPink")

 //start both of these animations at the same time, at the "greyAndPink" label.

 .to(".grey", 1, {x:200, scale:2, y:20}, "greyAndPink")

 .to(".pink", 1, {x:200, rotation:360}, "greyAndPink");


=======

Timeline 時間控制

控制方式與 Tween 相同


以下是較為特殊之屬性

  • repeat: 重複播放次數

  • repeatDelay: 重複播放之間隔延遲(秒)

  • yoyo: if true,動畫重複播放將會正播、倒轉交替。

  • delay: 在整個 Timeline 動畫開始之前的延遲(秒)。

  • onComplete: 動畫完成後執行的 function

=======

4種時間軸 getter / setter 控制方式,基本上都是以“秒”為單位

  • time():經過時間

  • progress():0為開始,0.5為一半,1為結束

  • duration():動畫持續時間

  • delay():延遲








TimelineMax

  • add()

  • addLabel()

  • addPause()

  • call()

  • clear()

  • delay()

  • duration()

  • eventCallback

  • exportRoot()

  • from()

  • fromTo()

  • getChildren()

  • getLabelTime()

  • getTweensOf()

  • invalidate()

  • isActive()

  • kill()

  • pause() : 暫停動畫

  • paused():boolean 回傳是否為暫停狀態

  • play():播放動畫

  • progress()

  • remove()

  • removeLabel()

  • render()

  • restart():重新開始動畫

  • resume()

  • reverse():倒轉動畫

  • reversed():boolean 回傳是否已為倒轉狀態,執行倒轉動畫後值為 true,代表已倒轉。

true -> 正轉 -> false -> 倒轉 -> true。

所以初始值需為 true 第一次動畫才會正常執行。

  • seek()

  • set()

  • shiftChildren()

  • staggerFrom()

  • staggerFromTo()

  • staggerTo()

  • startTime()

  • time()

  • timeScale()

  • to()

  • totalDuration()

  • totalProgress()

  • totalTime()

  • useFrames()

Methods exclusive to TimelineMax

  • currentLabel()

  • getActive()

  • getLabelAfter()

  • getLabelBefore()

  • getlLabelsArray()

  • repeat(): -1 為 Infinite

  • repeatDelay():repeat 間隔

  • tweenFromTo()

  • tweenTo()

  • yoyo()



TweenMax

  • delay()

  • delayedCall()

  • duration()

  • eventCallback

  • from()

  • fromTo()

  • getTweensOf()

  • invalidate()

  • isActive()

  • kill()

  • killDelayedCallsTo()

  • killTweensOf()

  • pause()

  • paused()

  • play()

  • progress()

  • restart()

  • resume()

  • reverse()

  • reversed()

  • seek()

  • set()

  • startTime()

  • time()

  • timeScale()

  • to()

  • totalDuration()

  • totalProgress()

  • totalTime()

  • Methods exclusive to TweenMax

  • getAllTweens()

  • isTweening()

  • killAll()

  • killChildTweensOf()

  • pauseAll()

  • repeat()

  • repeatDelay()

  • resumeAll()

  • staggerFrom()

  • staggerFromTo()

  • staggerTo()

  • updateTo()

  • yoyo()


Post a Comment

較新的 較舊