HomeSharpStack
mobile-performance5 min

CSS e Animações em Dispositivos Móveis: Otimizando o Desempenho Visual

CSS e Animações em Dispositivos Móveis: Otimizando o Desempenho Visual

O que é "Jank" e por que devemos evitar?

Imagine que você está assistindo a um filme em seu celular. Se o filme congela ou pula quadros, a experiência fica ruim, certo? O mesmo acontece com animações CSS em dispositivos móveis. "Jank" é quando a animação não flui suavemente — ela congela, pisca ou pula. Isso ocorre quando o navegador não consegue desenhar 60 quadros por segundo (60 FPS), que é a velocidade que nossos olhos percebem como movimento suave.

Como o Navegador Desenha na Tela

Pense no navegador como um pintor que precisa desenhar a página várias vezes por segundo. Cada desenho passa por três etapas:

  1. Layout: O navegador calcula onde cada elemento deve ficar
  2. Paint: O navegador "pinta" os pixels na tela
  3. Composite: O navegador combina todas as camadas para criar a imagem final

Se qualquer uma dessas etapas demorar muito, você perde quadros e vê jank. Em dispositivos móveis, o processador é mais lento que em computadores, então precisamos ser ainda mais cuidadosos.

Propriedades CSS que Causam Jank

Nem todas as propriedades CSS são iguais. Algumas forçam o navegador a refazer o layout inteiro (muito caro), enquanto outras apenas redesenham (mais barato).

❌ Propriedades caras (evite animar):

  • width, height, left, top — forçam recálculo de layout
  • margin, padding — também afetam o layout
  • background-color — força redesenho completo

✅ Propriedades baratas (seguras para animar):

  • transform — apenas move/escala sem afetar layout
  • opacity — apenas muda transparência

Exemplo: Animação Ruim vs. Boa

Animação ruim (causa jank):

@keyframes slide-bad {
  from { left: 0; }
  to { left: 300px; }
}

.box {
  animation: slide-bad 1s infinite;
}

Por que é ruim? A propriedade left força o navegador a recalcular o layout a cada quadro. Em um celular lento, isso causa jank.

Animação boa (suave):

@keyframes slide-good {
  from { transform: translateX(0); }
  to { transform: translateX(300px); }
}

.box {
  animation: slide-good 1s infinite;
}

Por que é bom? transform não afeta o layout. O navegador pode otimizar isso em uma camada separada, tornando a animação muito mais rápida.

Dicas Práticas de Otimização

1. Use will-change para avisar o navegador:

.animated-element {
  will-change: transform, opacity;
}

Isso diz ao navegador: "Ei, vou animar essas propriedades, prepare-se!" O navegador pode então otimizar antecipadamente.

2. Reduza a complexidade visual:

/* Evite sombras complexas durante animações */
.box {
  box-shadow: 0 10px 30px rgba(0,0,0,0.3);
  animation: fade 1s;
}

/* Melhor: remova sombra durante animação */
.box.animating {
  box-shadow: none;
}

3. Teste em dispositivos reais: Seu computador é rápido, mas o celular do usuário pode não ser. Use as ferramentas de desenvolvedor do Chrome para simular dispositivos móveis lentos.

Resumo das Melhores Práticas

  • Prefira transform e opacity para animações
  • Evite animar width, height, left, top
  • Use will-change para propriedades que serão animadas
  • Teste sempre em dispositivos móveis reais ou simulados
  • Mantenha animações curtas (menos de 1 segundo é ideal)

Key Takeaways

  • Jank ocorre quando o navegador não consegue desenhar 60 quadros por segundo; em dispositivos móveis, isso é ainda mais crítico porque o processador é mais lento
  • Propriedades CSS como transform e opacity são baratas de animar, enquanto left, top, width e height forçam recálculos de layout e causam jank
  • Use will-change para avisar o navegador sobre animações futuras, e sempre teste em dispositivos móveis reais para garantir fluidez visual

Enjoyed this reading?

SharpStack delivers personalized tech readings every day, calibrated to your skill level. 5 minutes a day to stay sharp.

“Stay sharp. At your pace. Everyday.”