Propriedade animation-fill-mode

A propriedade animation-fill-mode define em qual posição a animação deve parar após o término. Por padrão, a animação retorna ao valor inicial e isso pode não parecer muito bonito.

Sintaxe

cssseletor {
  animation-fill-mode: backwards | forwards | both | none;
}

Valores

Valor Descrição
none Se houver um atraso na animação - durante o tempo de atraso o elemento permanecerá no lugar, e depois saltará para o quadro 0%. Após o término da animação, o elemento não permanecerá no estado onde parou, mas saltará para o estado inicial.
backwards Faz com que o elemento se mova após o carregamento da página para o quadro 0%, mesmo que haja um atraso animation-delay, e permaneça lá até que a animação comece. Após o término da animação, o elemento não permanecerá no estado onde parou, mas saltará para o estado inicial.
forwards Indica ao navegador que após o término da animação, o elemento permanecerá no estado onde parou.
both Inclui backwards e forwards - após o carregamento da página, o elemento se posicionará no quadro 0%, e após o término da animação, o elemento permanecerá onde parou.

Valor padrão: none.

Exemplo . Valor none

Neste exemplo, margin-left está definido como 300px para o elemento, e para o primeiro quadro da animação - como 0px. Como não há atraso animation-delay, o elemento, após o carregamento da página, ficará em 0px, e não em 300px. Além disso, após o término, a animação saltará para o valor inicial:

html<div id="elem"></div>
css@keyframes move {
  from {
    margin-left: 0;
  }
  to {
    margin-left: 400px;
  }
}

#elem {
  margin-left: 300px;
  animation-fill-mode: none;
  animation-delay: 0s;
  animation-duration: 3s;
  animation-name: move;
  animation-iteration-count: infinite;
  animation-timing-function: linear;
  border: 1px solid black;
  width: 50px;
  height: 50px;
}

Результат:

Exemplo . Valor none

Neste exemplo, margin-left está definido como 300px para o elemento, e para o primeiro quadro da animação - como 0px. Também foi definido um atraso animation-delay de 3 segundos para o elemento, portanto, após o carregamento da página, o elemento ficará em 300px, e não em 0px, e permanecerá lá por 3 segundos, após o início da animação, e então saltará para 0px - e a animação começará de lá. Além disso, após o término, a animação saltará para o valor inicial:

html<div id="elem"></div>
css@keyframes move {
  from {
    margin-left: 0;
  }
  to {
    margin-left: 400px;
  }
}

#elem {
  margin-left: 300px;
  animation-fill-mode: none;
  animation-delay: 0s;
  animation-duration: 3s;
  animation-name: move;
  animation-iteration-count: infinite;
  animation-timing-function: linear;
  border: 1px solid black;
  width: 50px;
  height: 50px;
}

Результат:

Exemplo . Valor backwards

Neste exemplo, margin-left está definido como 300px para o elemento, e para o primeiro quadro da animação - como 0px. Também foi definido animation-fill-mode com o valor backwards para o elemento, portanto, após o carregamento da página, o elemento ficará em 0px, e não em 300px, como era o caso para animation-fill-mode com o valor none. Além disso, após o término, a animação saltará para o valor inicial:

html<div id="elem"></div>
css@keyframes move {
  from {
    margin-left: 0;
  }
  to {
    margin-left: 400px;
  }
}

#elem {
  margin-left: 300px;
  animation-fill-mode: backwards;
  animation-delay: 0s;
  animation-duration: 3s;
  animation-name: move;
  animation-iteration-count: infinite;
  animation-timing-function: linear;
  border: 1px solid black;
  width: 50px;
  height: 50px;
}

Результат:

Exemplo . Valor none e número de repetições igual a 1

Neste exemplo, margin-left está definido como 300px para o elemento, e para o primeiro quadro da animação - como 0px. Também foi definido um atraso animation-delay de 3 segundos para o elemento, portanto, após o carregamento da página, o elemento ficará em 300px, e não em 0px, e permanecerá lá por 3 segundos, após o início da animação, e então saltará para 0px - e a animação começará de lá. Como animation-fill-mode está definido com o valor none, após a reprodução da animação, o elemento retornará ao valor inicial:

html<div id="elem"></div>
css@keyframes move {
  from {
    margin-left: 0;
  }
  to {
    margin-left: 400px;
  }
}

#elem {
  margin-left: 300px;
  animation-fill-mode: none;
  animation-delay: 3s;
  animation-duration: 3s;
  animation-name: move;
  animation-iteration-count: 1;
  animation-timing-function: linear;
  border: 1px solid black;
  width: 50px;
  height: 50px;
}

Результат:

Exemplo . Valor forwards e número de repetições igual a 1

Neste exemplo, animation-fill-mode está definido com o valor forwards, e o número de repetições da animação - como 1. Após a reprodução da animação, o elemento permanecerá na posição onde a animação terminou, e não saltará para o ponto inicial.

Além disso, margin-left está definido como 300px para o elemento, e para o primeiro quadro da animação - como 0px. Também foi definido um atraso animation-delay de 3 segundos para o elemento, portanto, após o carregamento da página, o elemento ficará em 300px, e não em 0px, e permanecerá lá por 3 segundos, após o início da animação, e então saltará para 0px - e a animação começará de lá:

html<div id="elem"></div>
css@keyframes move {
  from {
    margin-left: 0;
  }
  to {
    margin-left: 400px;
  }
}

#elem {
  margin-left: 300px;
  animation-fill-mode: forwards;
  animation-delay: 3s;
  animation-duration: 3s;
  animation-name: move;
  animation-iteration-count: 1;
  animation-timing-function: linear;
  border: 1px solid black;
  width: 50px;
  height: 50px;
}

Результат:

Exemplo . Valor both e número de repetições igual a 1

Neste exemplo, animation-fill-mode está definido com o valor both, e o número de repetições da animação - como 1. Após o carregamento da página, o elemento ficará no primeiro quadro da animação (em 0px, e não em 300px), e após a reprodução da animação, o elemento permanecerá na posição onde a animação terminou, e não saltará para o ponto inicial:

html<div id="elem"></div>
css@keyframes move {
  from {
    margin-left: 0;
  }
  to {
    margin-left: 400px;
  }
}

#elem {
  margin-left: 300px;
  animation-fill-mode: both;
  animation-delay: 3s;
  animation-duration: 3s;
  animation-name: move;
  animation-iteration-count: 1;
  animation-timing-function: linear;
  border: 1px solid black;
  width: 50px;
  height: 50px;
}

Результат:

Veja também