Ao final desta aula, você será capaz de:
As animações CSS representam um avanço em relação às transições, permitindo criar efeitos visuais mais complexos e controlados. Enquanto as transições são limitadas a mudanças de estado entre início e fim, as animações permitem definir múltiplos pontos intermediários e sequências de alterações de estilo.
Com animações CSS, você consegue:
As animações CSS são renderizadas diretamente pelo navegador, sem necessidade de JavaScript, o que geralmente resulta em melhor performance, especialmente em dispositivos móveis.
O coração das animações CSS é a regra @keyframes
, que permite definir os estados da animação em diferentes pontos percentuais do seu tempo total de execução.
@keyframes nomeDaAnimacao {
0% {
/* Estado inicial */
opacity: 0;
transform: scale(0.5);
}
50% {
/* Estado intermediário */
opacity: 0.5;
transform: scale(0.75);
}
100% {
/* Estado final */
opacity: 1;
transform: scale(1);
}
}
Após definir os keyframes, você aplica a animação a um elemento usando a propriedade animation
ou suas propriedades individuais:
.elemento {
animation-name: nomeDaAnimacao;
animation-duration: 2s;
animation-timing-function: ease-in-out;
animation-delay: 0.5s;
animation-iteration-count: 3;
animation-direction: alternate;
animation-fill-mode: forwards;
}
Ou usando a forma abreviada:
.elemento {
/* nome duração timing-func atraso iterações direção fill-mode */
animation: nomeDaAnimacao 2s ease-in-out 0.5s 3 alternate forwards;
}
O CSS oferece diversas propriedades para controlar com precisão como as animações são executadas:
Propriedade | Descrição | Valores |
---|---|---|
animation-name |
Define qual animação @keyframes aplicar | nome da animação |
animation-duration |
Tempo que a animação leva para completar um ciclo | tempo em s ou ms |
animation-timing-function |
Como a animação progride ao longo do tempo | ease, linear, ease-in, ease-out, ease-in-out, cubic-bezier() |
animation-delay |
Atraso antes da animação começar | tempo em s ou ms |
animation-iteration-count |
Quantas vezes a animação se repete | número ou infinite |
animation-direction |
Se a animação alterna direção a cada ciclo | normal, reverse, alternate, alternate-reverse |
animation-fill-mode |
Como aplicar estilos antes/depois da animação | none, forwards, backwards, both |
animation-play-state |
Se a animação está em execução ou pausada | running, paused |
O animation-fill-mode
é crucial para determinar se o elemento manterá o estado final da animação (forwards
) ou voltará ao estado inicial (none
).
@keyframes slideIn {
from {
transform: translateX(-100%);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
.elemento {
animation: slideIn 1s forwards;
}
@keyframes rotate {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.elemento {
animation: rotate 4s linear infinite;
}
@keyframes bounce {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-20px); }
}
.elemento {
animation: bounce 1s ease infinite;
}
@keyframes colorChange {
0% { background-color: #6d28d9; }
25% { background-color: #2563eb; }
50% { background-color: #059669; }
75% { background-color: #d97706; }
100% { background-color: #dc2626; }
}
.elemento {
animation: colorChange 8s linear infinite;
}
Tente combinar múltiplas animações! É possível aplicar várias animações ao mesmo elemento separando-as por vírgulas:
.elemento {
animation:
bounce 2s infinite,
colorChange 5s linear infinite;
}
As animações podem ser iniciadas ou alteradas por interações do usuário, combinando-as com pseudoclasses como :hover
, :focus
, ou :active
.
.shake-box {
animation: shake 0.5s ease-in-out infinite;
animation-play-state: paused;
}
.shake-box:hover {
animation-play-state: running;
}
Você também pode usar animações para fornecer feedback de interação em elementos como botões:
Um exemplo comum é a aplicação de animações em formulários para melhorar o feedback ao usuário:
Você pode criar animações sequenciais aplicando atrasos (animation-delay
) a elementos semelhantes:
.stagger-item {
animation: bounce 1s ease infinite;
}
.stagger-item:nth-child(1) { animation-delay: 0s; }
.stagger-item:nth-child(2) { animation-delay: 0.1s; }
.stagger-item:nth-child(3) { animation-delay: 0.2s; }
.stagger-item:nth-child(4) { animation-delay: 0.3s; }
.stagger-item:nth-child(5) { animation-delay: 0.4s; }
Esse efeito de cascata é comum em interfaces modernas, especialmente ao carregar listas de itens ou revelar conteúdo.
Animações podem impactar significativamente a performance de um site, especialmente em dispositivos móveis. Aqui estão algumas dicas para otimização:
transform
e opacity
que são aceleradas por GPUwidth
, height
, padding
, margin
, position
will-change
: Avisa o navegador sobre elementos que serão animadosrequestAnimationFrame
: Para animações complexas controladas por JavaScript/* Otimizando uma animação */
.elemento-otimizado {
will-change: transform, opacity;
animation: minhaAnimacao 0.5s ease;
}
As animações podem causar problemas para usuários com distúrbios vestibulares, sensibilidade a movimento, epilepsia ou outras condições. Sempre considere:
prefers-reduced-motion
/* Respeitando preferência de redução de movimento */
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.001s !important;
transition-duration: 0.001s !important;
}
}
As animações CSS têm diversos usos práticos que melhoram significativamente a experiência do usuário:
Animações breves que confirmam ações do usuário, como botões que pulsam quando clicados ou formulários que mostram feedback visual.
Spinners, barras de progresso e outros indicadores que informam o usuário que algo está sendo processado.
Animações que mostram mudanças de estado em componentes de interface, como expansão de painéis, aberturas de menus ou alterações de visualização.
Animações que revelam gradualmente conteúdo à medida que o usuário rola a página ou navega por seções diferentes.
Alertas ou mensagens que chamam a atenção do usuário de forma não intrusiva, como toasts ou badges animados.
Animações que ajudam a contar uma história ou explicar um conceito, guiando o foco do usuário de um elemento para outro.
Crie uma animação de "fade in" que revele gradualmente um elemento ao entrar na página. O elemento deve começar invisível e fora da tela, e animar para sua posição final com opacidade total.
Dica: Use uma combinação de opacity
e transform: translateY()
nos seus keyframes.
Crie um indicador de carregamento animado (spinner ou barra de progresso) usando apenas CSS. Deve repetir continuamente até ser removido.
Dica: Pense em usar animation-iteration-count: infinite
e transformações como rotate
ou scale
.
Implemente animações sutis para um formulário de login, incluindo:
Dica: Combine pseudo-classes como :focus
, :valid
, :invalid
com animações específicas.
Crie uma sequência de animações que conte uma história simples com 3-4 elementos na página. Os elementos devem animar em ordem, com cada animação começando apenas quando a anterior terminar.
Dica: Use animation-delay
cuidadosamente e calcule o timing total de cada animação.
@keyframes
para definir múltiplos estados ao longo do tempoanimation-duration
, animation-timing-function
e animation-iteration-count
controlam o comportamentotransform
e opacity
prefers-reduced-motion
Agora que você domina animações CSS, explore:
Na próxima aula, exploraremos o CSS moderno com Custom Properties, funções avançadas e recursos mais recentes!