Felipe Moacir

Dominando Micro-interações com Framer Motion

ReactFramer MotionUI/UX
Dominando Micro-interações com Framer Motion

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.