Transições e animações

Você adiciona uma cor :hover a um botão e funciona, mas a mudança é abrupta: um frame é azul, o próximo é mais escuro, sem nada no meio. Um pequeno fade tornaria a página inteira menos entrecortada. Esse fade é uma transição, e uma vez que você consegue descrever movimento entre dois estados, as mesmas ferramentas escalam para efeitos de hover, cards que se levantam, e um spinner que gira enquanto algo carrega. Este capítulo é sobre como CSS move as coisas, e como movê-las sem deixar a página mais difícil de usar.
Transições
Uma transição diz ao navegador para animar uma propriedade do seu valor antigo para o novo em vez de pular entre eles. Você descreve dois estados, o normal e o hover, e a transição preenche os frames no meio.
Aqui está um botão que muda de cor ao passar o mouse. Sem uma transição a cor pula; com uma ela desaparece gradualmente:
.btn {
background: #3b82f6;
transition: background 0.2s; /* desaparece gradualmente a cor em 0.2 segundos */
}
.btn:hover {
background: #1d4ed8; /* o novo estado para animar em direção */
}Você coloca transition no estado normal, não em :hover. Dessa forma ela se aplica tanto quando o mouse chega quanto quando sai.
:hover, para que funcione entrando e saindo. Comece com propriedade e uma duração e você já tem um fade funcionando. Transforms
Um transform move, dimensiona, ou gira um elemento sem perturbar nada ao seu redor. É a coisa que você geralmente quer animar, porque fica suave e não empurra os vizinhos para fora do caminho.
Existem três que você vai usar constantemente:
.card:hover {
transform: translateY(-4px); /* move para cima 4 pixels */
}
.icon:hover {
transform: scale(1.1); /* cresce para 110% do seu tamanho */
}
.arrow.open {
transform: rotate(90deg); /* gira um quarto de volta no sentido horário */
}translate move, scale redimensiona, e rotate gira. Combine qualquer um desses com uma transição e você consegue um card que se levanta, um ícone que salta, ou uma seta que se abre.
transform move, dimensiona, ou gira um elemento sem empurrar seus vizinhos. Os três para lembrar são translate para mover, scale para redimensionar, e rotate para girar. Combine com uma transição e você consegue um card que se levanta ou um ícone que salta ao passar o mouse. Animações keyframe
Uma transição anima entre dois estados. Quando você precisa de mais que dois, ou precisa que o movimento se repita, você usa uma animação keyframe. Você escreve os passos com @keyframes, depois os anexa a um elemento com a propriedade animation.
Um spinner de carregamento é o exemplo clássico: ele gira para sempre, então uma transição não consegue fazer isso.
@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.spinner {
animation: spin 1s linear infinite; /* executa spin, 1s por volta, para sempre */
}from é o início e to é o fim. A linha animation diz quais keyframes executar, quanto tempo uma volta leva, a curva de velocidade, e quantas vezes repetir. infinite significa que nunca para.
@keyframes e os execute com animation. Um spinner é o exemplo padrão: from em 0 graus, to em 360, looping com infinite. A linha animation define quais keyframes, quanto tempo, a curva, e quantas vezes. Movimento que respeita o usuário
Nem todo mundo quer movimento na tela. Algumas pessoas acham distrativo, e para algumas pode causar desconforto real ou náusea. Navegadores deixam as pessoas pedir menos disso nas suas configurações de sistema, e CSS pode ler esse pedido com prefers-reduced-motion.
Envolva suas animações em uma verificação para que elas apenas executem para pessoas que não pediram para diminuir o movimento:
@media (prefers-reduced-motion: no-preference) {
.card {
transition: transform 0.2s;
}
}A outra metade de respeitar o usuário é moderação: mantenha o movimento curto, sutil, e atado a algo que o leitor fez, como um hover ou um clique. Movimento que chama atenção para uma mudança real ajuda; movimento por si só fica cansativo rápido.
prefers-reduced-motion e apenas execute animações para pessoas que não diminuíram o movimento. Mantenha o movimento que você adicionar curto, sutil, e atado a algo que o leitor fez. O que animar, e por que importa
Uma regra rápida que vai economizar problemas depois: quando você anima movimento, anima transform e opacity, não propriedades como width, height, top, ou margin.
/* suave: o navegador lida com essas barato */
.card:hover {
transform: translateY(-4px);
opacity: 0.9;
}A razão é que transform e opacity são as duas propriedades que navegadores conseguem mover o mais barato, então animações construídas nelas ficam suaves mesmo em dispositivos mais lentes. Animar tamanho ou posição propriedades faz o navegador fazer mais trabalho a cada frame, e o movimento pode ficar entrecortado. Você vai conhecer a razão completa quando você for mais fundo, mas o hábito vale a pena construir agora.
transform e opacity, e dirija-se para longe de animar width, height, top, ou margin. Essas duas são as mais baratas para o navegador mover, então o movimento fica suave mesmo em dispositivos mais lentes. Você vai aprender o por que completo depois, mas o hábito vale a pena começar agora. 
