Animação CSS
@keyframes
Define a sequência de animação especificando estilos em vários pontos:
Exemplo
HTML
<style>
@keyframes slideIn {
from {
transform: translateX(-100%);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
.slide-in {
animation: slideIn 0.5s ease-out;
}
</style>
<div class="slide-in">Deslizando da esquerda</div>
Propriedades de animation
Referência Rápida
| Propriedade | Valores | Finalidade |
|---|---|---|
animation-name |
@keyframes name |
Nome da animação |
animation-duration |
1s, 500ms |
Quanto tempo a animação leva |
animation-timing-function |
ease, linear, ease-in, ease-out |
Curva de velocidade |
animation-delay |
0.5s, -1s |
Atraso antes de começar |
animation-iteration-count |
1, 2, infinite |
Número de reproduções |
animation-direction |
normal, reverse, alternate |
Direção de reprodução |
animation-fill-mode |
none, forwards, backwards, both |
Estilo antes/depois |
Abreviação
CSS
.animation {
animation: slideIn 0.5s ease-out 0.2s infinite alternate forwards;
/* name duration timing-function delay iteration-count direction fill-mode */
}
Animações Comuns
Fade In
Exemplo
HTML
<style>
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
.fade-in {
animation: fadeIn 1s ease-in;
}
</style>
<div class="fade-in">Animação de fade in</div>
Bounce
Exemplo
HTML
<style>
@keyframes bounce {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-20px); }
}
.bounce {
animation: bounce 1s infinite;
}
</style>
<div class="bounce">Elemento saltitante</div>
Spinner de Carregamento
Exemplo
HTML
<style>
@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.spinner {
width: 40px;
height: 40px;
border: 4px solid #f3f3f3;
border-top: 4px solid #3498db;
border-radius: 50%;
animation: spin 1s linear infinite;
}
</style>
<div class="spinner"></div>
Dicas de Desempenho
⚠️ Aviso de desempenho: Não anime muitos elementos de uma vez. Animar 20-30 elementos simultaneamente causa travamentos. Use
will-change para dizer aos navegadores quais elementos animarão, mas não abuse — elementos com will-change consomem memória GPU extra.
Melhores propriedades para animar:
transform(translate, scale, rotate)opacity
Evite animar:
width,height,margin,padding(causa reflow)box-shadow(caro para calcular)
❓ Perguntas Frequentes
Q Qual é a diferença entre @keyframes e transition?
R transition apenas lida com mudanças simples de "estado A para estado B". @keyframes pode definir múltiplos quadros-chave (0%, 50%, 100%) para animações complexas de múltiplas etapas. Efeitos simples de hover usam transition; efeitos complexos de reprodução automática usam @keyframes.
Q animation: infinite causará travamento?
R Uso razoável não. Mas não anime muitos elementos de uma vez (recomendado não mais que 20). Use `will-change` para dizer aos navegadores quais elementos mudarão, ajudando aceleração GPU. Se a página perder quadros, reduza elementos animados ou duração.
Q Elemento volta após animação — o que fazer?
R Defina `animation-fill-mode: forwards` — a animação mantém o estado do último quadro após terminar. O padrão é `none`, que retorna à posição inicial.
📖 Resumo
- Animações
@keyframessão mais poderosas quetransition— podem definir sequências de animação de múltiplas etapas - Através de sub-propriedades de
animation, controle contagem de reprodução, direção, atraso, modo de preenchimento, etc. - Priorize
transformeopacityem animações para melhor desempenho - Para loops infinitos (como spinners de carregamento), use
infinite
📝 Exercícios
- Crie uma animação de "bola saltitante" — bola cai, quica, enfraquece gradualmente (usando keyframes de múltiplas etapas).
- Crie um "loader giratório" — um anel girando continuamente (dica: border + border-top-color + border-radius + animation).
- Crie uma página de "fade-in deslizante": título desliza do topo, parágrafo de baixo, imagem da esquerda (animações diferentes).
- Crie um botão de "luz respirante" — brilho do botão em ciclo.



