Créer des courbes d'animation complexes en CSS avec la fonction de lissage de vitesse linear()

Introduction de linear(), une fonction de lissage de vitesse en CSS qui effectue une interpolation linéaire entre ses points, ce qui vous permet de recréer les effets de rebond et de rebond.

Lissages de vitesse dans CSS

Lors de l'animation ou de la transition d'éléments en CSS, vous pouvez contrôler la fréquence à laquelle une valeur change à l'aide d'une fonction de lissage de vitesse, à l'aide des propriétés animation-timing-function et transition-timing-function.

Plusieurs mots clés prédéfinis sont disponibles en CSS, à savoir linear, ease, ease-in, ease-out et ease-in-out. Pour créer vos propres courbes de lissage de vitesse, utilisez la fonction cubic-bezier() ou optez pour une approche basée sur des étapes à l'aide de la fonction de lissage de vitesse steps().

Lorsqu'ils sont utilisés correctement, les lissages de vitesse donnent une impression de poids à un élément animé, car il semble prendre de l'ampleur.

Il n'est pas possible de créer des courbes complexes telles que des effets de rebond ou de rebond en CSS, mais grâce à linear(), vous pouvez désormais les approximations étonnamment bien.

Présentation de linear()

Navigateurs pris en charge

  • 113
  • 113
  • 112
  • x

linear() est une nouvelle façon de définir un lissage de vitesse en CSS. Cette fonction accepte un certain nombre d'arrêts, séparés par une virgule. Chaque arrêt correspond à un numéro unique compris entre 0 et 1. L'interpolation entre chaque arrêt est effectuée de manière linéaire et explique le nom de la fonction.

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

Par défaut, ces arrêts sont répartis à égale distance. Dans l'extrait précédent, cela signifie que la valeur de sortie de 0.25 sera utilisée lorsque la marque aura atteint 50 %.

Ici, le graphique pour linear(0, 0.25, 1) ressemble à ceci:

Visualisation sous forme de graphique de linéaire(0, 0,25, 1).

Si vous ne souhaitez pas que les arrêts soient répartis à égale distance, vous pouvez éventuellement indiquer une longueur d'arrêt. Lorsque vous transmettez une valeur en tant que longueur d'arrêt, vous définissez son point de départ:

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

Ici, la valeur de sortie 0.25 ne sera pas utilisée au niveau de la marque 50%, mais sous 75%.

Visualisation sous forme de graphique de linéaire(0, 0,25 75%, 1).

Lorsque vous spécifiez deux valeurs comme longueur d'arrêt, vous définissez à la fois son point de départ et son point d'arrivée:

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

Une valeur de sortie de 0,25 sera utilisée entre 25% et 75% dans le temps.

Visualisation sous forme de graphique de type linéaire(0, 0,25 25 %, 75%, 1).

Créer des courbes complexes avec linear()

Bien que les exemples ci-dessus soient des lissages de vitesse très simples, vous pouvez utiliser linear() pour recréer très simplement des fonctions de lissage de vitesse complexes, au risque de perdre une certaine précision.

Prenons cette courbe du lissage de vitesse, un type d'accélération qui ne peut pas être exprimé directement en CSS et qui est défini à l'aide de 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;
}

Si le code ne vous apprendra peut-être pas grand-chose, une visualisation le pourrait. Voici la sortie, représentée sous forme de courbe bleue:

Courbe de rebond lisse, tracée en bleu.

Vous pouvez simplifier la courbe en y ajoutant un certain nombre d'arrêts. Ici, chaque point vert indique un arrêt:

Courbe de rebond lisse en bleu, avec des points verts en haut.

Lorsqu'elle est transmise à linear(), le résultat est une courbe qui ressemble un peu à la courbe d'origine, mais est un peu plus rugueuse sur les bords.

Courbe verte simplifiée superposée à la courbe lisse d&#39;origine en bleu.

Comparez la boîte animée verte à la boîte bleue. Vous constatez qu'elle n'est pas aussi fluide.

Toutefois, si vous ajoutez suffisamment d'arrêts, vous pourrez très bien vous rapprocher de la courbe d'origine. Voici la version mise à jour:

Courbe mise à jour, avec deux fois le nombre d&#39;arrêts.

En doublant simplement le nombre d'arrêts, vous obtenez déjà des résultats fluides.

Le code utilisé pour l'animation se présente comme suit:

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
);

Un outil pour vous aider

La création manuelle de cette liste d'arrêts serait très fastidieuse. Heureusement, Jake et Adam ont créé un outil pour vous aider à convertir une courbe de lissage de vitesse en son équivalent linear().

Capture d&#39;écran du générateur de lissage de vitesse linéaire.
Capture d'écran de https://linear-easing-generator.netlify.app/ en action

L'outil utilise une fonction de lissage de vitesse JavaScript ou une courbe SVG en entrée et génère la courbe simplifiée à l'aide de linear(). À l'aide des curseurs, contrôlez le nombre d'étapes souhaitées et leur précision.

Vous pouvez également sélectionner l'un des préréglages proposés dans l'angle supérieur droit : "Ressort", "Rebond", "Élastique simple" ou "Lissage de vitesse accentué par Material Design".

Assistance pour les outils de développement

Les outils de développement permettent de visualiser et de modifier le résultat de linear(). Cliquez sur l'icône pour afficher une info-bulle interactive qui vous permet de faire glisser le curseur autour des arrêts.

Capture d&#39;écran de l&#39;éditeur &quot;linear()&quot; dans les outils pour les développeurs Chrome.
Capture d'écran de l'éditeur `linear()` des outils pour les développeurs Chrome.

Cette fonctionnalité est disponible dans les outils de développement disponibles dans Chrome 114.

Photo par Howie Mapson, publiée sur Unsplash