CSS Keyframe-Animationen

CSS-Animationen werden mittlerweile von allen modernen Browsern unterstützt und ersetzen daher in vielen Bereichen Effekte, die einst nur über JavaScript realisiert werden konnten. Neben den sog. CSS-Transitions sind vor allem die CSS-Keyframe-Animationen interessant. Mit Keyframe-Animationen können komplexe Animationsabläufe über sog. Schlüsselbilder (keyframes) erzeugt werden. Im Gegensatz zu Transitions, die eine Interaktion des Users voraussetzen, können Keyframe-Animationen auch selbstständig ablaufen.

Die Syntax

Eine Keyframe-Animation wird in zwei Teilen aufgebaut. Mit der @keyframes-Regel wird bestimmt, wie die Animation heißen soll, welche Schlüsselbilder es in der Animation gibt und welche CSS-Eigenschaften animiert werden sollen. Die simpelste Keyframe-Animation besteht aus zwei Schlüsselbildern, für den Beginn und das Ende der Animation.

@keyframes meine-animation {
  from {
    /* Eigenschaften zum Beginn der Animation */ 
  }

  to {
    /* Eigenschaften zum Ende der Animation */ 
  }
}

.mein-selektor {
  animation-name: meine-animation;
  animation-duration: 2s;
  animation-iteration-count: infinite;
  /* weitere animation-Eigenschaften */
}

Der zweite Teil der Animation wird im Selektor des Objekts, das animiert werden soll notiert. Dazu existieren die animation-Eigenschaften in CSS:

animation-name (Pflichtangabe)

Über die Eigenschaft animation-name definiert man welche Keyframes verwendet werden sollen. Es muss der in der @keyframes-Regel verwendete Name angegeben werden.

animation-duration (Pflichtangabe)

Mit animation-duration wird in Sekunden festgelegt wie lange die Animation dauern soll.

animation-iteration-count (Pflichtangabe)

Mit der Eigenschaft animation-iteration-count wird bestimmt wie oft die Animation ablaufen soll. Mögliche Werte sind das Schlüsselwort infinite für unendliche viele Wiederholungen. Ansonsten kann ein beliebiger Zahlwert angegeben werden.

Beispiel anschauen

animation-timing-function

Mit animation-timing-function wird bestimmt, wie die Animationskurve aussehen soll. Hier existieren die Schlüsselbegriffe ease, steps(<integer>, start), steps(<integer>, end), linear, ease-out, ease-in-out, ease-in für bereits vordefinierte Animationskurven. Wenn eine eigene Kurve verwendet werden soll, kann sie über ein Tool erzeugt und schließend in form von cubic-bezier(<number>, <number>, <number>, <number>) eingefügt werden. Der Standard-Wert ist ease.

Beispiel anschauen

animation-delay

Mit animation-delay wird eine Verzögerung der Animation in Sekunden festgelegt.

Beispiel anschauen

animation-direction

Mit animation-direction kann die Richtung der Animation festgelegt werden. Mögliche Werte sind normalreverse (die Animation wird rückwärts abgespielt), alternate-reverse (die Animation wird bei jedem ungeraden Durchlauf rückwärts abgespielt) und alternate (die Animation wird bei jedem geraden Durchlauf rückwärts abgespielt).

Beispiel anschauen

animation-fill-mode

Mit animation-fill-mode wird festgelegt, wie das Objekt sich verhalten soll, wenn die Animation gerade nicht läuft. Beispielsweise weil über animation-delay eine Verzögerung eingestellt wurde oder die Animation bereits abgelaufen ist. Es sind folgende Werte erlaubt: noneforwards (Zustand zum Ende der Animation), backwards (Zustand zum Beginn der Animation), both (kombinierte Werte aus dem Beginn und dem Ende der Navigation)

animation-play-state

Mit animation-play-state wird festgelegt ob die Animation abgespielt wird oder pausiert. Mit dem Wert running wird die Animation abgespielt, mit paused pausiert. Dies macht in Kombination mit Mouse-Over-Effekten oder JavaScript Sinn.

Beispiel anschauen

Kurzschreibweise

Die Kurzschreibweise für die oben genannten animation-Eigenschaften lautet animation. Die Werte müssen in folgender Reihenfolge angegeben werden.

.selektor {
  animation: [animation-name] [animation-duration] [animation-timing-function] [animation-delay] [animation-iteration-count] [animation-direction] [animation-fill-mode] [animation-play-state]
}

Komplexe Animationen

Innerhalb der @keyframes-Regel können beliebig viele Schlüsselbilder angegeben werden. Wenn es mehr als zwei sind, wird die Position auf der Zeitleiste in Prozent angegeben.

@keyframes meine-animation {
  0% {
    /* Eigenschaften zum Beginn der Animation */ 
  }
  50% {
    /* Eigenschaften nach der Hälfte der Animation */ 
  }
  100% {  
    /* Eigenschaften zum Ende der Animation */   
  }
}

Es können auch Werte zusammengefasst werden.

@keyframes meine-animation {
  0% {
    /* Eigenschaften zum Beginn der Animation */ 
  }
  25%, 75% {
    /* Eigenschaften von 1/4 bis 3/4 der Animation */ 
  }
  100% {  
    /* Eigenschaften zum Ende der Animation */   
  }
}

Beispiel 1: Objekte bewegen und Farbe wechseln

Das folgende Beispiel zeigt, wie eine Keyframe-Animation aufgebaut sein kann. Wir bewegen einen <div> zwischen vier Koordinaten und wechseln zusätzlich die Farbe.

<div class="mein-element"></div>
.mein-element {
  height:120px;
  width:120px;
  background:silver;
  border-radius: 100%;
  position: absolute;
  animation-name:meine-animation;
  animation-duration:4s;
  animation-iteration-count:infinite;
}

@keyframes meine-animation {
  0%, 100% {
    background-color:red;
    top:50px;
    left:50px;
  }

  25% {
    background-color:gold;
    top:50px;
    left:600px;
  }

  50% {
    background-color:lime;
    top:600px;
    left:600px;
  }

  75% {
    background-color: blue;
    top:600px;
    left:50px;
  }
}

Beispiel anschauen

Mit weiteren Elementen und der animation-delay-Eigenschaft, kann der Effekt noch ansprechender gestaltet werden:

<div class="mein-element"></div>
<div class="mein-element"></div>
<div class="mein-element"></div>
<div class="mein-element"></div>
.mein-element:nth-of-type(2) {
  animation-delay:1s;
  animation-fill-mode:backwards;
}

.mein-element:nth-of-type(3) {
  animation-delay:2s;
  animation-fill-mode:backwards;
}

.mein-element:nth-of-type(4) {
  animation-delay:3s;
  animation-fill-mode:backwards;
}

/* Der übrige CSS-Code ist mit oben gezeigten Beispiel identisch */

Beispiel anschauen

Beispiel 2: Animierte Grafik

Das zweite Beispiel zeigt einen Hai der im Meer schwimmt. Der Hai selbst bewegt sich dabei nur minimal nach links und rechts, der Effekt entsteht in erster Linie durch die Verschiebung des Hintergrunds. Das Beispiel verwendet mehrere Hintergrundbilder um ohne überflüssige HTML-Elemente auszukommen. Darüber hinaus wird in diesem Beispiel die Kurzschreibweise für Animationen verwendet.

<div></div>
div {
  width:800px;
  height:600px;
  background-color:#034557;
  background-image: url(hai.png), url(fische.png);
  background-position: top 150px left 120px, 110px 90px;
  background-repeat: no-repeat, repeat-x;
  animation:ocean .75s infinite linear;
}

@keyframes ocean {
  0%{
    background-position: top 150px left 120px, 110px 90px;
  }

  50% {
    background-position: top 150px left 100px, 362px 90px; /* Die Fische werden um die Häfte der Breite der fische.png-Grafik verschoben */
  }

  100% {
    background-position: top 150px left 120px, 615px 90px; /* Die Fische werden um die volle Breite der fische.png-Grafik verschoben */ 
  }
}

Beispiel anschauen