Criar curvas de animação complexas em CSS com a função de easing linear()

Apresentamos a linear(), uma função de easing no CSS que interpola linearmente entre os pontos, permitindo recriar efeitos de salto e mola.

Easings no CSS

Ao animar ou fazer a transição de elementos no CSS, você controla a taxa em que um valor muda com uma função de suavização usando as propriedades animation-timing-function e transition-timing-function.

Há várias palavras-chave disponíveis como predefinições no CSS: linear, ease, ease-in, ease-out e ease-in-out. Para criar suas próprias curvas de transição, use a função cubic-bezier() ou use a abordagem baseada em etapas usando a função de transição steps().

Quando usados adequadamente, os efeitos de easing dão a um elemento animado uma sensação de peso, porque parecem gerar impulso.

Não é possível criar curvas complexas, como efeitos de salto ou mola, no CSS, mas, graças a linear(), agora é possível fazer aproximações surpreendentes.

Uma introdução ao app linear()

Compatibilidade com navegadores

  • Chrome: 113.
  • Edge: 113.
  • Firefox: 112.
  • Safari: 17.2.

Uma nova maneira de definir uma transição suave no CSS é com linear(). Essa função aceita uma série de paradas separadas por vírgulas. Cada parada é um número único que varia de 0 a 1. Entre cada parada, a interpolação é feita de maneira linear, explicando o nome da função.

animation-timing-function: linear(0, 0.25, 1);

Por padrão, essas paradas são distribuídas de maneira equidistante. No snippet anterior, isso significa que o valor de saída de 0.25 será usado na marca de 50%.

O gráfico de linear(0, 0.25, 1) fica assim:

Visualização de gráfico de linear(0, 0,25, 1).

Se não quiser que as paradas sejam espalhadas de forma equidistante, você pode usar uma duração da parada. Ao transmitir um valor como uma duração de parada, você define o ponto de partida:

animation-timing-function: linear(0, 0.25 75%, 1);

Aqui, um valor de saída de 0.25 não será usado na marca 50%, mas em 75%.

Visualização de gráfico de linear(0, 0,25 75%, 1).

Ao especificar dois valores como comprimento da parada, você define o ponto inicial e final:

animation-timing-function: linear(0, 0.25 25% 75%, 1);

Um valor de saída de 0,25 será usado de 25% a 75% no tempo.

Visualização de gráfico de linear(0, 0,25 25% 75%, 1).

Como criar curvas complexas com linear()

Embora os exemplos acima sejam transições muito simples, você pode usar linear() para recriar funções de transição complexas de maneira muito simples, com a perda de precisão.

Considere esta curva de suavização de salto, um tipo de suavização que não pode ser expressa diretamente no CSS, definida usando JavaScript:

function easing(pos) {
  const t = 7.5625;
  const e = 2.75;
  return pos < 1 / e
    ? t * pos * pos
    : pos < 2 / e
    ? t * (pos -= 1.5 / e) * pos + 0.75
    : pos < 2.5 / e
    ? t * (pos -= 2.25 / e) * pos + 0.9375
    : t * (pos -= 2.625 / e) * pos + 0.984375;
}

Embora o código possa não informar muito, uma visualização pode. Confira a saída, visualizada como uma curva azul:

Uma curva de retorno suave desenhada em azul.

A curva pode ser simplificada adicionando várias paradas a ela. Aqui, cada ponto verde indica uma parada:

Uma curva de rejeição suave em azul, com pontos verdes na parte de cima.

Quando transmitida para linear(), o resultado é uma curva que se parece com a original, mas é um pouco mais áspera nas bordas.

Uma curva simplificada em verde sobreposta à curva suave original em azul.

Compare a caixa verde animada com a azul. Você vai perceber que ela não é tão suave.

No entanto, se você adicionar paradas suficientes, poderá aproximar a curva original. Aqui está uma versão atualizada:

Uma curva atualizada, com o dobro do número de paradas.

Basta dobrar o número de paradas para ter um resultado tranquilo.

O código usado para a animação tem esta aparência:

animation-timing-function: linear(
  /* Start to 1st bounce */
  0, 0.004, 0.016, 0.035, 0.063 9.1%, 0.141, 0.25, 0.391, 0.563, 0.765, 1,
  /* 1st to 2nd bounce */
  0.891, 0.813 45.5%, 0.785, 0.766, 0.754, 0.75, 0.754, 0.766, 0.785, 0.813 63.6%, 0.891, 1 72.7%,
  /* 2nd to 3rd bounce */
  0.973, 0.953, 0.941, 0.938, 0.941, 0.953, 0.973, 1,
  /* 3rd bounce to end */
  0.988, 0.984, 0.988, 1
);

Uma ferramenta para ajudar

Criar essa lista de paradas manualmente seria muito trabalhoso. Felizmente, Jake e Adam criaram uma ferramenta para ajudar a converter uma curva de easing na contraparte linear().

Captura de tela da ferramenta de geração de transição linear.
Captura de tela de https://linear-easing-generator.netlify.app/ em ação.

A ferramenta usa uma função de easing do JavaScript ou uma curva SVG como entrada e gera a curva simplificada usando linear(). Use os controles deslizantes para controlar o número de paradas e a precisão delas.

No canto superior direito, você também pode escolher uma das predefinições: Spring, Bounce, Simple elastic ou easing com ênfase do Material Design estão incluídos.

Suporte ao DevTools

No DevTools, há suporte para visualizar e editar o resultado de linear(). Clique no ícone para mostrar uma dica interativa que permite arrastar pelas paradas.

Captura de tela do editor &quot;linear()&quot; do Chrome DevTools.
Captura de tela do editor "linear()" do Chrome DevTools.

Esse recurso está disponível no DevTools com o Chrome 114.

Foto de Howie Mapson no Unsplash