Guides · 03

Composants Animated

Rendre des éléments ordinaires qui se déplacent vers une destination, réagissent aux gestes et sortent avec élégance.

Animated.<tag>

Animated.div, Animated.button, Animated.svg et toute autre balise HTML ou SVG rendent l’élément ordinaire, sans enveloppe. Leur style accepte des valeurs, et les transforms peuvent être des tableaux comme dans React Native.

Les mouvements finis de transform et opacity sur ces éléments, ressorts compris, peuvent être joués par le navigateur.

Préparation de l’exemple…

seed, pose, poses et tempo

seed est la première image, pose la destination actuelle (un objet ou le nom d’une entrée de poses) et tempo un timing ou un ressort. Changer seulement tempo ne rejoue pas une destination inchangée.

onRest se déclenche quand l’élément arrive.

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')}
/>;

Réagir aux gestes

respond associe des gestes à des destinations temporaires : hover, focus, focusWithin, press, longPress, drag, inView et d’autres. Quand une réponse se termine, l’élément revient à sa pose depuis là où il se trouve.

onResponse signale chaque front, et respond={{ press: {} }} observe un geste sans rien changer visuellement.

Préparation de l’exemple…

Partager des valeurs par défaut avec Animated.Scope

Animated.Scope transmet un nom de pose, un tempo et des valeurs d’animation par défaut aux éléments Animated qu’il contient.

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

Vos propres composants

Animated.wrap(Component) — createAnimatedComponent dans React Native — permet à un composant qui transmet sa ref et se résout en un seul élément DOM d’accepter les mêmes props.

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 }] } }} />;

Rechercher

Tapez pour rechercher dans la documentation.