本版本的實測數據
在桌上型 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 相同的呼叫
// 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