問題重點
由於專案使用 GSAP 而非 framer motion 導致 shadcn/ui 的 accordion 元件在此專案中是沒有展開/收起動畫的,因此需用 GSAP 自行製作動畫效果
GSAP 動畫建構重點
以下 shadcn/ui 官方的寫法,若專案有 framer motion 應能直接使用
1 | return ( |
經過思考,得出兩個解決方案:
- 第一個版本:完全自定義的 Accordion 實現,使用 GSAP 處理所有動畫效果。
- 第二個版本:繼續使用 Shadcn UI 的 Accordion 組件,但通過包裝內容元素和使用 GSAP 增強動畫效果。
為了能以最有效率的方式開發此專案,最終選擇了第二個版本
第二個版本
- 添加了一個包裝 div 並設置 ref,這樣 GSAP 可以直接對其進行動畫處理
- 使用 onValueChange 事件來觸發 GSAP 動畫
- 保留了原有的 Shadcn UI 組件結構
程式碼解析:
el
是這個 div 元素本身contentRefs.current
是一個物件,它存放了所有AccordionContent
的 ref- 這樣就可以透過
contentRefs.current[service.id]
取得對應的 DOM,用來做動畫。。
1 | return ( |
GSAP 動畫程式碼
幾個重點首先是宣告 contentRefs
來存儲每個 AccordionContent
的 DOM 元素,方便 GSAP 控制動畫效果
1 | const contentRefs = useRef<{ [key: string]: HTMLDivElement | null }>({}); |
GSAP 動畫處理函數:
- 展開 →
height: "auto", opacity: 1
- 收起 →
height: 0, opacity: 0
- 使用 power2.in 緩動函數來改善收起效果
1 | // 追蹤 accordion 展開狀態的變化 |
成果展示
若您覺得這篇文章對您有幫助,歡迎分享出去讓更多人看到⊂◉‿◉つ~
留言版