Menu

Transition CSS: propriedade, duração, easing e delay

Uma transition CSS anima uma propriedade do valor antigo até o novo quando ela muda, por exemplo no hover. Veja o shorthand transition, todas as funções de tempo lado a lado, o que pode e o que não pode ser animado, a solução para height: auto e o movimento reduzido.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

Uma transition em um exemplo

Uma transition diz ao navegador: quando esta propriedade mudar, anime a mudança durante este tempo em vez de trocar de uma vez. Coloque-a na regra normal do elemento, não só no :hover:

Passe o mouse sobre o primeiro botão: a cor passa para verde e ele sobe 4px em 0,4 segundo, e tirar o ponteiro toca a mesma transition de volta. O segundo botão tem transition: none e troca na hora. Quem usa teclado recebe o mesmo efeito pelo :focus-visible.

O shorthand transition

transition: background-color 0.3s ease-in-out 0.1s;
/*          property         duration timing    delay */
Propriedade longaO que definePadrão
transition-propertyquais propriedades são animadas (all ou uma lista)all
transition-durationquanto tempo, em s ou ms0s
transition-timing-functiona curva de velocidadeease
transition-delayespera antes de começar (pode ser negativa)0s

A duração padrão é 0s, e é por isso que nada anima até você definir uma. No shorthand, o primeiro tempo é sempre a duração e o segundo é o delay. Para configurações diferentes por propriedade, separe-as com vírgulas:

.card {
  transition: transform 0.2s ease-out, box-shadow 0.4s ease-out;
}

Funções de tempo lado a lado

A função de tempo decide como a velocidade muda durante a transition. Aperte Play e as sete barras percorrem a mesma distância nos mesmos 1,5 segundo:

Função de tempoSensação
linearvelocidade constante, mecânica
ease (padrão)começo rápido, parada suave
ease-incomeço lento, fim rápido: bom para coisas que saem
ease-outcomeço rápido, fim lento: bom para coisas que chegam
ease-in-outlento nas duas pontas
cubic-bezier(x1, y1, x2, y2)a sua própria curva; um y acima de 1 passa do ponto e volta
steps(n)pula em n etapas iguais, sem quadros intermediários

Para efeitos de hover e menus, ease-out com uma duração entre 150ms e 300ms dá uma sensação de resposta rápida.

O que pode ser animado

Propriedades com valores intermediários podem ser animadas: cores, comprimentos (width, padding, margin), opacity, transform, box-shadow, border-radius, filter, background-color. Propriedades que pulam entre palavras-chave, como display ou font-family, trocam de uma vez.

height: auto é o caso em que as pessoas mais esbarram: um painel que abre de height: 0 para height: auto não anima por padrão, porque o navegador não calcula os valores entre 0 e "auto". Uma solução confiável é um invólucro grid cuja única linha vai de 0fr a 1fr:

O aria-expanded informa a quem usa leitor de tela se o painel está aberto, o que a animação sozinha não faz.

Rodar código quando uma transition termina

O evento transitionend dispara quando uma transition termina, uma vez por propriedade. Use-o para fazer algo depois do movimento, como mover o foco ou remover um elemento:

Respeite o movimento reduzido

Algumas pessoas ativam "reduzir movimento" nas configurações do sistema porque o movimento na tela as deixa tontas ou as distrai. Mantenha os fades de cor e opacidade e tire os movimentos grandes com uma media query:

@media (prefers-reduced-motion: reduce) {
  .btn { transition: background-color 0.2s ease; } /* no movement, only the color */
}

Mantenha as transitions suaves

transform e opacity são as propriedades mais baratas de animar: o navegador consegue mover e esmaecer um elemento sem recalcular o layout. Animar width, height, top ou margin faz o navegador montar a página de novo a cada quadro, o que pode travar em celulares lentos. Para mover algo, prefira transform: translate() a left ou margin. A página do transform trata das funções.

Erros comuns

  • transition só na regra :hover. O efeito anima na entrada, mas volta de uma vez quando o hover termina. Coloque a transition na regra base.
  • Uma duração sem unidade. transition: opacity 300 é inválido. Escreva 300ms ou 0.3s.
  • transition: all. Anima toda propriedade que muda, inclusive as que você não queria animar, e pode deixar mudanças de layout lentas. Liste as propriedades.
  • Esperar que display: none faça fade. O display troca de uma vez. Faça o fade da opacity (e defina visibility: hidden quando o fade terminar).
  • Animar até height: auto. Ele pula. Use a técnica do grid-template-rows acima.
  • Durações longas em interações pequenas. Qualquer coisa acima de uns 400ms em um botão ou menu parece lenta.

Perguntas frequentes

Como funcionam as transitions no CSS?

Você declara no elemento quais propriedades devem ser animadas e por quanto tempo, por exemplo transition: background-color 0.3s ease;. Quando o valor dessa propriedade muda (por :hover, por uma classe ou por JavaScript), o navegador anima do valor antigo até o novo em vez de trocar de uma vez.

Qual é a ordem dos valores no shorthand transition?

transition: property duration timing-function delay;, por exemplo transition: opacity 0.3s ease-in 0.1s;. A única regra rígida é que o primeiro valor de tempo é a duração e o segundo é o delay. Separe várias transitions com vírgulas.

Por que minha transition CSS não funciona?

Causas comuns: a transition está só na regra :hover (então anima na entrada e volta de uma vez), a propriedade não pode ser animada (display, ou height até auto), a duração não tem unidade (0.3 em vez de 0.3s) ou o valor muda no mesmo instante em que o elemento é acrescentado à página.

Dá para animar height: auto com transition?

Não com uma transition simples de height em todos os navegadores: interpolar até auto precisa da propriedade mais nova interpolate-size, que ainda não é suportada em todo lugar. As soluções comuns são animar grid-template-rows de 0fr a 1fr em um invólucro grid, ou animar max-height até um valor maior que o conteúdo.

Qual a diferença entre transition e animation no CSS?

Uma transition roda uma vez, entre dois valores, quando uma propriedade muda. Uma animation usa @keyframes, pode ter muitas etapas, começa sozinha quando a página carrega e pode se repetir ou rodar em loop.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR