The CSS Podcast - 022: Animation
Às vezes, você encontra pequenos ajudantes nas interfaces que, quando clicados, fornecem informações úteis sobre essa seção específica. Eles geralmente têm uma animação pulsante para informar sutilmente que as informações estão ali e que você precisa interagir com elas. Neste módulo, mostramos como criar esses auxiliares e outras animações usando CSS.
É possível usar o CSS para definir uma sequência de animação com frames-chave. Essas sequências podem ser animações básicas de um estado ou sequências complexas baseadas em tempo.
O que é um frame-chave?
Na maioria das ferramentas de animação, os frames-chave são o mecanismo usado para atribuir estados de animação a carimbos de data/hora em uma linha do tempo.
Por exemplo, confira uma linha do tempo do ponto "auxiliar" piscando. A animação é executada por um segundo e tem dois estados.
Há um ponto específico em que cada um desses estados de animação começa e termina. Você mapeia isso na linha do tempo com frames-chave.
@keyframes
O CSS @keyframes
é baseado no mesmo conceito dos frames-chave de animação.
Confira um exemplo com dois estados:
@keyframes my-animation {
from {
transform: translateY(20px);
}
to {
transform: translateY(0px);
}
}
A primeira parte importante é o
identificador personalizado (custom-ident
),
o nome da regra de keyframes. O identificador neste exemplo é my-animation
.
O identificador personalizado funciona como um nome de função,
permitindo que você faça referência à regra de frames-chave em outro lugar no código CSS.
Na regra de frames-chave, from
e to
são palavras-chave que representam 0%
e
100%
, que são o início e o fim da animação.
Você pode recriar a mesma regra assim:
@keyframes my-animation {
0% {
transform: translateY(20px);
}
100% {
transform: translateY(0px);
}
}
Você pode adicionar quantas posições quiser durante o período. No exemplo de auxiliar de pulso, há dois estados que se traduzem em dois frames-chave. Isso significa que você tem duas posições dentro da regra de frames-chave para representar as mudanças de cada um deles.
@keyframes pulse {
0% {
opacity: 0;
}
50% {
transform: scale(1.4);
opacity: 0.4;
}
}
Propriedades animation
Para usar o @keyframes
em uma regra do CSS, defina várias propriedades de animação individualmente ou use a propriedade abreviada
animation
.
animation-duration
.my-element {
animation-duration: 10s;
}
A propriedade animation-duration
define o tempo que a linha do tempo @keyframes
precisa ter como valor de tempo.
O padrão é 0 segundo, o que significa que a animação ainda é executada, mas é muito
rápida para ser percebida. Não é possível usar valores de tempo negativos.
animation-timing-function
Para recriar o movimento natural na animação, use funções de temporização que
calculam a velocidade de uma animação em cada ponto. Os valores calculados geralmente são
curvados, fazendo com que a animação seja executada em velocidades variáveis ao longo de
animation-duration
e fazendo com que o elemento pareça pular se o navegador
calcular um valor além dos definidos em @keyframes
.
Há várias palavras-chave disponíveis como predefinições no CSS, que são usadas como o valor de
animation-timing-function:
linear
, ease
, ease-in
, ease-out
, ease-in-out
.
.my-element {
animation-timing-function: ease-in-out;
}
Os valores da função de suavização parecem curvados porque a suavização é calculada usando uma
curva de Bézier, um tipo de função usada para modelar a velocidade. Cada uma das palavras-chave da função
de temporização, como ease
, faz referência a uma curva de Bézier predefinida. No CSS,
é possível definir uma curva de Bézier diretamente usando a função cubic-bezier()
,
que aceita quatro valores numéricos: x1
, y1
, x2
, y2
.
.my-element {
animation-timing-function: cubic-bezier(.42, 0, .58, 1);
}
Esses valores representam cada parte da curva ao longo dos eixos X e Y.
Entender as curvas de Bézier é complicado. Ferramentas visuais, como este gerador de Lea Verou, são muito úteis.
A função de transição steps
Às vezes, é possível ter um controle mais granular da animação
movendo-a em intervalos, em vez de alongar uma curva. A função de suavização steps()
permite
dividir a linha do tempo em intervalos definidos de duração igual.
.my-element {
animation-timing-function: steps(10, end);
}
O primeiro argumento é o número de etapas. Se houver o mesmo número de frames-chave que de etapas, cada frame-chave será reproduzido em sequência pelo tempo exato da etapa, sem transição entre os estados. Se houver menos frames-chave do que etapas, o navegador vai adicionar etapas entre frames-chave, dependendo do segundo argumento.
O segundo argumento é a direção. Se ele estiver definido como end
, que é o padrão, as etapas serão concluídas no final da linha do tempo. Se ele estiver definido como start
,
a primeira etapa da animação será concluída assim que começar, o que significa que ela
termina uma etapa antes de end
.
animation-iteration-count
.my-element {
animation-iteration-count: 10;
}
A propriedade animation-iteration-count
define quantas vezes a linha do tempo @keyframes
precisa ser executada durante a
animação. Por padrão, esse valor é 1, o que significa que a animação é interrompida quando
chega ao final da linha do tempo. Esse valor não pode ser negativo.
Para fazer o loop da animação, defina a contagem de iterações como infinite
. É assim que
a animação pulsante do início desta lição funciona.
animation-direction
.my-element {
animation-direction: reverse;
}
É possível definir a direção em que a linha do tempo é executada nos frames-chave com animation-direction, que recebe os seguintes valores:
normal
: o valor padrão, que é para frente.reverse
: é executado de forma regressiva na linha do tempo.alternate
: para cada iteração de animação, a linha do tempo alterna entre execução para frente e para trás.alternate-reverse
: semelhante aalternate
, mas a animação começa com a linha do tempo correndo para trás.
animation-delay
.my-element {
animation-delay: 5s;
}
A propriedade animation-delay
define por quanto tempo o navegador espera antes de iniciar a animação.
Assim como a propriedade animation-duration
, ela aceita um valor de tempo.
Ao contrário de animation-duration
, é possível definir animation-delay
como um valor
negativo, o que faz com que a animação comece no ponto correspondente da
linha do tempo. Por exemplo, se a animação tiver 10 segundos e você definir
animation-delay
como -5s
, a animação vai começar na metade da
linha do tempo.
animation-play-state
.my-element:hover {
animation-play-state: paused;
}
A propriedade animation-play-state
permite reproduzir e pausar a animação.
O valor padrão é running
. Se você definir como paused
, a animação será pausada.
animation-fill-mode
A propriedade animation-fill-mode
define quais valores na linha do tempo @keyframes
persistem antes do
início ou após o término da animação. O valor padrão é none
, o que significa que,
quando a animação é concluída, os valores na linha do tempo são descartados.
Outras opções incluem:
forwards
: o último frame-chave persiste com base na direção da animação.backwards
: o primeiro frame-chave persiste com base na direção da animação.both
: o primeiro e o último keyframe permanecem.
Abreviação animation
Em vez de definir cada propriedade separadamente, você pode defini-las em uma
abreviação animation
, que permite definir as propriedades de animação na
seguinte ordem:
animation-name
animation-duration
animation-timing-function
animation-delay
animation-iteration-count
animation-direction
animation-fill-mode
animation-play-state
.my-element {
animation: my-animation 10s ease-in-out 1s infinite forwards forwards running;
}
Considerações ao trabalhar com animações
Os usuários podem definir o sistema operacional para preferir movimentos reduzidos ao interagir com aplicativos e sites. É possível detectar essa preferência usando a consulta de mídia prefers-reduced-motion:
@media (prefers-reduced-motion) {
.my-autoplaying-animation {
animation-play-state: paused;
}
}
Isso não é necessariamente uma preferência por nenhuma animação. É uma preferência por menos animação, especialmente menos animação inesperada. Saiba mais sobre essa preferência e o desempenho geral no guia de animação.
Teste seu conhecimento
Teste seus conhecimentos sobre animações
O nome ou identificador personalizado de uma animação @keyframes
diferencia maiúsculas de minúsculas?
SWOOP
e swoop
coexistam.As palavras-chave from
e to
são iguais a:
start
e end
.0%
e 100%
.from
é igual a 0%
e to
é igual a 100%.0
e 1
O animation-timing-function
também é conhecido como:
Qual é o número mínimo de keyframes necessários em uma animação @keyframes
?