CSS Transition e CSS Animation

Um guia rápido pra você entender e começar a usar essas duas propriedades do CSS3.

CSS Transition e CSS Animation
Photo by Maria De Luca / Unsplash

Transition. Prazer!

Mostrar um feedback ao usuário quando ele passar o mouse sobre um link (:hover) ou quando ele der foco em um campo input (:focus) são boas práticas. Há muitos jeitos de fazermos isso: mudando a cor do texto, tirando o underline da palavra, alterando a borda do input que recebeu o foco ou até alterando a cor de background do elemento. (Esse artigo da Smashing Magazine trata muito bem a questão da estilização de links).

Normalmente fazemos isso alterando o valor de uma propriedade CSS no estado :hover ou :focus do elemento. Quando fazemos isso, o resultado é instantâneo. Melhor dizendo, a alteração ocorre imediatamente ao usuário fazer a ação (seja passar o mouse sobre o elemento ou este ganhar foco). A alteração ocorre de forma brusca, do valor antigo da propriedade para o novo valor. Por exemplo, quando temos um elemento com borda colorida, e utilizamos o estado :hover para alterarmos a cor da borda, essa transição entre uma cor e outra acontece imediatamente assim que você passa o mouse em cima do elemento.

É aí que entra a transition do CSS3. Ela analisa a mudança de valor entre a propriedade e faz com que essa transição, ao invés de ocorrer de forma brusca, ocorra suavemente em um tempo determinado.

Nesse exemplo, passe o mouse sobre o logo do Tableless abaixo e veja um exemplo da propriedade transition em conjunto com a propriedade transform.

A propriedade transition possui quatro propriedades para você configurar:

  • transition-property*,
  • transition-duration*,
  • transition-timing-function
  • e transition-delay.

* propriedades obrigatórias na declaração. As demais caso omitidas, assumem seu valor default. transition-property: Nome da propriedade CSS sobre a qual o efeito da transição vai ser aplicado. É obrigatória na declaração pois caso seja omitida, não existirá uma propriedade para se aplicar o efeito da transição. É possível ainda aplicar uma mesma transição para todas as propriedades CSS do elemento, basta colocar o valor all. Aqui você encontra uma tabela com todas as propriedades que suportam transition.

transition-duration: Duração do efeito em segundos (o padrão é 0). Também é obrigatória na declaração pois, se omitida, assume seu valor default que é zero e a transição não vai ter efeito.

transition-timing-function: Forma como a transição progride no tempo (o padrão é ease). Falando de um jeito mais fácil, é como se comporta o ritmo da transição durante o efeito. Pode ser usado de duas maneiras: uma é utilizando alguns valores já pré-definidos que são:

linear, ease, ease-in, ease-out e ease-in-out;

…e a outra é definindo uma função customizada, especificando quatro coordenadas para definir a cubic bezier curve:

Esse site ajuda e muito. Tanto para entender o funcionamento da cubic bezier, quanto para customizar a sua própria transição.

transition-delay: Define a partir de quanto tempo (em segundos) o efeito da transição vai se iniciar (o padrão é 0).

Passe o mouse sobre o retângulo cinza no exemplo abaixo para ver a transition em ação:

*Nos exemplos a seguir, para facilitar a leitura, não utilizei prefixos. Mas, recomendo que dêem uma olhada no Can I Use para usar os prefixos correspondentes para cada browser.

No exemplo acima, a propriedade que recebeu o efeito da transição é a border-color, a duração do efeito é de 1 segundo, o efeito (ou ritmo) é linear e o delay para a transição se iniciar é de 0.1 segundo.

Escrevendo menos…

É possível encurtar a sintaxe em um shortcode bem simples. Basta declarar a propriedade transition que ela agrupa as quatro propriedades específicas que vimos acima. As palavras mágicas e a ordem são as seguintes:

O exemplo visto acima ficaria dessa maneira:

Um outro exemplo, agora adicionando o efeito da transição na opacidade:

No exemplo acima, se olharmos a aba do CSS identificamos a seguinte chamada:

Podemos notar que as propriedades timing-function e delay foram omitidas. Com isso, elas assumem seus valores default que são ease e __ respectivamente.

E mais de uma propriedade.. tem como?

É possível aplicar transições diferentes para mais de uma propriedade em um mesmo elemento. Para isso é só você separar cada bloco de declaração de efeito com vírgulas:

No código acima definimos duas transições:

  • a primeira com o efeito da transição aplicado na opacidade, que já havia sido configurada no exemplo anterior;
  • a segunda que define que a propriedade a receber o efeito da transição é o padding, a duração vai ser de 0.25 segundos, o ritmo como está omitido assume seu valor default que é ease e o delay, como também está omitido, assume seu valor default que é __.

É possível ainda definir uma transição padrão para todas as propriedades de um elemento:

No caso, definimos o valor all para a property, o que significa que todas as transições do elemento terão a duração de 1 segundo, o ritmo será linear e o delay será __.

Suporte

  • IE 10
  • FF 1
  • Chrome 4
  • Safari 3.1
  • Opera 10.5

Fonte: Can I Use

Animation

A regra dos keyframes

Indo direto ao ponto: É aonde as animações são criadas.

Um keyframe descreve como o elemento que vai ser animado, deve ser renderizado em uma determinada fase, durante a sequência da animação.

Ou seja, cada keyframe contém uma ou mais propriedades CSS que vão ser aplicadas no elemento que será ser animado e, a animação se encarrega de mudar de um keyframe para outro, aplicando a transição entre as mudanças de CSS.

A sintaxe para a criação de keyframes é a seguinte:

Existem duas maneiras para se criar nossos amigos keyframes:

É a forma mais básica, onde definimos um início e um fim para a animação. No exemplo acima, from é equivalente ao início da animação (0%) e to é equivalente ao final da animação (100%).

Já essa é a maneira que temos maior controle da animação. Para isso, utilizamos porcentagem para definir os keyframes. No código acima, a animação possui 5 passos e, a porcentagem é relativa à duração da animação que vai ser definida posteriormente.

Com a animação criada nos keyframes, precisamos vinculá-la a algum seletor, caso contrário a animação não terá nenhum efeito. Para fazer isso, temos que declarar pelo menos duas propriedades que são obrigatórias:

  • o nome da animação (igual ao especificado nos keyframes);
  • a duração da animação (se não for declarada, a animação não se inicia pois o valor padrão é 0).

Confira no exemplo as animações com os dois modelos de keyframes citados acima:

Mas a animation do CSS3 possui mais propriedades. Vamos conhecer as outras….

As propriedades

animation-name: Nome da animação especificada nos @keyframes;

animation-duration: Quanto tempo, em segundos ou milisegundos, durará um ciclo da animação (o padrão é 0).

animation-timing-function: Forma como a animação progride no tempo (o padrão é ease). Do mesmo modo que a propriedade transition, pode ser usada de duas maneiras: uma é utilizando alguns valores já pré-definidos que são:

linear, ease, ease-in, ease-out e ease-in-out;

… e a outra é definindo uma função customizada, especificando quatro coordenadas para definir a cubic bezier curve:

animation-delay: Define a partir de quanto tempo a animação vai se iniciar (o padrão é 0).

animation-iteration-count: Determina o número de vezes que a animação vai se repetir (o padrão é 1). Podemos deixar a animação repetindo infinitamente, basta especificar o valor infinite.

animation-direction: Especifica se ao final da animação, ela deve reiniciar seu fluxo normalmente (normal), que é o padrão, ou voltar no sentido inverso (reverse).

animation-play-state: Define se a animação está rodando (running), que é o padrão, ou pausada (paused).

Montando o bolo…

Escrevendo menos…

Da mesma forma que a propriedade transition, também é possível encurtar a sintaxe em um shortcode. Basta declarar a propriedade animation que ela agrupa todas as propriedades que vimos acima. As palavras mágicas e a ordem são as seguintes:

O bolo acima ficaria dessa maneira:

Mais dois exemplos (1 e 2) em conjunto com a propriedade transform.

Suporte

  • IE 10
  • FF 5
  • Chrome 4
  • Safari 4
  • Opera 12

Fonte: Can I Use