🎬 AULA 8

Animações CSS

⏱️ Duração: 60 minutos 🎯 Nível: Avançado 👨‍💻 Prática: Sim

Seu progresso nesta aula
0%
⬅️ Aula anterior: Transforms e Transitions Próxima aula: CSS Moderno ➡️

🎯 Objetivos de Aprendizado

Ao final desta aula, você será capaz de:

🎭 O Poder das Animações CSS

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:

💡 Dica

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.

🔑 Keyframes: A Base das Animações

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;
}

Demonstração: Animação de Pulsação

Pulse

⚙️ Propriedades de Animação

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

⚠️ Importante

O animation-fill-mode é crucial para determinar se o elemento manterá o estado final da animação (forwards) ou voltará ao estado inicial (none).

🎨 Exemplos de Animações Comuns

Slide In

Slide
@keyframes slideIn {
    from { 
        transform: translateX(-100%);
        opacity: 0;
    }
    to { 
        transform: translateX(0);
        opacity: 1;
    }
}

.elemento {
    animation: slideIn 1s forwards;
}

Rotação

Rotate
@keyframes rotate {
    from { transform: rotate(0deg); }
    to { transform: rotate(360deg); }
}

.elemento {
    animation: rotate 4s linear infinite;
}

Salto (Bounce)

Bounce
@keyframes bounce {
    0%, 100% { transform: translateY(0); }
    50% { transform: translateY(-20px); }
}

.elemento {
    animation: bounce 1s ease infinite;
}

Mudança de Cor

Colors
@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;
}

✨ Experimente

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;
}

👆 Animações e Interatividade

As animações podem ser iniciadas ou alteradas por interações do usuário, combinando-as com pseudoclasses como :hover, :focus, ou :active.

Animação no Hover (Passe o mouse)

Hover me
.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:

📝 Animações Sequenciais e em Cascata

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.

Indicador de Carregamento Animado

⚡ Otimização de Performance

Animações podem impactar significativamente a performance de um site, especialmente em dispositivos móveis. Aqui estão algumas dicas para otimização:

💡 Dicas de Performance

  • Anime propriedades GPU-friendly: Prefira transform e opacity que são aceleradas por GPU
  • Evite animar propriedades que causam reflow: Como width, height, padding, margin, position
  • Use will-change: Avisa o navegador sobre elementos que serão animados
  • Considere requestAnimationFrame: Para animações complexas controladas por JavaScript
  • Teste em dispositivos reais: A performance pode variar significativamente entre dispositivos
/* Otimizando uma animação */
.elemento-otimizado {
    will-change: transform, opacity;
    animation: minhaAnimacao 0.5s ease;
}

♿ Acessibilidade e Animações

As animações podem causar problemas para usuários com distúrbios vestibulares, sensibilidade a movimento, epilepsia ou outras condições. Sempre considere:

/* Respeitando preferência de redução de movimento */
@media (prefers-reduced-motion: reduce) {
    * {
        animation-duration: 0.001s !important;
        transition-duration: 0.001s !important;
    }
}

🌟 Casos de Uso Práticos

As animações CSS têm diversos usos práticos que melhoram significativamente a experiência do usuário:

1. Feedback de Interação

Animações breves que confirmam ações do usuário, como botões que pulsam quando clicados ou formulários que mostram feedback visual.

2. Estados de Carregamento

Spinners, barras de progresso e outros indicadores que informam o usuário que algo está sendo processado.

3. Transições de Estado

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.

4. Revelação de Conteúdo

Animações que revelam gradualmente conteúdo à medida que o usuário rola a página ou navega por seções diferentes.

5. Notificações

Alertas ou mensagens que chamam a atenção do usuário de forma não intrusiva, como toasts ou badges animados.

6. Storytelling

Animações que ajudam a contar uma história ou explicar um conceito, guiando o foco do usuário de um elemento para outro.

✏️ Exercícios Práticos

Exercício 1: Animação de Entrada

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.

Exercício 2: Animação de Carregamento

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.

Exercício 3: Interface com Feedback

Implemente animações sutis para um formulário de login, incluindo:

  • Efeito de foco nos campos de entrada
  • Animação no botão de envio quando clicado
  • Feedback visual de validação (sucesso/erro)

Dica: Combine pseudo-classes como :focus, :valid, :invalid com animações específicas.

Desafio: Sequência de Animações

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.

🔧 Ferramentas e Recursos

Geradores de Animação

  • Animista - Biblioteca de animações CSS pré-criadas
  • Keyframes App - Editor visual de animações CSS
  • Animate.css - Biblioteca de animações prontas para usar

📝 Resumo

Pontos-chave desta aula

  • Animações CSS usam a regra @keyframes para definir múltiplos estados ao longo do tempo
  • Diferentemente das transições, animações podem ter múltiplos pontos intermediários e executar sem gatilhos
  • Propriedades como animation-duration, animation-timing-function e animation-iteration-count controlam o comportamento
  • Animações podem ser usadas para feedback de interação, indicadores de status e transições de interface
  • Para melhor performance, anime propriedades aceleradas por GPU como transform e opacity
  • Sempre considere acessibilidade ao implementar animações, respeitando prefers-reduced-motion

🚀 Próximos Passos

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!

⬅️ Aula anterior: Transforms e Transitions Próxima aula: CSS Moderno ➡️