為什麼選擇 GSAP?
原本想直接選跟 React 最契合的 framer motion,但發覺要學不如就學最泛用的 GSAP,未來若寫 React 以外的框架時也會用到
特性 |
GSAP |
Framer Motion |
動畫方式 |
採用命令式方法,開發者需要詳細描述動畫的每個步驟 |
採用宣告式方法,動畫的狀態和過程更易於理解 |
React 整合 |
需要額外的封裝或插件來與 React 整合 |
專為 React 設計,與 React 元件無縫整合 |
學習曲線 |
功能強大,但需要更多時間學習和掌握 |
上手容易,適合需要快速實現動畫效果的開發者 |
性能 |
提供高性能的動畫效果,適用於複雜的動畫需求 |
處理非常複雜的動畫時可能不如 GSAP |
社群與資源 |
擁有龐大的社群和豐富的插件資源,適用於多種平台和框架 |
社群資源主要集中在 React 生態系統。 |
安裝與設定
1 2
| npm install gsap npm i @gsap/react
|
現在要額外使用 ScrollTrigger
動畫已不用額外在 npm install gsap/ScrollTrigger,直接 import { ScrollTrigger } from "gsap/ScrollTrigger";
即可
建立基本動畫(舊寫法) - useEffect
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| import { useEffect, useRef } from "react";
import gsap from "gsap"; import { ScrollTrigger } from "gsap/ScrollTrigger"; ...
const HomePage = () => { const heroRef = useRef(null);
useEffect(() => { const ctx = gsap.context(() => { if (latestNewsRef.current) { gsap.fromTo( latestNewsRef.current, { opacity: 0, x: -100 }, { opacity: 1, x: 0, duration: 1.2, ease: "power3.out", scrollTrigger: { trigger: latestNewsRef.current, start: "top 75%", end: "bottom 25%", toggleActions: "play none none reverse", } } ); } }); return () => { ctx.revert(); ScrollTrigger.getAll().forEach(trigger => trigger.kill()); }; }, []);
return ( <div ref={heroRef}> <HeroCarouselSection /> </div> );
|
以上是還在用useEffect()
是舊的寫法
可參考:https://www.npmjs.com/package/@gsap/react
新寫法 - useGSAP
前面指令多 npm i @gsap/react
,就是為了這個 GSAP 官方提供的 React hook,提供更多些便利性,包括:
- 自動清理:當組件卸載時自動清理動畫
- 簡化上下文處理:更容易建立和管理 GSAP 上下文
- 更好的 React 集成:專為 React 的生命週期設計
現代寫法直接使用 useGSAP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| useGSAP(() => { if (newProductsRef.current) { gsap.fromTo( newProductsRef.current, { scale: 1.2, opacity: 0, x: 100 }, { scale: 1, opacity: 1, x: 0, duration: 1.5, ease: "power4.out", scrollTrigger: { trigger: newProductsRef.current, start: "top 85%", end: "bottom 15%", toggleActions: "restart none none reverse", }, } ); }, { scope: containerRef } );
|
所以有
動畫屬性與方法
- 基本動畫應用
- 高級動畫技巧
- 實戰範例
- 結論
若您覺得這篇文章對您有幫助,歡迎分享出去讓更多人看到⊂◉‿◉つ~
留言版