Анімація для React DOM · Animated API з React Native
Опишіть рух один раз. Він плавний і ніколи не ламається.
Animated переносить Animated із React Native у веб. Одне значення керує будь-якою кількістю елементів без рендеру React на кожен кадр, підтримуваний рух відтворює сам браузер, а будь-яке переривання продовжується з того, що на екрані.
npm install @kkwaenggwari/animatedОдне значення годинника керує брижами всіх 64 фігур. Проведіть вказівником над сценою.
Виміряно на цьому релізі
Виміряно на збірці 1.0.0 у headless Chrome на настільному PC. Числа залежать від пристрою. Як ми вимірювали
- 0.00msJavaScript за кадр, поки рухаються 400 елементів
Скінченний рух transform і opacity на елементах Animated відтворює браузер. Власні колбеки кадрів сторінки не виконують роботи.
- 0.13msJavaScript за кадр, коли одне значення керує 10 000 елементів
Значення записує одну CSS-змінну; кожен елемент виводить із неї свій стиль засобами CSS.
- 0Рендери React під час руху
Значення ніколи не проходять через стан React. Компоненти перемальовуються, коли змінюються ваші props, а не коли змінюється кадр.
01 · Просто
Знайомий API на звичайному style React
timing, spring, interpolate, loop і Animated.event зберігають назви й конфігурації React Native. Значення передається прямо у звичайний проп style, тож до першого руху не треба вивчати жодних особливих компонентів.
- Перенесіть код із React Native, перейменувавши
Animated.ViewнаAnimated.div. - Одне значення може водночас рухати смугу, циферблат і ряд карток — кожен зі своїм діапазоном.
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 на кожен кадр
Значення хука — це CSS-змінна. Лінійні інтерполяції й арифметика стають точними виразами calc() від цієї змінної, тож кожен кадр — один запис, а решту обчислює браузер. Скінченний рух transform і opacity на елементах Animated.<tag> відтворює браузер без колбеків кадрів.
- Змініть кількість точок: лічильник показує, що React рендерив один раз на зміну, а не на кадр.
scopeзаписує значення один раз у контейнер, а не в кожен елемент.inspect(element)повідомляє, який шлях використовує кожна властивість і чому.
Підготовка прикладу…
03 · Надійно
Переривайте будь-де. Рух продовжиться.
Нова ціль стартує з місця, де елемент перебуває на екрані, а пружина ще й зберігає швидкість, тож розворот на півдорозі плавний, без зупинки. Контролери, оголошені в хуці, зупиняються й звільняються під час заміни й демонтування, а розмітка, відрендерена на сервері, продовжує анімуватися після гідратації.
- Швидко натисніть двічі: зі
springтраєкторія вигинається, зtimingпозиція зберігається, але починається нова крива. - Зупинка лишає значення на місці; ніщо не стрибає в кінцевий стан.
- Жодних забутих циклів кадрів після демонтування, зміни маршруту чи прихованої вкладки.
Підготовка прикладу…
Що можна побудувати
Готові патерни з налаштовуваними параметрами й повним вихідним кодом.
Усі приклади- Магнітний докІконки збільшуються, коли повз проходить вказівник, розсуваючи сусідів, і заспокоюються, коли він іде.
moveInputfollowuseAnimatedCSSmultiply - Колода для свайпуПеретягніть верхню картку. За порогом вона відлітає, інакше пружинить назад.
dragInputuseAnimatedListenerAnimated.div - Спільна галереяПлитка розгортається в детальний вигляд і згортається назад у сітку.
Animated.SceneAnimated.Keepmove
Побудовано на Animated
Потрібен готовий компонент? Animated Chorus.
Числа, що прокручуються, підсвічування вкладок, що переміщується, прогрес, шторки й анімовані списки, які одразу вбудовуються в React і React Native. Ці три працюють на цій сторінці просто зараз.
Перейти до Animated ChorusПочніть за три хвилини
Встановіть пакет, зрушіть перше значення, а потім виберіть посібник для свого завдання.
npm install @kkwaenggwari/animated