Farbanimationen in CSS: Übergänge und Keyframes
Embed This Widget
Add the script tag and a data attribute to embed this widget.
Embed via iframe for maximum compatibility.
<iframe src="https://colorfyi.com/iframe/entity//" width="420" height="400" frameborder="0" style="border:0;border-radius:10px;max-width:100%" loading="lazy"></iframe>
Paste this URL in WordPress, Medium, or any oEmbed-compatible platform.
https://colorfyi.com/entity//
Add a dynamic SVG badge to your README or docs.
[](https://colorfyi.com/entity//)
Use the native HTML custom element.
Farbanimation ist eines der ausdrucksstärksten Werkzeuge, das einem Webdesigner zur Verfügung steht. Eine Schaltfläche, die beim Hover den Farbton wechselt, ein Hintergrund, der bei Sonnenauf- und -untergang Farbverläufe durchläuft, ein Ladeindikator, dessen Farbe pulsiert – diese Effekte erzeugen Stimmung, kommunizieren Zustand und beleben ein Interface, ohne eine einzige Zeile JavaScript. Aber CSS-Farbanimationen haben Feinheiten, die selbst erfahrene Entwickler stolpern lassen: welche Eigenschaften animieren, wie der Browser zwischen Farben interpoliert, warum manche Übergänge in der Mitte schlammig wirken und wie moderne Farbräume für flüssige, wahrnehmungsnatürliche Ergebnisse genutzt werden.
Dieser Leitfaden behandelt CSS-Farbübergänge, Keyframe-Animationen, HSL-basierte Farbtonrotation, OKLCH-Interpolation für wahrnehmungsnahe Glattheit und Performance-Überlegungen, die Animationen auf jedem Gerät butterweich halten.
CSS-Farbübergänge
Die transition-Eigenschaft teilt dem Browser mit, dass er immer dann sanft von einem Wert zum anderen animieren soll, wenn sich eine CSS-Eigenschaft ändert. Farbeigenschaften – color, background-color, border-color, outline-color, fill, stroke und andere – sind alle animierbar.
Grundlegende Syntax
.button {
background-color: #3B82F6;
transition: background-color 200ms ease;
}
.button:hover {
background-color: #1D4ED8;
}
Wenn der Cursor in die Schaltfläche eintritt, animiert der Browser von #3B82F6 (Tailwind blue-500) zu #1D4ED8 (Tailwind blue-700) über 200 Millisekunden. Wenn der Cursor wieder verlässt, animiert er zurück.
Die transition-Kurzschreibweise akzeptiert: Eigenschaft Dauer Easing-Funktion Verzögerung. Mehrere Übergänge können durch Komma getrennt werden:
.card {
background-color: #F8FAFC;
border-color: #E2E8F0;
transition:
background-color 300ms ease,
border-color 300ms ease;
}
.card:hover {
background-color: #EFF6FF;
border-color: #BFDBFE;
}
Übergangs-Timing-Funktionen
Die Easing-Funktion steuert die Änderungsrate während der Animation:
| Schlüsselwort | Verhalten |
|---|---|
ease |
Langsamer Start, schnelle Mitte, langsames Ende (Standard) |
ease-in |
Langsamer Start, schnelles Ende |
ease-out |
Schneller Start, langsames Ende |
ease-in-out |
Langsamer Start und Ende, schnelle Mitte |
linear |
Konstante Rate während der gesamten Animation |
cubic-bezier(x1, y1, x2, y2) |
Benutzerdefinierte Kurve |
Für Farbübergänge wirkt ease-out oft am natürlichsten – die Farbe erreicht schnell ihr ungefähres Ziel und setzt sich dann, was der Funktionsweise der physischen Farbwahrnehmung entspricht.
color und mehrere Eigenschaften übergehen
all kann verwendet werden, um jede animierbare Eigenschaft zu übergehen, aber dies kann unbeabsichtigte Nebenwirkungen haben, wenn andere Eigenschaften gleichzeitig ändern. Explizit zu sein ist die bessere Praxis:
.link {
color: #6366F1;
text-decoration-color: transparent;
transition:
color 150ms ease-out,
text-decoration-color 150ms ease-out;
}
.link:hover {
color: #4338CA;
text-decoration-color: #4338CA;
}
Keyframe-Farbanimationen
Die @keyframes-Regel definiert eine benannte Animationssequenz, die kontinuierlich abspielen, eine festgelegte Anzahl von Malen wiederholen oder auf einen Auslöser reagieren kann. Anders als Übergänge funktionieren Keyframes ohne Zustandsänderung – sie können beim Laden der Seite automatisch starten oder unbegrenzt schleifen.
Grundlegende Keyframe-Syntax
@keyframes pulse-blue {
0% { background-color: #3B82F6; }
50% { background-color: #60A5FA; }
100% { background-color: #3B82F6; }
}
.status-indicator {
animation: pulse-blue 2s ease-in-out infinite;
}
Dies erstellt einen pulsierenden Statusindikator, der zwischen #3B82F6 (blue-500) und #60A5FA (blue-400) oszilliert und einen subtilen Atemeffekt erzeugt.
Mehrere Farbstopps in Keyframes
@keyframes sunrise {
0% { background-color: #0F172A; } /* Tiefe Nacht */
25% { background-color: #7C3AED; } /* Vormorgenliches Violett */
50% { background-color: #F97316; } /* Morgendämmerndes Orange */
75% { background-color: #FDE68A; } /* Morgendliches Gelb */
100% { background-color: #BFDBFE; } /* Klares Himmelsblau */
}
.hero-background {
animation: sunrise 8s ease-in-out forwards;
}
Die Farben verschieben sich von #0F172A → #7C3AED → #F97316 → #FDE68A → #BFDBFE und erzeugen einen filmischen Tageszeit-Effekt.
Animations-Eigenschaften
Die animation-Kurzschreibweise akzeptiert:
Name Dauer Timing-Funktion Verzögerung Iterationen Richtung Füll-Modus Abspiel-Status
.element {
/* Name | Dauer | Easing | Verzögerung | Iterationen | Richtung */
animation: pulse-blue 2s ease-in-out 0s infinite alternate;
}
Die alternate-Richtung lässt die Animation vorwärts dann rückwärts abspielen, was eine flüssige Schleife ohne harten Sprung am Ende erzeugt. Dies ist ideal für Farbpuls-Effekte.
HSL-basierte Animation für flüssige Farbtonrotation
HSL (Farbton, Sättigung, Helligkeit) macht Farbtonrotation trivial, weil der Farbton ein einzelner numerischer Wert in Grad um das Farbrad ist. Die Animation von Farbton 0 auf Farbton 360 durchläuft jede Farbe des Spektrums.
CSS-benutzerdefinierte Eigenschaften für HSL-Animation
Der eleganteste Ansatz kombiniert CSS-benutzerdefinierte Eigenschaften mit @keyframes:
:root {
--hue: 220;
}
.rainbow-button {
background-color: hsl(var(--hue) 70% 55%);
transition: background-color 100ms linear;
}
@keyframes hue-rotate {
from { --hue: 0; }
to { --hue: 360; }
}
.rainbow-button {
animation: hue-rotate 4s linear infinite;
}
Es gibt jedoch einen Haken: CSS kann standardmäßig nicht zwischen Werten benutzerdefinierter Eigenschaften interpolieren, weil der Browser den Eigenschaftstyp nicht kennt. Hier kommt @property ins Spiel.
Die @property-Regel für animierte benutzerdefinierte Eigenschaften
@property registriert eine benutzerdefinierte Eigenschaft mit einem spezifischen Typ, was dem Browser ermöglicht, sie flüssig zu interpolieren:
@property --hue {
syntax: "<number>";
initial-value: 0;
inherits: false;
}
@keyframes hue-rotate {
from { --hue: 0; }
to { --hue: 360; }
}
.rainbow-text {
color: hsl(var(--hue) 80% 45%);
animation: hue-rotate 6s linear infinite;
}
Mit @property, das --hue als <number> deklariert, interpoliert der Browser flüssig zwischen 0 und 360 und durchläuft das vollständige Farbrad.
Partielle Farbtonrotation für themenbezogene Effekte
Es ist keine vollständige 360-Grad-Rotation erforderlich, um interessante Effekte zu erzielen. Die Animation innerhalb eines engeren Farbtonbereichs erzeugt ein zurückhaltenderes, markengerechtes Gefühl:
@property --hue {
syntax: "<number>";
initial-value: 210;
inherits: false;
}
@keyframes ocean-shift {
0% { --hue: 195; } /* Cyan */
50% { --hue: 230; } /* Blau */
100% { --hue: 195; } /* Zurück zu Cyan */
}
.ocean-card {
background-color: hsl(var(--hue) 60% 45%);
animation: ocean-shift 5s ease-in-out infinite;
}
Dies verschiebt zwischen einem Cyan vergleichbar mit #00BFCE und einem mittleren Blau vergleichbar mit #4166CC und erzeugt einen fließenden Ozean-Gezeiten-Effekt, ohne die Blau-Cyan-Familie je zu verlassen.
Sättigungs- und Helligkeitsanimation
Jenseits des Farbtons können Sättigung und Helligkeit animiert werden, um pulsierende, verblassende oder energisierende Effekte zu erzeugen:
@property --lightness {
syntax: "<percentage>";
initial-value: 55%;
inherits: false;
}
@keyframes pulse-light {
0%, 100% { --lightness: 45%; }
50% { --lightness: 65%; }
}
.pulse {
background-color: hsl(220 70% var(--lightness));
animation: pulse-light 2s ease-in-out infinite;
}
Dies erzeugt einen sanften Helligkeitspuls in einem Blauton, ideal für Benachrichtigungs-Badges oder aufmerksamkeitserzeugende Elemente.
OKLCH-Interpolation für wahrnehmungsnahe Glattheit
HSL-basierte Animation ist komfortabel, hat aber ein bekanntes Problem: Die Mittelpunkte von Übergängen zwischen bestimmten Farbtönen sehen visuell unattraktiv aus – sie verlaufen durch trübe, ungesättigte Graubereiche oder durch Zwischentöne, die der Designer nicht beabsichtigt hat.
Das passiert, weil HSL und sRGB nicht wahrnehmungsgleichmäßig sind. Gleiche numerische Schritte erzeugen keine gleichen wahrgenommenen Schritte. Der Interpolationspfad zwischen zwei HSL-Farben verläuft durch Zwischenfarben, die wahrnehmungsmäßig nicht auf halbem Weg zwischen den Endpunkten liegen.
OKLCH (OK Helligkeit-Chroma-Farbton) löst dies. Es ist so konzipiert, dass gleiche numerische Schritte gleiche wahrgenommene Schritte erzeugen. Übergänge zwischen OKLCH-Farben erzeugen flüssige, lebendige Mittelpunkte ohne unerwartete Graubereiche oder Farbtonverschiebungen.
Mit OKLCH animieren
@property --oklch-hue {
syntax: "<number>";
initial-value: 270;
inherits: false;
}
@keyframes perceptual-hue-rotate {
from { --oklch-hue: 0; }
to { --oklch-hue: 360; }
}
.smooth-rainbow {
color: oklch(60% 0.18 var(--oklch-hue));
animation: perceptual-hue-rotate 8s linear infinite;
}
Verglichen mit derselben Animation mit hsl() hält die OKLCH-Version eine konsistente wahrgenommene Helligkeit während der gesamten Rotation aufrecht. Die Farbe taucht niemals in eine dunkle oder helle Zone ab, wenn sie durch Gelb, Cyan oder andere wahrnehmungsungleichmäßige Bereiche des HSL-Rads verläuft.
Direkte OKLCH-Übergänge
OKLCH-Interpolation ist besonders leistungsfähig für transition zwischen zwei spezifischen Farben:
.button {
/* Von: lebhaftem Lila [#7C3AED-Äquivalent] */
background-color: oklch(50% 0.22 285deg);
transition: background-color 400ms ease;
}
.button:hover {
/* Zu: leuchtendem Blau [#2563EB-Äquivalent] */
background-color: oklch(50% 0.22 255deg);
}
Da beide Farben dieselbe OKLCH-Helligkeit (50 %) und Chroma (0,22) haben, hält der Übergang zwischen ihnen konstante wahrgenommene Helligkeit und Sättigung während des gesamten Übergangs aufrecht – nur der Farbton ändert sich. In sRGB oder HSL würde ein äquivalenter Übergang wahrnehmbar in der Mitte heller oder dunkler werden.
ColorFYIs Farbkonverter verwenden, um die OKLCH-Äquivalente der eigenen Hex-Markenfarben zu finden, und dann diese Werte in Animationsdefinitionen verwenden, um die flüssigsten Ergebnisse zu erzielen.
CSS-Verläufe mit OKLCH-Interpolation
OKLCH verbessert auch die Verlaufsqualität. CSS Color 4 erlaubt es, den Interpolations-Farbraum für Verläufe zu spezifizieren:
/* Standard-sRGB-Interpolation – kann in der Mitte grauen Trübbereich zeigen */
background: linear-gradient(to right, #FF0000, #0000FF);
/* OKLCH-Interpolation – gleichmäßig und wahrnehmungsgleichmäßig */
background: linear-gradient(in oklch to right, oklch(60% 0.25 27deg), oklch(60% 0.25 265deg));
Das Schlüsselwort in oklch teilt dem Browser mit, den Verlauf im OKLCH-Raum zu interpolieren. Dies hält die wahrgenommene Helligkeit durch den Mittelpunkt konstant und erzeugt reichhaltigere Zwischenfarben.
Diese Technik mit ColorFYIs Verlaufsgenerator kombinieren, um den Basisverlauf visuell zu erstellen und dann in oklch für wahrnehmungsgleichmäßigkeit hinzuzufügen.
Farbton-Interpolationsrichtung in OKLCH
Eine nützliche OKLCH-spezifische Option ist die Steuerung, in welche Richtung um das Farbrad die Interpolation wandert:
/* Kürzerer Bogen (Standard) – kann durch unbeabsichtigte Farbtöne verlaufen */
background: linear-gradient(in oklch to right,
oklch(55% 0.2 60deg), /* Gelb-Orange */
oklch(55% 0.2 300deg) /* Magenta */
);
/* Längerer Bogen – durchläuft explizit die Blau-Grün-Region */
background: linear-gradient(in oklch longer hue to right,
oklch(55% 0.2 60deg),
oklch(55% 0.2 300deg)
);
shorter hue (Standard) nimmt immer den kürzeren Weg um das Farbrad; longer hue nimmt den längeren Weg. Dies gibt Kontrolle darüber, welche Zwischenfarbtöne im Verlauf oder in der Animation erscheinen.
Performance-Überlegungen
Farbanimation beinhaltet die Render-Pipeline des Browsers. Das Verstehen, wo Performance-Probleme entstehen, hilft dabei, Animationen zu gestalten, die selbst auf mittelmäßigen Mobilgeräten flüssig bleiben.
Die sicheren Eigenschaften für Animationen
CSS-Animationen lösen verschiedene Phasen der Render-Pipeline aus. Für die Performance ist das Ziel, in der Compositing-Phase zu bleiben – von der GPU übernommen – und Layout oder Paint zu vermeiden.
| Eigenschaft | Pipeline-Phase | Performance |
|---|---|---|
transform, opacity |
Compositor | Ausgezeichnet |
background-color, color, border-color |
Paint | Gut – gelegentliches Neuzeichnen |
width, height, margin, padding |
Layout + Paint | Teuer – Animieren vermeiden |
Farbanimationen (background-color, color) lösen bei jedem Frame ein Neuzeichnen aus – der Browser muss die Pixelfarben für das betroffene Element neu berechnen. Dies ist im Allgemeinen schnell und auf modernen Geräten GPU-beschleunigt, aber nicht so kostenfrei wie transform- und opacity-Animationen.
Neuzeichenfläche minimieren
Die Neuzeichenkosten sind proportional zur neu gezeichneten Fläche. Die Hintergrundfarbe eines Vollbild-Hero-Bereichs zu animieren zeichnet weit mehr Pixel neu als einen kleinen Statusindikator zu animieren. Für großflächige Farbanimationen in Betracht ziehen:
Ein Pseudo-Element-Overlay verwenden: Die opacity eines farbigen Pseudo-Elements über einem statischen Hintergrund animieren. opacity ist rein compositor-basiert und löst kein Neuzeichnen aus:
.hero {
position: relative;
background-color: #1E3A8A;
}
.hero::after {
content: "";
position: absolute;
inset: 0;
background-color: #7C3AED;
opacity: 0;
transition: opacity 600ms ease;
}
.hero:hover::after {
opacity: 1;
}
Dies erzielt einen „Farbwechsel"-Effekt durch das Einblenden eines farbigen Overlays und verwendet dabei ausschließlich Compositor-Level-Operationen.
Verlaufsanimations-Einschränkungen
Standard-CSS kann nicht zwischen zwei verschiedenen background-image-Verläufen interpolieren. Der Versuch, zwischen zwei linear-gradient()-Werten zu übergehen, führt dazu, dass der Browser zwischen ihnen springt statt flüssig zu animieren:
/* Dies animiert NICHT flüssig */
.element {
background: linear-gradient(45deg, #3B82F6, #8B5CF6);
transition: background 500ms ease; /* Springt, animiert nicht */
}
.element:hover {
background: linear-gradient(45deg, #EF4444, #F97316);
}
Die Lösungen:
Option 1: background-position auf einem übergroßen Verlauf animieren
.element {
background: linear-gradient(45deg, #3B82F6, #8B5CF6, #EF4444, #F97316);
background-size: 300% 300%;
background-position: 0% 50%;
transition: background-position 800ms ease;
}
.element:hover {
background-position: 100% 50%;
}
Option 2: Verlauf-Farbstopps via @property animieren
@property --color-start {
syntax: "<color>";
initial-value: #3B82F6;
inherits: false;
}
@property --color-end {
syntax: "<color>";
initial-value: #8B5CF6;
inherits: false;
}
.element {
background: linear-gradient(45deg, var(--color-start), var(--color-end));
transition: --color-start 500ms ease, --color-end 500ms ease;
}
.element:hover {
--color-start: #EF4444;
--color-end: #F97316;
}
Mit @property, das die benutzerdefinierten Eigenschaften als <color>-Typ deklariert, kann der Browser zwischen Farbwerten interpolieren und der Verlauf animiert flüssig.
Will-Change und GPU-Hinweise
Für Elemente mit kontinuierlicher Farbanimation (immer aktive pulsierende Indikatoren, animierte Hintergründe) dem Browser mitteilen, GPU-Ressourcen zuzuweisen:
.always-animating {
will-change: background-color;
}
will-change sparsam einsetzen – es auf viele Elemente gleichzeitig anzuwenden verbraucht erheblichen GPU-Speicher. Es für Elemente reservieren, die wirklich kontinuierlich animieren.
prefers-reduced-motion respektieren
Immer einen nicht-animierten Fallback für Nutzer bereitstellen, die in ihren Betriebssystem-Barrierefreiheitseinstellungen reduzierte Bewegung angefordert haben. Kontinuierliche Animationen können bei manchen Nutzern Übelkeit und vestibuläre Beschwerden verursachen:
@keyframes hue-rotate {
from { --hue: 0; }
to { --hue: 360; }
}
.animated-element {
animation: hue-rotate 4s linear infinite;
}
@media (prefers-reduced-motion: reduce) {
.animated-element {
animation: none;
/* Optional eine spezifische statische Farbe setzen */
background-color: hsl(220 70% 55%);
}
}
Dies ist nicht nur gute Praxis – es ist für WCAG-2.3-AA-Konformität erforderlich (Erfolgskriterium 2.3.3 Animation durch Interaktionen).
Wichtigste Erkenntnisse
- CSS-Farbübergänge verwenden die
transition-Eigenschaft, um zwischen Farbzuständen bei Hover, Fokus oder Klassenänderungen zu animieren; alle Farbeigenschaften –background-color,color,border-colorund mehr – sind animierbar. @keyframesermöglicht mehrstufige Farbanimationen, die kontinuierlich schleifen, beim Laden starten oder auf Auslöser reagieren, mit voller Kontrolle über Easing und Timing bei jedem Schritt.- HSL-basierte Farbtonrotation ist praktisch für Spektrumanimationen – die Animation des Farbtongrads von 0 auf 360 durchläuft das vollständige Farbrad.
@propertyverwenden, um benutzerdefinierte Eigenschaften als typisierte Werte zu deklarieren, damit der Browser sie flüssig interpoliert. - OKLCH erzeugt wahrnehmungsmäßig glattere Farbübergänge als HSL oder sRGB, weil gleiche OKLCH-Schritte gleiche wahrgenommene Schritte erzeugen – keine trüben grauen Mittelpunkte oder unbeabsichtigte Farbtonverschiebungen. Den Farbkonverter verwenden, um OKLCH-Werte für Markenfarben zu finden.
in oklchin Verlaufs-Deklarationen verwenden (linear-gradient(in oklch ...)), um wahrnehmungsgleichmäßige Verlaufsinterpolation mit konstanter Helligkeit zu erhalten.- CSS kann nicht zwischen zwei verschiedenen
linear-gradient()-Werten nativ interpolieren;@propertymit<color>-Typ-benutzerdefinierten-Eigenschaften verwenden oderbackground-positionauf einem übergroßen Verlauf als Workaround animieren. - Farbanimation löst ein Neuzeichnen aus, keine Layout-Änderung – sie ist im Allgemeinen schnell, aber die Neuzeichenfläche für großflächige Animationen minimieren, indem Opacity-basierte Overlay-Techniken oder reine Compositor-Alternativen verwendet werden.
@media (prefers-reduced-motion: reduce)-Overrides immer einschließen, um kontinuierliche Animationen für Nutzer mit vestibulären oder Bewegungsempfindlichkeitsstörungen zu deaktivieren.- ColorFYIs Verlaufsgenerator verwenden, um animierte Verlaufsfarbstopps visuell zu erstellen und dann mit
in oklch-Interpolation für die flüssigsten Ergebnisse zu verfeinern.