Creëer complexe animatiecurven in CSS met de lineaire()-easingfunctie

Maak kennis met linear() , een easing-functie in CSS die lineair interpoleert tussen de punten, waardoor je stuiterende en verende effecten kunt nabootsen.

Versoepelingen in CSS

Bij het animeren of laten overgaan van elementen in CSS, bepaal je de snelheid waarmee een waarde verandert met een easing-functie met behulp van de eigenschappen animation-timing-function en transition-timing-function .

Er zijn verschillende trefwoorden beschikbaar als presets in CSS, namelijk linear , ease , ease-in , ease-out en ease-in-out . Om je eigen easing-curven te creëren, gebruik je de functie cubic-bezier() , of kies je voor een stapsgewijze aanpak met de easing-functie steps() .

Bij correct gebruik geven easing-effecten een geanimeerd element een gevoel van gewicht, waardoor het lijkt alsof het momentum opbouwt.

Het creëren van complexe curves zoals stuiterende of verende effecten is niet mogelijk in CSS, maar dankzij linear() kun je ze nu verbazingwekkend goed benaderen.

Een inleiding tot linear()

Browser Support

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

Source

Een nieuwe manier om een ​​easing in CSS te definiëren is met linear() . Deze functie accepteert een aantal stops, gescheiden door komma's. Elke stop is een enkel getal tussen 0 en 1. Tussen elke stop wordt de interpolatie lineair uitgevoerd, wat de naam van de functie verklaart.

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

Deze stops zijn standaard gelijkmatig verdeeld. In het voorgaande codefragment betekent dit dat de uitvoerwaarde van 0.25 wordt gebruikt bij 50%.

Visualisatie van de grafiek voor linear(0, 0.25, 1) ziet er als volgt uit:

Grafiekvisualisatie van lineair (0, 0,25, 1).

Als u niet wilt dat de stops gelijkmatig verdeeld zijn, kunt u optioneel een stoplengte opgeven. Wanneer u één waarde als stoplengte opgeeft, definieert u het startpunt ervan:

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

Hier wordt een uitvoerwaarde van 0.25 niet gebruikt bij 50% , maar wel bij 75% .

Grafiekvisualisatie van lineair(0, 0,25 75%, 1).

Wanneer je twee waarden opgeeft als stoplengte, definieer je zowel het begin- als het eindpunt:

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

Een uitvoerwaarde van 0,25 zal gedurende 25% tot 75% van de tijd worden gebruikt.

Grafiekvisualisatie van lineair (0, 0,25 25% 75%, 1).

Complexe krommen creëren

Hoewel de voorgaande voorbeelden eenvoudigere easing-functies zijn, kunt u linear() gebruiken om complexere easing-functies na te bootsen, zij het met een kleine concessie aan de precisie.

Neem bijvoorbeeld deze bounce easing curve, een type easing dat niet direct in CSS kan worden uitgedrukt, maar is gedefinieerd met behulp van 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;
}

Hoewel de code zelf misschien niet veel zegt, kan een visualisatie dat wel. Hier is de output, weergegeven als een blauwe curve:

Een vloeiende, stuiterende curve, getekend in blauw.

De curve kan worden vereenvoudigd door er een aantal haltes aan toe te voegen. Hier geeft elke groene stip een halte aan:

Een vloeiende, stuiterende curve in blauw, met groene stippen erop.

Wanneer dit wordt doorgegeven aan linear() , is het resultaat een curve die enigszins lijkt op de originele, maar met iets ruwere randen.

Een vereenvoudigde curve in groen, bovenop de oorspronkelijke vloeiende curve in blauw.

Vergelijk het groene animatievak met het blauwe; je ziet meteen dat het minder vloeiend is.

Maar als je voldoende tussenstops toevoegt, kun je de oorspronkelijke curve vrij goed benaderen. Hier is een bijgewerkte versie:

Een vernieuwde route, met twee keer zoveel haltes.

Door het aantal stops te verdubbelen, krijg je al een vloeiend resultaat.

De code die gebruikt wordt voor de animatie ziet er als volgt uit:

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

Een hulpmiddel

Het handmatig maken van deze lijst met stops zou erg omslachtig zijn. Gelukkig hebben Jake en Adam een ​​tool ontwikkeld waarmee je een easing curve kunt omzetten naar een linear() .

Hulpmiddel voor het genereren van lineaire easing.
Screenshot van https://linear-easing-generator.netlify.app/ in actie.

De tool gebruikt een JavaScript-easingfunctie of een SVG-curve als invoer en genereert de vereenvoudigde curve met behulp van de linear() . Gebruik de schuifregelaars om het gewenste aantal stops en de precisie ervan te bepalen.

Rechtsboven kunt u ook een van de voorinstellingen kiezen: Spring, Bounce, Simple elastic of Material Design emphasised easing zijn inbegrepen.

DevTools-ondersteuning

In DevTools is ondersteuning beschikbaar voor het visualiseren en bewerken van het resultaat van linear() . Klik op het pictogram om een ​​interactieve tooltip weer te geven waarmee u de eindpunten kunt verslepen.

De lineaire editor van Chrome DevTools.
Screenshot van de `linear()`-editor van Chrome DevTools.

Deze DevTools-functie is beschikbaar in DevTools vanaf Chrome 114.