Анімація для 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

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 на кожен кадр

Значення хука — це CSS-змінна. Лінійні інтерполяції й арифметика стають точними виразами calc() від цієї змінної, тож кожен кадр — один запис, а решту обчислює браузер. Скінченний рух transform і opacity на елементах Animated.<tag> відтворює браузер без колбеків кадрів.

  • Змініть кількість точок: лічильник показує, що React рендерив один раз на зміну, а не на кадр.
  • scope записує значення один раз у контейнер, а не в кожен елемент.
  • inspect(element) повідомляє, який шлях використовує кожна властивість і чому.

Підготовка прикладу…

03 · Надійно

Переривайте будь-де. Рух продовжиться.

Нова ціль стартує з місця, де елемент перебуває на екрані, а пружина ще й зберігає швидкість, тож розворот на півдорозі плавний, без зупинки. Контролери, оголошені в хуці, зупиняються й звільняються під час заміни й демонтування, а розмітка, відрендерена на сервері, продовжує анімуватися після гідратації.

  • Швидко натисніть двічі: зі spring траєкторія вигинається, з timing позиція зберігається, але починається нова крива.
  • Зупинка лишає значення на місці; ніщо не стрибає в кінцевий стан.
  • Жодних забутих циклів кадрів після демонтування, зміни маршруту чи прихованої вкладки.

Підготовка прикладу…

Побудовано на Animated

Потрібен готовий компонент? Animated Chorus.

Числа, що прокручуються, підсвічування вкладок, що переміщується, прогрес, шторки й анімовані списки, які одразу вбудовуються в React і React Native. Ці три працюють на цій сторінці просто зараз.

Перейти до Animated Chorus

Пошук

Почніть вводити, щоб шукати в документації.