A diferença entre um site bom e um site memorável reside nos detalhes. Micro-interações não são apenas "enfeites"; elas são o feedback tátil do mundo digital.
Neste guia definitivo, vamos dissecar como criar interfaces que "respondem" ao usuário com peso e física real, utilizando a biblioteca mais poderosa do ecossistema React: Framer Motion.
1. A Física da Animação
No mundo real, nada começa ou para instantaneamente. Tudo tem massa e inércia. Para replicar isso na web, abandonamos as curvas de Bézier lineares (ease-in-out) e abraçamos as Springs (Molas).
Uma mola é definida por rigidez (stiffness), amortecimento (damping) e massa (mass).
// Exemplo de configuração de mola "Magnética"
const springConfig = {
type: "spring",
stiffness: 150, // Quão "dura" é a mola
damping: 15, // Quão rápido ela para de oscilar
mass: 0.1 // Peso do objeto
}
2. Layout Animations: O Segredo da Fluidez
Uma das tarefas mais difíceis em CSS puro é animar elementos que mudam de posição no DOM (ex: reordenar uma lista). O Framer Motion resolve isso com uma única prop mágica: layout.
Ao adicionar layout a um componente motion.div, a biblioteca calcula automaticamente a diferença de geometria (FLIP technique) e cria uma transição suave.
Exemplo Prático: Lista Filtrável
Imagine uma galeria de projetos que se reorganiza.
<motion.div layout className="grid-container">
{items.map(item => (
<motion.div
layout
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
key={item.id}
>
{item.content}
</motion.div>
))}
</motion.div>
"A animação de layout é o que separa apps nativos de páginas web comuns."
3. Gestures: Toque e Arraste
Interfaces modernas são táteis. O usuário quer sentir o controle.
<motion.button
whileHover={{ scale: 1.05 }}
whileTap={{ scale: 0.95 }}
drag
dragConstraints={{ left: 0, right: 300 }}
>
Arraste-me
</motion.button>
Isso cria uma sensação de profundidade imediata. Combine isso com efeitos sonoros sutis e feedback háptico (em mobile) para uma experiência de elite.
4. Orquestração com Variants
Para animações complexas onde vários filhos dependem do pai (ex: um menu que abre e os links entram em cascata), usamos Variants.
const menuVariants = {
open: {
transition: { staggerChildren: 0.07, delayChildren: 0.2 }
},
closed: {
transition: { staggerChildren: 0.05, staggerDirection: -1 }
}
};
const itemVariants = {
open: { y: 0, opacity: 1 },
closed: { y: 50, opacity: 0 }
};
Conclusão
Animação não é sobre fazer coisas se moverem. É sobre guiar a atenção do usuário e criar uma continuidade espacial. Use com propósito.