Guide · 03

Componenti Animated

Renderizza elementi normali che si muovono verso una destinazione, rispondono ai gesti ed escono con eleganza.

Animated.<tag>

Animated.div, Animated.button, Animated.svg e ogni altro tag HTML o SVG renderizzano l’elemento normale senza wrapper. Il loro style accetta valori, e le trasformazioni possono essere array come in React Native.

Il movimento finito di transform e opacity su questi elementi, molle comprese, può essere riprodotto dal browser.

Preparazione dell’esempio…

seed, pose, poses e tempo

seed è il primo frame, pose la destinazione attuale (un oggetto o il nome di una voce in poses) e tempo un timing o una molla. Cambiare solo tempo non riproduce di nuovo una destinazione invariata.

onRest scatta quando l’elemento arriva.

Card.jsx
<Animated.article
  seed={{ opacity: 0, transform: [{ translateY: 16 }] }}
  pose={selected ? 'raised' : 'rest'}
  poses={{
    rest: { opacity: 1, transform: [{ translateY: 0 }, { scale: 1 }] },
    raised: { opacity: 1, transform: [{ translateY: -8 }, { scale: 1.04 }] },
  }}
  tempo={{ spring: { stiffness: 300, damping: 26 } }}
  onRest={() => console.log('arrived')}
/>;

Rispondi ai gesti

respond associa i gesti a destinazioni temporanee: hover, focus, focusWithin, press, longPress, drag, inView e altri. Quando una risposta termina, l’elemento torna alla sua pose da dovunque si trovi.

onResponse segnala ogni inizio e fine, e respond={{ press: {} }} osserva un gesto senza cambiare nulla a livello visivo.

Preparazione dell’esempio…

Condividi i valori predefiniti con Animated.Scope

Animated.Scope passa un nome di pose, un tempo e valori predefiniti di animazione agli elementi Animated al suo interno.

Menu.jsx
<Animated.Scope tempo={{ spring: { stiffness: 380, damping: 30 } }}>
  <Animated.li pose={{ opacity: 1 }} />
  <Animated.li pose={{ opacity: 1 }} />
</Animated.Scope>;

I tuoi componenti

Animated.wrap(Component) — createAnimatedComponent in React Native — fa accettare le stesse props a un componente che inoltra il ref e si risolve in un solo elemento DOM.

Link.jsx
import { forwardRef } from 'react';
import { Animated } from '@kkwaenggwari/animated';

const Link = forwardRef((props, ref) => <a ref={ref} {...props} />);
const AnimatedLink = Animated.wrap(Link);

<AnimatedLink href="/pricing" respond={{ hover: { transform: [{ translateX: 4 }] } }} />;

Cerca

Scrivi per cercare nella documentazione.