Animações CSS sem travar a página: guia de performance
Uma animação bonita que trava a rolagem da página é pior do que nenhuma animação. Entender o que o navegador precisa recalcular a cada frame é o primeiro passo para animar com responsabilidade.
As propriedades "baratas": transform e opacity
Animar transform e opacity normalmente não exige que o navegador recalcule layout nem repintura de outros elementos — na maioria dos casos, o trabalho acontece direto na composição de camadas, aproveitando a GPU.
.card {
transition: transform .25s ease, opacity .25s ease;
}
.card:hover {
transform: translateY(-6px);
}
As propriedades "caras": width, height, top, left
Animar propriedades que afetam o fluxo do documento (como width ou margin) força o navegador a recalcular o layout de tudo ao redor a cada frame. Prefira o equivalente em transform: scale() ou translate() sempre que possível.
will-change: use com moderação
.elemento-vai-animar {
will-change: transform;
}
will-change avisa o navegador para preparar uma camada de composição antecipadamente. É útil em elementos que vão animar com certeza, mas usá-lo em excesso consome memória — remova a propriedade quando a animação terminar, se possível via JavaScript.
Prefira @keyframes a JavaScript para loops simples
Spinners, pulsos e loaders não precisam de nenhuma linha de JavaScript — @keyframes lida com o loop de forma muito mais eficiente, como mostramos no nosso gerador de Loaders.
Respeite prefers-reduced-motion
Nem toda pessoa quer ver elementos se movendo na tela. Envolva animações não essenciais em @media (prefers-reduced-motion: no-preference) e ofereça uma versão estática como padrão.
Resumo prático
Anime transform/opacity sempre que possível, evite propriedades de layout, use will-change pontualmente e teste em um dispositivo mais fraco antes de considerar a animação "pronta".