CSS und Web

Animierte CSS-Farbverlaufshintergründe, richtig gemacht

Farbverläufe lassen sich nicht direkt animieren, aber alles um sie herum schon. Vier Techniken, was jede den Browser kostet und wie du Bewegung ruhig und optional hältst.

GradientlyVerifiziertes Gradiently-Konto··4 Min. Lesezeit
Cover: Pine Afternoon · GR·6MTX·YD

Die Kurzfassung

  • Browser können nicht zwischen zwei Farbverlaufswerten interpolieren, deshalb bewegt, blendet oder transformiert ein animierter CSS-Farbverlauf den Verlauf, statt ihn direkt zu animieren.
  • Die klassische Technik macht den Hintergrund größer als das Element und animiert background-position, was überall funktioniert, aber in jedem Frame neu zeichnet.
  • Mit @property registrierte benutzerdefinierte Eigenschaften lassen den Browser einzelne Farben, Winkel und Positionen innerhalb eines Farbverlaufs animieren.
  • Transform oder Opacity auf einer eigenen Verlaufsebene zu animieren ist meist die günstigste Option, weil Browser das oft ohne Neuzeichnen zusammensetzen können.
  • Jede Verlaufsanimation sollte anhalten oder nahezu stillstehen, wenn Nutzende reduzierte Bewegung angefragt haben.
Auf dieser Seite

Ein animierter CSS-Farbverlauf ist ein Verlaufshintergrund, der im Lauf der Zeit Farbe oder Position ändert. Es gibt einen Haken: Schreibst du zwei verschiedene Verläufe in eine @keyframes-Regel, blenden Browser nicht dazwischen über, sondern springen. Deshalb animiert jede funktionierende Technik stattdessen etwas neben dem Verlauf: seine Position, die benutzerdefinierten Eigenschaften darin oder die Ebene, auf die er gemalt ist. Welche du wählst, entscheidet, wie flüssig es aussieht und wie viel Arbeit der Browser in jedem Frame hat.

Drei Momente einer langsamen Animation. Richtung und Farbe bewegen sich, aber die Palette bleibt eine Familie.

Zur Designseite, dazu, wann Bewegung einer Marke hilft und wie du sie taktest, siehe animierte Farbverlaufshintergründe. Dieser Leitfaden ist der Code.

Technik 1: einen übergroßen Hintergrund bewegen

Mache den Verlauf mit background-size zwei- bis viermal so groß wie das Element und animiere dann background-position, sodass im Lauf der Zeit ein anderer Teil sichtbar wird. Das funktioniert in jedem Browser und braucht kein JavaScript. Nutze alternate, damit sich die Bewegung sanft umkehrt, statt an den Anfang zurückzuspringen.

css
.hero {
  background-color: #1e1b4b;
  background-image: linear-gradient(120deg, #1e1b4b, #7c3aed, #f472b6, #fb923c);
  background-size: 300% 300%;
  animation: pan 18s ease-in-out infinite alternate;
}

@keyframes pan {
  from { background-position: 0% 50%; }
  to   { background-position: 100% 50%; }
}
Der klassische animierte Farbverlauf. Langsame Dauern von 12 bis 30 Sekunden wirken eher als Ambiente denn als Unruhe.

Der Preis: background-position können Browser nicht allein auf der Grafikkarte bewegen, daher wird das Element in jedem Frame neu gezeichnet. Bei einem Button ist das nichts. Bei einem bildschirmfüllenden Hero ist es echte Arbeit, die läuft, solange die Seite offen ist.

Technik 2: Farbstopps mit @property animieren

Benutzerdefinierte Eigenschaften sind normalerweise Zeichenfolgen, die sich nicht interpolieren lassen. Registrierst du eine mit @property, bekommt sie einen Typ wie <color>, <angle> oder <percentage>, und typisierte Eigenschaften lassen sich flüssig animieren. Nutzt du sie im Verlauf, kannst du die Farben, den Winkel oder die Position eines Stopps direkt animieren. @property wird in allen aktuellen großen Browsern unterstützt; prüfe caniuse, falls du ältere unterstützt.

css
@property --from {
  syntax: "<color>";
  inherits: false;
  initial-value: #7c3aed;
}
@property --to {
  syntax: "<color>";
  inherits: false;
  initial-value: #f472b6;
}
@property --angle {
  syntax: "<angle>";
  inherits: false;
  initial-value: 120deg;
}

.hero {
  background: linear-gradient(var(--angle), var(--from), var(--to));
  animation: shift 16s ease-in-out infinite alternate;
}

@keyframes shift {
  to {
    --from: #0891b2;
    --to: #fb923c;
    --angle: 200deg;
  }
}
Farben und Winkel animieren sich im Verlauf. Nicht registrierte Eigenschaften würden springen, statt überzublenden.
Die zwei Enden der obigen Animation. Der Browser mischt jedes Bild dazwischen.

Diese Technik zeichnet wie die erste in jedem Frame neu. Ihr Vorteil ist die Kontrolle: Du kannst ein Leuchten in einem Mesh-Verlauf bewegen, einen konischen Rahmen drehen oder einen Markenverlauf zu einer zweiten Palette hin verschieben, ganz ohne übergroße Hintergründe.

Technik 3: eine Verlaufsebene transformieren

Lege den Verlauf auf ein Pseudoelement, das viel größer als das Element ist, und animiere dessen transform, etwa eine langsame Drehung oder Drift. Browser können eine transformierte Ebene meist auf der Grafikkarte bewegen, ohne sie neu zu zeichnen, daher ist das der günstigste Weg, einen großen Verlauf zu animieren. will-change: transform weist darauf hin, dass die Ebene vorab hochgestuft werden soll.

css
.hero {
  position: relative;
  overflow: hidden;
  isolation: isolate;
}

.hero::before {
  content: "";
  position: absolute;
  inset: -50%;
  z-index: -1;
  background: conic-gradient(from 0deg, #1e1b4b, #7c3aed, #f472b6, #0891b2, #1e1b4b);
  animation: turn 40s linear infinite;
  will-change: transform;
}

@keyframes turn {
  to { transform: rotate(1turn); }
}
Ein riesiger konischer Farbverlauf, der sich langsam hinter dem Inhalt dreht. Der negative Inset hält die Ecken bedeckt, während er rotiert.

Technik 4: zwei Farbverläufe überblenden

Staple zwei Verlaufsebenen und animiere die opacity der oberen. Auch Opacity ist eine compositor-freundliche Eigenschaft, daher ist die Überblendung flüssig und günstig. Sie eignet sich für langsame Stimmungswechsel, etwa eine Tagespalette, die in eine Nachtpalette übergeht, und lässt die zwei Verläufe im Aufbau völlig verschieden sein.

css
.sky {
  position: relative;
  isolation: isolate;
  background: linear-gradient(180deg, #7dd3fc, #fde68a);
}

.sky::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background: linear-gradient(180deg, #0f172a, #7c3aed);
  animation: dusk 20s ease-in-out infinite alternate;
}

@keyframes dusk {
  from { opacity: 0; }
  to   { opacity: 1; }
}
Der Tag geht in die Nacht über und zurück. Nur die Opacity ändert sich, also wird nichts neu gezeichnet.

Die Technik wählen

TechnikBrowserarbeit pro FrameAm besten für
background-position bewegenNeuzeichnenKleine Elemente, Buttons, Text
@property-Farben und -WinkelNeuzeichnenPräzise Farbwechsel, rotierende Rahmen
transform auf einer EbeneMeist nur ZusammensetzenGroße, bildschirmfüllende Hintergründe
opacity-ÜberblendungMeist nur ZusammensetzenLangsame Stimmungs- oder Palettenwechsel
Neuzeichnen ist auf kleinen Flächen in Ordnung. Für große Flächen bevorzuge transform und opacity.

Miss lieber, statt zu raten. In den Chrome DevTools hebt das Paint Flashing im Rendering-Bereich Flächen hervor, die in jedem Frame neu gezeichnet werden, und eine Performance-Aufzeichnung zeigt, wie viel jedes Frames ins Zeichnen fließt. CSS-Farbverlauf und Performance geht es durch.

Reduzierte Bewegung und gute Manieren

Manchen Menschen wird von Hintergrundbewegung schwindlig, oder sie lenkt sie ab, und Betriebssysteme lassen sie weniger davon anfordern. Beachte das mit einer prefers-reduced-motion-Abfrage, die die Animation stoppt und ein stilles, fertiges Bild zurücklässt. Was an Bewegung entfernenswert ist, erklärt der Leitfaden zu reduzierter Bewegung.

css
@media (prefers-reduced-motion: reduce) {
  .hero,
  .hero::before,
  .sky::after {
    animation: none;
  }
}
Eine Regel, die jede obige Technik stoppt. Prüfe, ob das zurückbleibende Bild noch stimmig aussieht.

Vermeiden

  • Zyklen schneller als etwa 8 Sekunden auf großen Flächen
  • Regenbogen-Farbtonrotation über die ganze Seite
  • Bewegung hinter Fließtext, den Menschen lesen müssen
  • Animationen, die minutenlang weiterlaufen, wenn der Tab ruht

Besser

  • Langsame Ambientebewegung innerhalb einer Farbfamilie
  • Bewegung im Hero, Ruhe im Inhalt
  • Ein ruhiges Standbild für reduzierte Bewegung
  • Auf einem durchschnittlichen Laptop und Handy testen, nicht nur auf einem schnellen Desktop

Häufige Fragen

Kann man einen CSS-Farbverlauf animieren?

Nicht direkt: Browser springen in Keyframes zwischen zwei Verlaufswerten. Animiere stattdessen background-position, registrierte benutzerdefinierte Eigenschaften im Verlauf oder Transform und Opacity einer Verlaufsebene.

Was ist der flüssigste Weg, einen Verlaufshintergrund zu animieren?

transform oder opacity auf einer eigenen Verlaufsebene zu animieren, denn Browser kommen damit meist ohne Neuzeichnen aus.

Wie animiere ich Verlaufsfarben in CSS?

Registriere jede Farbe mit @property und syntax: "<color>", nutze die Eigenschaften im Verlauf und ändere sie in @keyframes.

Verlangsamen animierte Farbverläufe eine Seite?

Kleine selten. Große animierte Hintergründe, die in jedem Frame neu zeichnen, können Akku und Flüssigkeit kosten, bevorzuge also transform oder opacity und miss mit den DevTools.

Wie beachte ich reduzierte Bewegung bei Verlaufsanimationen?

Packe eine Regel animation: none in @media (prefers-reduced-motion: reduce), sodass Nutzende, die weniger Bewegung anfordern, ein Standbild sehen.

Diesen Artikel teilen

Geschrieben von GradientlyVerifiziertes Gradiently-Konto

Das Team hinter Gradiently, einem Designtool rund um Marks: lebendige Farbverläufe, durch die alles, was du gestaltest, nach dir aussieht.

Unser Profil ansehen