Guias · 03

Componentes Animated

Renderize elementos comuns que vão até um destino, respondem a gestos e saem com elegância.

Animated.<tag>

Animated.div, Animated.button, Animated.svg e qualquer outra tag HTML ou SVG renderizam o elemento comum, sem wrapper. O style aceita valores, e transforms podem ser arrays como no React Native.

O movimento finito de transform e opacity nesses elementos, molas incluídas, pode rodar no navegador.

Preparando o exemplo…

seed, pose, poses e tempo

seed é o primeiro quadro, pose o destino atual (um objeto ou o nome de uma entrada de poses) e tempo um timing ou uma mola. Mudar só tempo não reproduz de novo um destino que não mudou.

onRest dispara quando o elemento chega.

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

Responda a gestos

respond mapeia gestos para destinos temporários: hover, focus, focusWithin, press, longPress, drag, inView e outros. Quando uma resposta termina, o elemento volta à sua pose de onde estiver.

onResponse informa cada borda, e respond={{ press: {} }} observa um gesto sem mudar nada visualmente.

Preparando o exemplo…

Compartilhe padrões com Animated.Scope

Animated.Scope passa um nome de pose, um tempo e padrões de animação para os elementos Animated dentro dele.

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

Seus próprios componentes

Animated.wrap(Component) — createAnimatedComponent no React Native — faz um componente que repassa a ref e se resolve em um único elemento DOM aceitar as mesmas 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 }] } }} />;

Pesquisar

Digite para pesquisar na documentação.