Transições
📽 Veja esta vídeo-aula no Youtube
Quando uma propriedade CSS é alterada, o navegador faz a transição do estado anterior para o novo estado. Por exemplo, ao mudar a cor de um elemento de vermelho para azul, o navegador faz a mudança direta de cores, conforme definido.
O CSS permite que você controle a maneira como essa transição será feita usando as transições. Elas estão disponíveis somente para algumas propriedades, não todas.
O navegador calcula os valores intermediários para a(s) propriedade(s).
Propriedades:
transition-property- quais propriedades serão controladas.transition-property: none;- nenhuma propriedade.transition-property: all;- todas as propriedades.transition-property: width, color;- somente largura e cor.
transition-duration- duração da transição.transition-duration: 0s;- sem transição.transition-duration: 0.5s- meio segundo.transition-duration: 2s;- dois segundos.
transition-timing-function- função de transição.transition-timing-function: ease;- padrão, começa e termina devagar, com o meio é mais lento.transition-timing-function: ease-in;- começo lento.transition-timing-function: ease-out;- final lento.transition-timing-function: linear;- velocidade constante.transition-timing-function: steps(3);- em três passos.transition-timing-function: cubic-bezier(...);- permite definir a função matemática de transição.
transition-delay- atraso para o início da transição.transition-delay: 0s;- início imediato.transition-delay: 3s;- atraso de 3 segundos.
Você pode usar a propriedade de atalho transition passando os 4 valores na sequência.
ease

step

cubic-bezier

Você pode usar geradores como este para criar transições diversas, com a sua assinatura.
Animações
Você pode criar animações mais complexas usando as propriedades animation e @keyframes.
Primeiro definimos uma lista de quadros (frames) a serem seguidos.
Neste exemplo (chamado exemplo-1) temos 2 quadros, um inicial e um final:
@keyframes exemplo-1 {
from {
/* regras */
}
to {
/* regras */
}
}
Neste exemplo (exemplo-2), 3 quadros em 0%, 30% e 100% do tempo:
@keyframes exemplo-1 {
0% {
/* regras */
}
30% {
/* regras */
}
100% {
/* regras */
}
}
Aplicamos uma animação usando animation-name e animation-duration:
#texto-animado {
animation-name: exemplo-1;
animation-duration: 5s;
}
Outros ajustes:
animation-name- nome da animação definida em@keyframes.animation-duration- tempo total de transição da animação.animation-delay- atraso de início da animação.animation-direction- direção da animação.animation-direction: normal;- padrão, do início para o final.animation-direction: reverse;- do final para o início.animation-direction: alternate;- do início para o final, depois do final para o início.animation-direction: alternate-reverse;- comoalternate, mas invertido.
animation-iteration-count- quantidade de vezes que será executada.animation-iteration-count: 2;- 2 vezes.animation-iteration-count: infinite;- infinitas vezes.
animation-timing-function- função de transição, como emtransition-timing-function.animation-fill-mode- define o que acontece com o elemento antes e depois da animação.animation-fill-mode: none;- nenhum estilo é aplicado.animation-fill-mode: forwards;- ao final, mantém o último estilo.animation-fill-mode: backwards;- ao final, mantém o primeiro estilo.animation-fill-mode: both;- ao final, mantém o primeiro ou o último, de acordo com a direção.
Exemplos usando a animação abaixo:
@keyframes verde-para-azul {
from {
background-color: green;
}
to {
background-color:navy;
color: white;
}
}

Transformações
Apesar de serem frequentemente utilizadas em conjunto com transições e animações, as tranformações são independentes e não relacionadas ao tema.
Podemos realizar as transformações usando as funções a seguir como valores da propriedade transform.
-
transform: none;- padrão, sem transformação. transform: translate(x,y);- translação em 2D.transform: translate3d(x,y,z);- translação em 3D.transform: translateX(x);- translação no eixo X.transform: translateY(y);- translação no eixo Y.transform: translateZ(z);- translação no eixo Z.
transform: scale(x,y);- redimensionamento em 2D.transform: scale3d(x,y,z);- redimensionamento em 3D.transform: scaleX(x);- redimensionamento no eixo X.transform: scaleY(y);- redimensionamento no eixo Y.transform: scaleZ(z);- redimensionamento no eixo Z.
transform: rotate(angulo);- rotação em 2D.transform: rotate3d(x,y,z,angulo);- rotação em 3D.transform: rotateX(angulo);- rotação no eixo X.transform: rotateY(angulo);- rotação no eixo Y.transform: rotateZ(angulo);- rotação no eixo Z.
transform: skew(x-angulo,y-angulo);- distorção em 2D.transform: skewX(angulo);- distorção no eixo X.transform: skewY(angulo);- distorção no eixo Y.
Todas as transformações no eixo Z exigem a presença da transformação perspective, que deve ter um valor diferente de zero. Como o eixo Z afasta ou aproxima o elemento da tela, precisamos definir a perspectiva, ou seja, a distância inicial a ser considerada. Por exemplo, um elemento com perspective(200px) que receba translateZ(100px) vai ser exibido maior, pois foi trazido para a frente metade do caminho.
Há uma explicação excelente aqui, em inglês.

Combinado com transformações, pode trazer efeitos memoráveis.
Veja esse exemplo:
#texto {
transition: all 3s ease;
}
#texto:hover {
transform: perspective(100px) rotateY(30deg);
box-shadow: 10px 10px 5px 0 black;
}
