Animações em React com Framer Motion: guia prático
Animações em React com Framer Motion: guia prático
Para criar animações em React com Framer Motion, instale a biblioteca, troque o elemento HTML pelo equivalente motion (por exemplo, motion.div) e descreva o estado inicial e o final nas props initial e animate. A biblioteca cuida da interpolação, da física e da performance. Hoje ela se chama Motion e é importada de motion/react, mas o nome Framer Motion continua sendo o mais pesquisado.
O que é o Framer Motion (Motion) e quando usar
Framer Motion é uma biblioteca de animação declarativa para React. Em vez de escrever keyframes em CSS ou controlar requestAnimationFrame na mão, você descreve o resultado desejado e a biblioteca anima a transição. O projeto hoje é mantido sob o nome Motion, com documentação em motion.dev, e funciona em projetos React com Vite.
Vale usar quando você precisa de:
- Animações de entrada e saída de componentes, como modais, menus e toasts.
- Gestos como hover, tap e drag com feedback fluido.
- Transições de layout, quando a posição ou o tamanho de um elemento muda.
- Animações disparadas pelo scroll, comuns em landing pages.
Para efeitos simples, como mudar a cor de um botão no hover, o CSS com Tailwind (transition, hover:) continua sendo a opção mais leve. Use a biblioteca quando a animação depender de estado, sequência ou física.
Como instalar e criar a primeira animação
Em um projeto com React e Vite, a instalação leva um comando:
npm install motion
Depois, importe o componente e anime:
import { motion } from "motion/react";
export function Card() {
return (
<motion.div
initial={{ opacity: 0, y: 24 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5, ease: "easeOut" }}
>
Conteúdo do card
</motion.div>
);
}
O elemento nasce transparente e 24 pixels abaixo da posição final, e então sobe suavemente. Essa é a base de qualquer animação em React com Framer Motion: initial define o ponto de partida, animate o destino e transition o como.
Animações de hover e clique
As props whileHover e whileTap aplicam um estado enquanto o usuário interage:
<motion.button whileHover={{ scale: 1.05 }} whileTap={{ scale: 0.97 }}>
Solicitar orçamento
</motion.button>
Esse tipo de microinteração melhora a percepção de qualidade de botões e cards sem exigir CSS extra.
Animar entrada e saída com AnimatePresence
No React, quando um componente é desmontado ele some na hora, sem chance de animar a saída. O AnimatePresence resolve isso: ele mantém o elemento na tela até a animação exit terminar.
import { AnimatePresence, motion } from "motion/react";
<AnimatePresence>
{aberto && (
<motion.div
key="modal"
initial={{ opacity: 0, scale: 0.95 }}
animate={{ opacity: 1, scale: 1 }}
exit={{ opacity: 0, scale: 0.95 }}
/>
)}
</AnimatePresence>
Lembre-se de dar uma key única a cada filho direto. Sem ela, o AnimatePresence não consegue identificar qual elemento está saindo.
Layout, scroll e variants
Três recursos cobrem a maior parte dos casos em sites e landing pages:
- Layout animations: adicione a prop
layoute o elemento anima sozinho quando muda de posição ou tamanho, útil em listas filtráveis e acordeões. - Animações no scroll:
whileInViewdispara a animação quando o elemento entra na tela. Combine comviewport={{ once: true }}para animar uma única vez. - Variants: objetos nomeados de estados que permitem orquestrar vários elementos filhos com
staggerChildren, criando efeito de cascata em listas e grids.
Performance e acessibilidade
Animações bonitas não podem custar velocidade nem excluir usuários. Siga estas práticas:
- Prefira animar
opacityetransform(x,y,scale,rotate), que são mais baratas para o navegador do que propriedades comowidthoutop. - Respeite a preferência de movimento reduzido do sistema com o hook
useReducedMotion, que informa se o usuário pediu menos animação. Essa é uma recomendação de acessibilidade da WCAG para conteúdo com movimento. - Anime apenas o que agrega valor. Excesso de movimento distrai e pode piorar métricas como o CLS dos Core Web Vitals.
- Considere o
LazyMotionpara carregar só os recursos que você usa e reduzir o tamanho do bundle.
Perguntas Frequentes
Framer Motion e Motion são a mesma biblioteca?
Sim. O projeto passou a se chamar Motion e é importado de motion/react, mas a API de componentes como motion.div segue a mesma lógica que ficou conhecida como Framer Motion.
Framer Motion funciona com Vite e Tailwind? Funciona. Basta instalar o pacote via npm. Você pode combinar classes do Tailwind para estilo com as props de animação da biblioteca no mesmo elemento.
Framer Motion deixa o site lento?
Não necessariamente. Animar opacity e transform, usar LazyMotion e evitar animações em excesso mantêm o site rápido. O risco aparece ao animar propriedades de layout em muitos elementos ao mesmo tempo.
Quando usar CSS em vez de Framer Motion? Use CSS para transições simples de hover e foco. Prefira a biblioteca para saída de componentes, animações de layout, sequências e gestos como arrastar.
Conclusão
Dominar animações em React com Framer Motion se resume a poucas ideias: initial, animate, exit, AnimatePresence e whileInView. Comece com microinterações discretas, respeite o movimento reduzido e meça o impacto na performance. Na Stormcore, criamos sites e landing pages em React com animações que reforçam a marca sem sacrificar velocidade, e também atuamos com automações, sistemas e gestão de redes sociais.
Matérias relacionadas

E-mail Profissional para Empresa: Como Criar e Escolher

Paginação com Supabase e React: guia com range()

IA para criar apresentações: guia prático para empresas

Canal de Transmissão do Instagram para Empresas: Guia

Gerenciador de Senhas para Empresas: Como Escolher

Dark Mode com Tailwind CSS no React: Guia Passo a Passo
Pronto para tirar sua ideia do papel?
Fale agora com nosso time de desenvolvimento. Sites, apps, automações, o que você precisar.
Chamar no WhatsAppResposta em até 2 horas