Propriedade animation do CSS
Aprenda sobre a propriedade animation do CSS, usada para animar gradualmente propriedades CSS de um estilo para outro. Veja exemplos.
A propriedade animation do CSS permite animar elementos — alterando gradualmente um ou mais valores CSS ao longo do tempo — sem nenhum JavaScript. Ela funciona com propriedades cujos valores podem ser interpolados, como dimensões de layout (border, height, width), posição (left, top), font size, color e opacity.
Esta página abrange o shorthand animation, todas as oito propriedades longhands individuais animation-*, a regra at-rule @keyframes que as controla, como executar várias animações ao mesmo tempo e como respeitar usuários que preferem movimentos reduzidos. animation é uma das propriedades do CSS3.
Uma animação é composta por duas partes: uma regra @keyframes que descreve como o elemento aparece em pontos ao longo da linha do tempo, e a propriedade animation (ou seus longhands) no elemento que define como reproduzir essa linha do tempo — por quanto tempo, quantas vezes, em qual direção e assim por diante.
Navegadores mais antigos podem exigir o prefixo -webkit- para suporte legado.
Propriedades que usam uma palavra-chave como valor, como display: none; ou visibility: hidden;, não podem ser animadas. Propriedades com valores como height: auto; também não podem ser animadas.
A regra at-rule @keyframes
Para usar animação, você deve primeiro especificar o que deve acontecer em momentos específicos durante a animação. Isso é definido com a regra at-rule @keyframes.
A regra @keyframes consiste na palavra-chave "@keyframes" seguida do animation-name, que identifica a animação. A animação é então aplicada a um elemento usando esse identificador como valor da propriedade animation-name.
Nas chaves, colocamos seletores de keyframe, que definem os keyframes (ou pontos de passagem) na sequência de animação em que os estilos devem ser alterados. O seletor de keyframe pode começar com uma porcentagem (%) ou com as palavras-chave "from" (equivalente a 0%) e "to" (equivalente a 100%). 0% é o ponto de início da animação e 100% é o ponto final.
Exemplo de animação com a regra @keyframe:
Exemplo da propriedade animation com @keyframes
<!DOCTYPE html>
<html>
<head>
<style>
.element {
padding: 50px;
animation: pulse 4s infinite;
}
@keyframes pulse {
0% {
background-color: #8ebf42;
}
50% {
background-color: #1c87c9;
}
100% {
background-color: #d5dce8;
}
}
</style>
</head>
<body>
<div class="element">Background of this text is animated using CSS3 animation property.</div>
</body>
</html>Neste exemplo, vinculamos a animação ao elemento <div>. A animação terá duração de 4 segundos e alterará gradualmente a cor de fundo do elemento <div> de "verde" para "cinza".
Propriedades relacionadas à animação
animation é a propriedade shorthand para definir todas as propriedades de animação individuais em uma única declaração. Os longhands padrão estão resumidos abaixo.
| Propriedade | Define | Valores comuns |
|---|---|---|
animation-name | A regra @keyframes a ser reproduzida | um nome, none |
animation-duration | Quanto tempo dura um ciclo | 2s, 500ms (padrão 0s — sem animação) |
animation-timing-function | A curva de velocidade em cada ciclo | ease, linear, ease-in-out, cubic-bezier(…) |
animation-delay | Espera antes de iniciar | 1s, -2s (negativo inicia no meio da animação) |
animation-iteration-count | Quantas vezes reproduzir | um número, infinite |
animation-direction | Para frente, reverso ou vai-e-volta | normal, reverse, alternate |
animation-fill-mode | Estilos antes/depois da execução | none, forwards, backwards, both |
animation-play-state | Se está em execução ou pausada | running, paused |
Agora vamos ver as propriedades relacionadas à animação em ação.
Exemplo de animação com algumas propriedades relacionadas à animação:
@keyframes pulse {
/* declare animation actions here */
}
.element {
animation-name: pulse;
animation-duration: 3.5s;
animation-timing-function: ease-in;
animation-delay: 1s;
animation-direction: alternate;
animation-iteration-count: infinite;
animation-fill-mode: none;
animation-play-state: running;
}
/*
The same can be declared using the animation shorthand property
*/
.element {
animation: pulse 3.5s ease-in 1s alternate infinite none running;
}A ordem dos valores no shorthand é bastante flexível, com duas regras a lembrar: o nome deve estar presente, e quando tanto uma duração quanto um atraso aparecem, o primeiro valor de tempo é a duração e o segundo é o atraso. Qualquer valor omitido reverte para seu padrão (por exemplo, omitir animation-iteration-count reproduz a animação uma vez).
Animation-name
Esta propriedade define o nome da regra @keyframes que você deseja aplicar.
Sintaxe da propriedade animation-name
animation-name: keyframe-name | none | initial | inheritExemplo da propriedade animation-name:
<!DOCTYPE html>
<html>
<head>
<style>
div {
padding: 50px;
animation: element 4s infinite;
}
@keyframes element {
0% {
background-color: #8ebf42;
}
50% {
background-color: #1c87c9;
}
100% {
background-color: #d5dce8;
}
}
</style>
</head>
<body>
<h2>Animation-name example</h2>
<div>The name of the animation is set as "element".</div>
</body>
</html>Animation-duration
Define o tempo (em segundos ou milissegundos) que a animação leva para completar um ciclo. Se esta propriedade não for especificada, a animação não ocorrerá.
Sintaxe da propriedade animation-duration
animation-duration: time | initial | inheritExemplo da propriedade animation-duration:
<!DOCTYPE html>
<html>
<head>
<style>
.element {
padding: 50px;
animation: pulse 7s infinite;
}
@keyframes pulse {
0% {
background-color: #8ebf42;
}
50% {
background-color: #1c87c9;
}
100% {
background-color: #eee
}
}
</style>
</head>
<body>
<div class="element">Background of this text is animated using CSS3 animation property</div>
</body>
</html>Animation-timing-function
Esta propriedade define como uma animação progredirá ao longo da duração de cada ciclo — não ao longo de toda a animação.
Sintaxe da propriedade animation-timing-function
animation-timing-function: linear | ease | ease-in | ease-out | ease-in-out | cubic-bezier(n,n,n,n) | initial | inheritExemplo da propriedade animation-timing-function com o valor "ease":
<!DOCTYPE html>
<html>
<head>
<title>The title of the document</title>
<style>
div {
width: 100px;
height: 100px;
border-radius: 50%;
background: #1c87c9;
position: relative;
-webkit-animation: element 5s infinite;
/* Safari 4.0 - 8.0 */
-webkit-animation-timing-function: ease;
/* Safari 4.0 - 8.0 */
animation: element 5s infinite;
animation-timing-function: ease;
}
/* Safari 4.0 - 8.0 */
@-webkit-keyframes element {
from {
left: 0px;
}
to {
left: 200px;
}
}
@keyframes element {
from {
left: 0px;
}
to {
left: 200px;
}
}
</style>
</head>
<body>
<h2>Animation-timing-function example</h2>
<div></div>
</body>
</html>Animation-delay
Esta propriedade define o tempo (em segundos ou milissegundos) entre o carregamento do elemento e o início da animação.
Sintaxe da propriedade animation-delay
animation-delay: time | initial | inheritExemplo da propriedade animation-delay:
Exemplo da propriedade CSS animation-delay
<!DOCTYPE html>
<html>
<head>
<style>
div {
width: 120px;
height: 120px;
background: #1c87c9;
position: relative;
animation: delay 5s infinite;
animation-delay: 3s;
}
@keyframes delay {
from {
left: 0px;
}
to {
left: 300px;
}
}
</style>
</head>
<body>
<h2>Animation-delay example</h2>
<p>Here the animation starts after 3 seconds.</p>
<div></div>
</body>
</html>Animation-direction
Define se a animação deve ser reproduzida em sentido inverso em ciclos alternados ou não.
Sintaxe da propriedade animation-direction
animation-direction: normal | reverse | alternate | alternate-reverse | initial | inheritOs seguintes valores podem ser aplicados:
- normal — (padrão) a animação é reproduzida para frente (keyframes 0% - 100%)
- reverse — a animação é reproduzida para trás (keyframes 100% - 0%)
- alternate — a animação é reproduzida para frente, depois é invertida e repetida.
- alternate-reverse — a animação é reproduzida para trás e depois para frente.
Exemplo da propriedade animation-direction:
<!DOCTYPE html>
<html>
<head>
<style>
div {
width: 120px;
height: 120px;
background: #ccc;
position: relative;
animation: myfirst 5s 1;
animation-direction: normal;
}
@keyframes myfirst {
0% {
background: #8DC3CF;
left: 0px;
top: 0px;
}
25% {
background: #1c87c9;
left: 200px;
top: 0px;
}
50% {
background: #030E10;
left: 200px;
top: 200px;
}
75% {
background: #666;
left: 0px;
top: 200px;
}
100% {
background: #8ebf42;
left: 0px;
top: 0px;
}
}
</style>
</head>
<body>
<h2>Animation-direction example</h2>
<p>Here the animation plays forwards.</p>
<div></div>
</body>
</html>Animation-iteration-count
Define o número de vezes que um ciclo de animação deve ser reproduzido antes de parar. O valor padrão é um, mas qualquer valor inteiro positivo pode ser definido. Se você definir a palavra-chave infinite, a animação será reproduzida indefinidamente.
Um inteiro zero ou negativo nunca reproduzirá a animação.
Sintaxe da propriedade animation-iteration-count
animation-iteration-count: number | infinite | initial | inheritExemplo da propriedade animation-iteration-count:
Exemplo da propriedade CSS animation-iteration-count:
<!DOCTYPE html>
<html>
<head>
<title>Title of the document</title>
<style>
html,
body {
margin: 0;
padding: 0;
}
div {
position: relative;
width: 100px;
height: 100px;
margin: 30px 0;
border-radius: 50%;
animation-name: pulse;
}
.element-one {
background-color: #1c87c9;
animation-duration: 3s;
animation-iteration-count: 3;
}
.element-two {
margin: 0;
background-color: #83bf42;
animation-duration: 5s;
animation-iteration-count: 2;
}
@keyframes pulse {
0% {
left: 0;
}
50% {
left: 50%;
}
100% {
left: 0;
}
}
</style>
</head>
<body>
<h2>The animation-iteration-count example</h2>
<p>The animation-iteration-count sets the number of times an animation cycle should be played before stopping.</p>
<div class="element-one"></div>
<div class="element-two"></div>
</body>
</html>Animation-fill-mode
Esta propriedade especifica um estilo para o elemento aplicado antes ou depois da execução da animação.
Sintaxe da propriedade animation-fill-mode
animation-fill-mode: none | forwards | backwards | both | initial | inheritEla pode assumir os seguintes valores:
- forwards - especifica que o elemento deve manter os valores de estilo definidos pelo último keyframe (depende das propriedades animation-iteration-count e animation-direction).
- backwards - especifica que o elemento deve obter os valores de estilo definidos pelo primeiro keyframe (depende de animation-direction) e mantê-los durante o período de animation-delay.
- both - especifica que a animação deve seguir as regras tanto de forwards quanto de backwards.
- none - (padrão) especifica que nenhum estilo será aplicado ao elemento antes ou depois da execução da animação.
Exemplo da propriedade animation-fill-mode com o valor "forwards":
<!DOCTYPE html>
<html>
<head>
<style>
div {
width: 100px;
height: 100px;
background: #1c87c9;
position: relative;
-webkit-animation: element 5s;
/* Safari 4.0 - 8.0 */
-webkit-animation-fill-mode: forwards;
/* Safari 4.0 - 8.0 */
animation: element 5s;
animation-fill-mode: forwards;
}
/* Safari 4.0 - 8.0 */
@-webkit-keyframes element {
from {
top: 0px;
}
to {
top: 200px;
background-color: blue;
}
}
@keyframes element {
from {
top: 0px;
}
to {
top: 200px;
background-color: #8ebf42;
}
}
</style>
</head>
<body>
<h2>Animation-fill-mode example</h2>
<div></div>
</body>
</html>Animation-play-state
Esta propriedade especifica se a animação está em execução ou pausada.
Sintaxe da propriedade animation-play-state
animation-play-state: paused | running | initial | inheritO valor padrão é running.
Exemplo da propriedade animation-play-state com o valor "running":
<!DOCTYPE html>
<html>
<head>
<style>
div {
width: 150px;
height: 150px;
background: #ccc;
position: relative;
animation: play 10s;
animation-play-state: running;
}
@keyframes play {
from {
left: 0px;
}
to {
left: 200px;
}
}
</style>
</head>
<body>
<h2>Animation-play-state example</h2>
<p>Here the animation-play-state is set to "running".</p>
<div></div>
</body>
</html>Múltiplas Animações
É possível declarar múltiplas animações em um seletor; basta separar os valores com vírgulas.
Exemplo de múltiplas animações em um seletor:
Exemplo da Propriedade Animation com Múltiplas Animações
<!DOCTYPE html>
<html>
<head>
<style>
html,
body {
height: 100%;
margin: 0;
}
body {
display: flex;
align-items: center;
justify-content: center;
}
.element {
height: 200px;
width: 200px;
background-color: #1c87c9;
animation: pulse 5s ease infinite alternate, nudge 5s linear infinite alternate;
}
@keyframes pulse {
0%,
100% {
background-color: #8ebf42;
}
50% {
background-color: #1c87c9;
}
}
@keyframes nudge {
0%,
100% {
transform: translate(0, 0);
}
50% {
transform: translate(150px, 0);
}
80% {
transform: translate(-150px, 0);
}
}
</style>
</head>
<body>
<div class="element"></div>
</body>
</html>Respeitando o movimento reduzido
Movimentos grandes ou constantes podem causar náusea, tontura ou enxaquecas em alguns usuários. Os sistemas operacionais expõem uma configuração de "reduzir movimento" e você pode respeitá-la com a media query prefers-reduced-motion — desativando as animações (ou suavizando-as) para esses usuários enquanto as mantém para todos os outros.
.element {
animation: pulse 4s infinite;
}
@media (prefers-reduced-motion: reduce) {
.element {
animation: none;
}
}É uma boa prática envolver qualquer movimento não essencial nesta query para que suas animações permaneçam acessíveis.
Problemas comuns
- Sem
animation-duration, não há animação. A duração padrão é0s, portanto os keyframes nunca têm chance de ser reproduzidos. - Valores de palavra-chave e
autonão são animáveis. Como observado acima, propriedades comodisplay,visibilityeheight: autonão podem ser interpoladas. Animeopacityetransformem vez disso — eles também são os mais performáticos para animar. forwardssó funciona se o contador de iterações for finito.animation-fill-mode: forwardsmantém o último keyframe após o término da animação; cominfinite, ela nunca termina, portanto não há nada para manter.- A ordem importa para valores de tempo no shorthand. O primeiro
<time>é a duração, o segundo é o atraso.
Propriedades relacionadas
- @keyframes — define a linha do tempo da animação.
- animation-name — escolhe qual regra @keyframes reproduzir.
- transition — anima entre dois estados em um gatilho como
:hover. - transform — move, dimensiona e rotaciona elementos (ideal para animar).