這週是 六角鼠年鐵人賽 第四週,之前沒碰過 TweenMax,但 GSAP 已經升級 GSAP3,就簡單研究一下 GSAP3。
GSAP3
GSAP 是 GreenSock Animation Platform 的簡稱,是一套專門處理動畫與特效的 JS 套件。
GSAP 採用模組化與插件式的結構,保持了核心引擎的輕量。有四個核心 API,TweenLite、TimelinLite、TimelineMax、TweenMax,而 TweenMax 是所有 API 與 Plugin 的集合。
但 2019年底 GSAP 從 GSAP2 升級到 GSAP3,不再區分 TweenLite、TimelineLite、TimelineMax、TweenMax,全部合並為 gsap 物件。
GSAP3 的優點:
- 檔案大小為 TweenMax 的一半,但新增了 50多個功能。
- 全部合並為 gsap 物件,不用在區分 TweenLite 和 TimelineMax 物件。
- 新版本相容舊版本寫法,所以可以沿用,新寫法提供更好的可讀性。
官網:
下載安裝
npm install gsap
// or
yarn add gsap
CDN
https://cdnjs.cloudflare.com/ajax/libs/gsap/3.1.1/gsap.min.js
版本差異
1. gsap 物件
原本須要用 Tweens(補間),就要使用 TweenLite/TweenMax 物件。要用到 Timelines(時間軸),就要使用 TimelineLite/TimelineMax 物件。
GSAP3 統一使用 gsap 物件。gsap 物件,具有各種方法和屬性,可用來創建 Tweens(補間)和 Timelines(時間軸)。
舊的 Tween 的創建方式:
|
|
現在統一使用 gsap 物件:
|
|
舊的 Timeline 的創建方式:
|
|
現在 Timeline 一樣也只需要使用 gsap 物件:
|
|
2. duration 參數
原來的寫法 duration 為方法的參數:
|
|
新寫法被整合到了 vars 物件中了:
|
|
擁有更佳的可讀性。
3. Timeline 預設值
原本的 Timeline 寫法:
|
|
使用新的寫法,如有有相同的參數,可以設定預設值:
|
|
4. 交錯屬性
原本交錯動畫,要使用到額外的方法創建 Tween 實體,例如staggerTo()、staggerFrom()、staggerFromTo():
|
|
現在只需要設置 stagger 屬性即可:
|
|
5. 全新的亂數功能
1 ~ 400 之間:
|
|
隨機選擇一個數字,可以使用陣列表示:
|
|
6. 全新的影格功能 Keyframes
大家一定都知道 CSS 動畫的 keyframes。那 GSAP 中的 keyframes 是什麼?
原本要建立一連串的動畫(例如,先移動,再下移,最後旋轉),需要為每個動作建立 Tween 或使用 Timeline。而 keyframes 可以在同一個 Tween 內完成。
|
|
7. 全新的 repeatRefresh
開啟 repeatRefresh: true,會在重複執行時(設定 repeat),紀錄當前狀態再執行,而不會回到初始狀態。
|
|
8. 全新的全域動畫
Global timeline 可以控制全部的動畫實體。
|
|
9. 新的動畫輔助工具
gsap.utils.checkPrefix()gsap.utils.clamp()gsap.utils.distribute()gsap.utils.getUnit()gsap.utils.interpolate()gsap.utils.mapRange()gsap.utils.normalize()gsap.utils.pipe()gsap.utils.random()gsap.utils.snap()gsap.utils.splitColor()gsap.utils.toArray()gsap.utils.unitize()gsap.utils.wrap()gsap.utils.wrapYoyo()
10. 相對動畫時間
原本會需要標籤來添加相對動畫時間:
|
|
GSAP3 新增了最近的動畫時間:
>:最近添加的動畫的開始時間<:最近添加的動畫的結束時間
|
|
補間動畫 Tween
補間是 flash 時代的專業詞彙,意思是在起始狀態和終點狀態之間補全中間過程。
包含四個要素:
- 動畫目標(target)
- 起始狀態
- 終點狀態
- 補間效果
1. 創建 Tween
創建 Tween 的常用方法(所有這些方法都會回傳 Tween 實體):
參數說明:
target:需要動畫的元素target使用document.querySelectorAll(),所有符合的 CSS 選擇器都會是設置動畫的對象。- 如果有多個元素對象,則使用陣列
[element1, element2]
vars:設置補間效果及屬性狀態
Timeline
Timeline 就是「時間軸」,可以用來控制、管理一連串的動畫。
- 控制多段動畫 / 序列動畫
- 自由與重疊排序
- 添加 Tag 掌握動畫片段
舉例來說,我們要對多個元素作一連串的動畫,需要建立多個 Tween 並用 delay 設置延遲時間,非常麻煩:
|
|
而且還無法對這一連串的動畫做控制。點我看範例。
這時候可以使用 Timeline,建立一個時間軸,來管理這些動畫。
|
|
如果有相同動畫狀態,可以設定預設值,使程式碼更簡潔:
|
|
1. 在時間軸中放置動畫
在時間軸建立動畫:
to()fromfromToset()
|
|
Timeline 可以鏈式呼叫:
|
|
在時間軸中,加入一段已建立的動畫,使用 add():
|
|
Timeline 許多方法都多 position 參數,可用來控制動畫插入點:
- 無設置:時間軸末尾
1:絕對時間,指定時間處'+=1'、-=1:相對時間,相對於時間軸的結尾'someLabel':指定標籤處(建立標籤使用addLabel())‵someLabel+=1'、‵someLabel-=1':相對於指定標籤<:最近動畫的開頭>:最近動畫的結尾<1、<-1:相對於最近動畫的開頭>1、>-1:相對於最近動畫的結尾
|
|
基本用法
1. 數字動畫 0~100
最基本的用法,對物件的屬性去做變化。
2. CSS 動畫
3. 動畫控制
.play():播放動畫.pause():暫停動畫播放.paused():獲取或設置動畫暫停狀態myAnimation.paused(!myAnimation.paused())暫停動畫切換
.resume():繼續動畫播放.restart():重新開始動畫.reverse():反轉播放動畫.reversed():獲取或設置動畫反轉狀態myAnimation.reversed( !myAnimation.reversed() )動畫撥放方向切換。
.seek():不改變狀態下,跳至動畫某個時間點
4. 重複撥放、來回撥放
|
|
5. 錯開動畫
|
|
6. 週期
GSAP2 的 cycle 屬性,被 GSAP3 的 gsap.utils.wrap() 給取代,而且更加靈活。