Nos tempos do jQuery usávamos animate e fadeIn para hovers. Em 2026, usar JavaScript só para um fade de opacidade é desperdício. A propriedade transition do CSS é acelerada por hardware na maior parte dos casos relevantes, fica mais suave e não exige scripts. Este guia é para iniciantes e para quem ainda copia snippets com transition all sem perceber o custo.
Referências: módulo de CSS Transitions na MDN e guias de animação em web.dev. Duração típica de UI: cerca de duzentos a trezentos milissegundos.
Porque CSS vence JavaScript neste caso
Transições de opacity e transform correm de forma barata. Não bloqueiam a thread principal com timers. Poupan energia em telemóveis. O browser pode otimizar. JavaScript continua necessário para gestos complexos, mas não para um hover de cartão.
Fade básico
Defina opacity no estado normal, transition com a propriedade específica e duração, e altere opacity no hover. O elemento volta sozinho quando o rato sai. Preferência: ease-in-out ou ease-out para controlos de interface. Evite durações longas que fazem a UI parecer lenta.
Propriedades certas
Anime opacity e transform. Evite animar width, height, top e left - forçam layout. Evite transition all: qualquer mudança de margem ou cor de borda passa a ser animada e custa mais. Especifique a lista de propriedades.
Timing: linear parece robótico. Ease-out responde depressa e abranda no fim - bom para hovers. Cubic-bezier personalizado só quando o design system o pede.
Padrões úteis
Fade mais escala ligeira em imagens de cartão. Fade da imagem com texto sobreposto na galeria. Botões com mudança de fundo e sombra curta. Sempre com preferências de movimento reduzido: respeite prefers-reduced-motion e desative ou encurte animações.
Acessibilidade e toque
Hover não existe da mesma forma em ecrãs táteis. Não esconda informação crítica só no hover. Use focus-visible para teclado. Garanta contraste no estado final. Não dependa só da cor para o estado ativo.
Desempenho em WordPress
Em temas e blocos, mantenha CSS de hover no ficheiro do tema ou num bloco, não em inline gigante por página. Evite bibliotecas de animação só para fades. Teste em telemóvel real de gama média. Num portátil antigo a diferença entre transform e left nota-se de imediato.
Erros comuns
Durações de um segundo em botões. Transition all em contentores grandes. Animar box-shadow pesado em dezenas de cartões simultâneos. Esquecer o estado focus. Usar JavaScript para togglar classes sem necessidade. Ignorar reduced motion.
Nota final de implementação
Antes de fechar o pull request, peça a alguém que navegue só com o teclado e a outra pessoa só com o telemóvel. Se o hover for a única forma de ver o título do cartão, redesenhe. Motion boa é invisível até faltar - e nunca esconde conteúdo.
Resumo
Use propriedades específicas, duzentos a trezentos milissegundos, transform e opacity, teste em dispositivos reais. Aplicamos estes detalhes de front-end em temas feitos à medida em WordPress.
Exemplo de cartão de produto
No catálogo WooCommerce um hover suave na miniatura ajuda a hierarquia visual sem page builder cheio de efeitos. Mantenha a transição curta. Não escale acima de cinco por cento. Combine com alt text útil e ligação clara - animação não substitui informação.
Coordenação com design systems
Documente tokens de duração e easing no mesmo sítio que cores e raios. Se o design fala em motion, o CSS deve mapear esses tokens. Evite cada programador inventar 0.17s ease diferentes.
Depuração
No Chrome DevTools, inspecione Animations e Rendering para ver se há paint excessivo. Se o hover causa jank, verifique se está a animar propriedades de layout ou filtros pesados.
Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.
Mer praksisnotat 1. ## Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.
Mer praksisnotat 2. ## Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.
Mer praksisnotat 3. ## Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.
Mer praksisnotat 4. ## Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.
Mer praksisnotat 5. ## Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.
Mer praksisnotat 6. ## Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.
Mer praksisnotat 7. ## Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.
Mer praksisnotat 8. ## Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.
Mer praksisnotat 9. ## Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.
Mer praksisnotat 10. ## Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.
Mer praksisnotat 11. ## Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.
Mer praksisnotat 12. ## Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.
Mer praksisnotat 13. ## Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.
Mer praksisnotat 14. ## Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.
Mer praksisnotat 15. ## Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.
Mer praksisnotat 16. ## Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.
Mer praksisnotat 17. ## Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.
Mer praksisnotat 18. ## Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.
Mer praksisnotat 19. ## Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.
Mer praksisnotat 20. ## Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.
Mer praksisnotat 21. ## Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.
Mer praksisnotat 22. ## Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.
Mer praksisnotat 23. ## Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.
Mer praksisnotat 24. ## Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.
Mer praksisnotat 25. ## Quando JavaScript ainda faz sentido
Menus complexos, sequências encadeadas, scrubbing, e estados que não são hover puro. Mesmo aí, prefira CSS variables e classes a animar pixel a pixel no requestAnimationFrame sem necessidade.







