Spielen mit Partikeln mit der Web Animations API

Avatar of Louis Hoebregts
Louis Hoebregts am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Wenn es um Bewegung und Animationen geht, liebe ich wahrscheinlich nichts mehr als Partikel. Deshalb erstelle ich jedes Mal, wenn ich neue Technologien erkunde, am Ende Demos mit möglichst vielen Partikeln.

In diesem Beitrag erstellen wir noch mehr Partikelmagie mithilfe der Web Animations API, um beim Klicken auf einen Button einen Feuerwerkseffekt zu erzeugen.

Browser-Unterstützung

Zum Zeitpunkt, an dem ich diesen Artikel schreibe, unterstützen alle gängigen Browser – mit Ausnahme von Safari und Internet Explorer – die Web Animations API zumindest teilweise. Die Safari-Unterstützung kann im Menü "Experimentelle Features" des Entwicklermenüs aktiviert werden.

Diese Browser-Unterstützungsdaten stammen von Caniuse, wo weitere Details zu finden sind. Eine Zahl bedeutet, dass der Browser die Funktion ab dieser Version unterstützt.

Desktop

ChromeFirefoxIEEdgeSafari
8475Nein8413.1

Mobil / Tablet

Android ChromeAndroid FirefoxAndroidiOS Safari
12712712713.4-13.7

Wenn Sie daran interessiert sind, die Twitter-Herz-Animation zu reproduzieren, können Sie sich auch diesen coolen Artikel von Ana Tudor ansehen, der ein weiteres großartiges Beispiel für explodierende Partikel auf einem Button ist.

HTML-Setup

Wir benötigen für diese Demo nicht viel HTML. Wir verwenden ein <button>-Element, es könnte aber auch ein anderes Tag-Element sein. Wir könnten sogar auf jeden Klick auf der Seite reagieren, um Partikel überall erscheinen zu lassen, wenn wir wirklich wollten.

<button id="button">Click on me</button>

CSS-Setup

Da jede Partikel einige CSS-Eigenschaften gemeinsam hat, können wir diese im globalen CSS der Seite festlegen. Da Sie benutzerdefinierte Tag-Elemente in HTML erstellen können, verwende ich den Tag-Namen <particle>, um die Verwendung semantischer Tags zu vermeiden. Aber in Wahrheit könnten Sie <p>, <i> oder jedes beliebige Tag animieren.

particle {
  border-radius: 50%;
  left: 0;
  pointer-events: none;
  position: fixed;
  top: 0;
}

Ein paar Dinge, die hier zu beachten sind

  • Die Partikel sollten nicht mit dem Layout unserer Seite interagieren, daher setzen wir eine fixed-Position mit top und left auf jeweils 0px.
  • Wir entfernen auch Pointer-Events, um jegliche Benutzerinteraktion mit den HTML-Partikeln zu vermeiden, während sie auf dem Bildschirm sind.

Da das Styling des Buttons und des Seitenlayouts nicht wirklich der Zweck dieses Artikels ist, lasse ich das beiseite.

JavaScript-Setup

Hier sind die sechs Schritte, denen wir in unserem JavaScript folgen werden

  1. Auf Klick-Ereignis am Button lauschen
  2. Erstellen von 30 <particle>-Elementen und Anhängen an das <body>
  3. Festlegen einer zufälligen width, height und background für jede Partikel
  4. Animieren jeder Partikel von der Mausposition zu einer zufälligen Stelle, während sie ausblendet
  5. Entfernen der <particle> aus dem DOM, wenn die Animation abgeschlossen ist

Schritt 1: Das Klick-Ereignis

// We first check if the browser supports the Web Animations API
if (document.body.animate) {
  // If yes, we add a click listener on our button
  document.querySelector('#button').addEventListener('click', pop);
}

Schritt 2: Die Partikel

// The pop() function is called on every click
function pop(e) { 
  // Loop to generate 30 particles at once
  for (let i = 0; i < 30; i++) {
    // We pass the mouse coordinates to the createParticle() function
    createParticle(e.clientX, e.clientY);
  }
}
function createParticle(x, y) {
  // Create a custom particle element
  const particle = document.createElement('particle');
  // Append the element into the body
  document.body.appendChild(particle);
}

Schritt 3: Breite, Höhe und Hintergrund der Partikel

function createParticle (x, y) {
  // [...]
  // Calculate a random size from 5px to 25px
  const size = Math.floor(Math.random() * 20 + 5);
  // Apply the size on each particle
  particle.style.width = `${size}px`;
  particle.style.height = `${size}px`;
  // Generate a random color in a blue/purple palette
  particle.style.background = `hsl(${Math.random() * 90 + 180}, 70%, 60%)`;
}

Schritt 4: Jede Partikel animieren

function createParticle (x, y) {
  // [...]
  // Generate a random x & y destination within a distance of 75px from the mouse
  const destinationX = x + (Math.random() - 0.5) * 2 * 75;
  const destinationY = y + (Math.random() - 0.5) * 2 * 75;

  // Store the animation in a variable because we will need it later
  const animation = particle.animate([
    {
      // Set the origin position of the particle
      // We offset the particle with half its size to center it around the mouse
      transform: `translate(${x - (size / 2)}px, ${y - (size / 2)}px)`,
      opacity: 1
    },
    {
      // We define the final coordinates as the second keyframe
      transform: `translate(${destinationX}px, ${destinationY}px)`,
      opacity: 0
    }
  ], {
    // Set a random duration from 500 to 1500ms
    duration: 500 + Math.random() * 1000,
    easing: 'cubic-bezier(0, .9, .57, 1)',
    // Delay every particle with a random value from 0ms to 200ms
    delay: Math.random() * 200
  });
}

Da wir eine zufällige Verzögerung haben, sind die Partikel, die auf den Beginn ihrer Animation warten, oben links auf dem Bildschirm sichtbar. Um dies zu verhindern, können wir in unserem globalen CSS die Opazität jeder Partikel auf null setzen.

particle {
  /* Same as before */
  opacity: 0;
}

Schritt 5: Partikel nach Abschluss der Animation entfernen

Es ist wichtig, die Partikelelemente aus dem DOM zu entfernen. Da wir bei jedem Klick 30 neue Elemente erstellen, kann der Speicher des Browsers ziemlich schnell voll werden und die Leistung beeinträchtigen. Hier ist, wie wir das machen können

function createParticle (x, y) {
  // Same as before
  // When the animation is finished, remove the element from the DOM
  animation.onfinish = () => {
    particle.remove();
  };
}

Endergebnis

Wenn wir alles zusammenfügen, erhalten wir das, was wir suchen: eine farbenfrohe Explosion von Partikelgüte.

Sie sehen die Animation in der Demo nicht? Überprüfen Sie, ob Ihr Browser die Web Animations API unterstützt. in der Support-Tabelle am Anfang des Beitrags.

Seien Sie kreativ!

Da all dies CSS verwendet, ist es ziemlich einfach, die Partikelstile zu ändern. Hier sind fünf Beispiele, die verschiedene Formen... und sogar Zeichen verwenden!


Oder hey, wir können sogar den Button selbst explodieren lassen, wie Zach Saucier es in diesem Beitrag getan hat.

A button with a gradient exploding into particles