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 longa | O que define | Padrão |
|---|---|---|
transition-property | quais propriedades são animadas (all ou uma lista) | all |
transition-duration | quanto tempo, em s ou ms | 0s |
transition-timing-function | a curva de velocidade | ease |
transition-delay | espera 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 tempo | Sensação |
|---|---|
linear | velocidade constante, mecânica |
ease (padrão) | começo rápido, parada suave |
ease-in | começo lento, fim rápido: bom para coisas que saem |
ease-out | começo rápido, fim lento: bom para coisas que chegam |
ease-in-out | lento 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
transitionsó na regra:hover. O efeito anima na entrada, mas volta de uma vez quando o hover termina. Coloque atransitionna regra base.- Uma duração sem unidade.
transition: opacity 300é inválido. Escreva300msou0.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: nonefaça fade. Odisplaytroca de uma vez. Faça o fade daopacity(e definavisibility: hiddenquando o fade terminar). - Animar até
height: auto. Ele pula. Use a técnica dogrid-template-rowsacima. - 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.