Guías · 03

Componentes Animated

Renderiza elementos normales que se mueven a un destino, responden a gestos y salen con elegancia.

Animated.<tag>

Animated.div, Animated.button, Animated.svg y cualquier otra etiqueta HTML o SVG renderizan el elemento normal sin envoltorio. Su style acepta valores, y los transforms pueden ser arrays como en React Native.

El movimiento finito de transform y opacity en estos elementos, resortes incluidos, puede reproducirse en el navegador.

Preparando el ejemplo…

seed, pose, poses y tempo

seed es el primer fotograma, pose el destino actual (un objeto o el nombre de una entrada de poses) y tempo un timing o un resorte. Cambiar solo tempo no vuelve a reproducir un destino que no ha cambiado.

onRest se dispara cuando el elemento llega.

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

Responde a gestos

respond asigna gestos a destinos temporales: hover, focus, focusWithin, press, longPress, drag, inView y más. Cuando termina una respuesta, el elemento vuelve a su pose desde donde esté.

onResponse informa de cada flanco, y respond={{ press: {} }} observa un gesto sin cambiar nada visualmente.

Preparando el ejemplo…

Comparte valores por defecto con Animated.Scope

Animated.Scope pasa un nombre de pose, un tempo y valores por defecto de animación a los elementos Animated que contiene.

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

Tus propios componentes

Animated.wrap(Component) —createAnimatedComponent en React Native— hace que un componente que reenvía la ref y se resuelve en un solo elemento DOM acepte las mismas 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 }] } }} />;

Buscar

Escribe para buscar en la documentación.