為 React DOM 打造的動態效果 · React Native Animated API

動態只寫一次。執行順暢,絕不崩壞。

Animated 把 React Native 的 Animated 帶到 Web。一個值驅動任意數量的元素而不必每一格都觸發 React 渲染,支援的動態由瀏覽器自己播放,每次中斷都從畫面上的當下狀態繼續。

安裝
npm install @kkwaenggwari/animated

一個時鐘值驅動全部 64 個形狀的漣漪。把指標移到舞台上試試看。

本版本的實測數據

在桌上型 PC 的無頭 Chrome 中以 1.0.0 建置測量。數據因裝置而異。 測量方法

  • 0.00ms400 個元素移動時每一格的 JavaScript

    Animated 元素上有限的 transform 與 opacity 動態由瀏覽器播放,頁面自己的影格回呼不做任何事。

  • 0.13ms一個值驅動 10,000 個元素時每一格的 JavaScript

    這個值只寫入一個 CSS 變數,每個元素都在 CSS 中由它推導出樣式。

  • 0動態進行中的 React 渲染

    值從不經過 React state。元件在 props 改變時渲染,而不是在影格改變時。

01 · 簡單

你熟悉的 API,用在一般的 React style 上

timing、spring、interpolate、loop 和 Animated.event 保留了 React Native 中的名稱與設定。值可以直接放進一般的 style prop,寫出第一個動態之前,不需要學任何特殊元件。

  • 把 Animated.View 改名為 Animated.div,就能移植 React Native 程式碼。
  • 一個值可以同時移動進度條、轉盤和一排卡片,每個都有自己的範圍。
  • useAnimated 負責管理動畫配方:掛載時開始、相依值改變時重新開始、卸載時清理。

正在準備範例…

與 React Native 相同的呼叫

Spinner.jsx
// React Native
<Animated.View style={{ transform: [{ rotate }] }} />

// React DOM with @kkwaenggwari/animated — the rest is identical
<Animated.div style={{ transform: [{ rotate }] }} />

const spin = useAnimatedValue(0);
const rotate = spin.interpolate({ inputRange: [0, 1], outputRange: ['0deg', '360deg'] });

Animated.loop(
  Animated.timing(spin, { toValue: 1, duration: 900, easing: Easing.linear, useNativeDriver: true }),
).start();

02 · 快速

不會每一格都觸發 React 渲染

Hook 的值就是一個 CSS 變數。線性內插與算術運算會變成該變數的精確 calc() 運算式,所以每一格只寫入一次,其餘交給瀏覽器推導。Animated.<tag> 元素上有限的 transform 與 opacity 動態由瀏覽器播放,不需要影格回呼。

  • 改變圓點的數量:計數器會顯示 React 每次變化只渲染一次,而不是每一格一次。
  • scope 讓值只在容器上寫入一次,而不是寫到每個元素上。
  • inspect(element) 會告訴你每個屬性走的是哪條路徑,以及原因。

正在準備範例…

03 · 穩定

隨時中斷,都能接著動。

新的目標會從元素在畫面上的位置開始,彈簧還會保留速度,所以中途反向時會順暢轉向,而不是先停下來。在 Hook 中宣告的控制器會在被取代與卸載時停止並釋放,伺服器端渲染的標記在 hydration 之後也會繼續動畫。

  • 快速點兩下:使用 spring 時軌跡會彎折,使用 timing 時會保持位置但開始一條新曲線。
  • 停止時值會停在原地,不會跳到結束狀態。
  • 卸載、切換路由或分頁隱藏後,都不會留下多餘的影格迴圈。

正在準備範例…

以 Animated 打造

需要完成品元件?Animated Chorus。

滾動的數字、移動的分頁醒目標示、進度、底部面板與動畫清單,可以直接放進 React 與 React Native。這三個此刻就在本頁執行。

前往 Animated Chorus

三分鐘上手

安裝套件,讓第一個值動起來,再挑一篇符合你眼前工作的指南。

npm install @kkwaenggwari/animated

搜尋

輸入關鍵字搜尋文件。