核心概念

Popmotion 是一個低階 JavaScript 動畫函式庫,以「library behind the library」定位著稱——它是 Framer Motion 的底層引擎,開發者可直接使用,也可以作為構建高階動畫框架的基礎。

三種核心動畫類型

類型 說明 參數
Keyframes 預設類型,定義起點到終點或多段關鍵幀序列 fromtotimes、緩動函數
Spring 物理模擬彈簧動畫,產生自然彈性感 stiffness(剛度)、damping(阻尼)、mass(質量)、velocity
Inertia / Decay 模擬慣性衰減,常見於滾動慣性效果 velocitypowertimeConstant

核心 API

// 基礎 keyframe 動畫
animate({ from: 0, to: 100, onUpdate: v => element.style.opacity = v })

// Spring 動畫(彈性效果)
animate({
  from: 0, to: 500,
  type: "spring",
  stiffness: 500, damping: 30, mass: 1,
  onUpdate: v => element.style.x = v
})

// 多段關鍵幀
animate({
  to: [0, 100, 0],
  duration: 1000,
  onUpdate: v => console.log(v)
})

支援的數值類型

Popmotion 可動畫化三種資料類型:

  • 數字:位移、透明度、縮放比例
  • 顏色:RGB、HSL、十六進制格式,透過 mixColor 處理
  • 複雜字串box-shadowborder-radius、SVG 路徑等 CSS 複合值

輔助工具集

  • 幾何運算:angledistancepointFromVector
  • 插值:interpolatemixmixComplex
  • 約束工具:clampsnapwrap
  • 函數組合:pipe

關鍵要點

  • 輕量animate 函數僅約 4.5kb,每個函數可單獨 import,不需引入整個函式庫
  • Framer Motion 底層引擎:Framer Motion 建構在 Popmotion 之上,若需要更低階控制可直接使用 Popmotion
  • TypeScript 原生:完全以 TypeScript 撰寫,95% 以上測試覆蓋率,生產環境穩定性高
  • 智能類型偵測animate() 函數會自動偵測動畫類型(數字 vs 顏色 vs 複雜字串),減少設定負擔
  • Spring 參數調整邏輯stiffness 越高動畫越快速,damping 越低彈跳感越強,mass 增加會讓動畫感覺更「重」
  • 無 DOM 依賴:可在任何接受數字輸入的 API 上使用,不限於瀏覽器環境

實務應用

何時選擇 Popmotion 而非高階庫

  • 需要完全自訂動畫邏輯,不想受框架限制
  • 構建自己的動畫系統或元件庫
  • 需要在非 React 環境中使用物理動畫(Framer Motion 限定 React)
  • 對 bundle size 敏感,只需要特定動畫功能

與競品定位比較

定位 bundle size 學習曲線
GSAP 功能最完整、商業授權 較大 中等
Anime.js 入門友善、文件豐富
Popmotion 低階、可組合、TypeScript ~4.5kb 中等
Framer Motion React 高階封裝(底層用 Popmotion) 較大

典型場景

  • Hover 互動效果與 UI 微動畫
  • 頁面轉場動畫
  • 模擬智慧型手機滾動慣性(inertia
  • SVG 路徑或複雜 CSS 值的動畫插值

延伸觀點

根據三篇跨來源文章的交叉驗證,有幾個在官方文件中較少強調的觀點值得注意:

「低階即彈性」的設計哲學
Popmotion 刻意維持低階設計,不封裝 DOM 操作,而是只輸出計算後的數值(透過 onUpdate 回調)。這讓它能接入任何渲染層——Canvas、WebGL、Three.js、甚至 Web Audio API——而不只是 CSS 動畫。兩篇文章均強調此特性,是與 Anime.js、GSAP 最根本的設計差異。

Framer Motion 關係的實際意義
Popmotion 作為 Framer Motion 底層引擎這一點,在多篇文章中被共同提及。實務意義是:若你已在用 Framer Motion 但遇到無法繞過的限制,可以降層到 Popmotion 直接使用相同的物理動畫計算邏輯,而無需引入不同生態系的庫。

Spring 動畫的效能盲點
收集的資料中普遍缺乏效能基準,值得注意:Spring 動畫是物理模擬,不像 CSS transition 可以 GPU 加速,高頻率更新(60fps)下複雜場景需要手動控制更新範圍或搭配 will-change 提示,避免主線程過載。