← Zurück zu Mediendesign & Digitale Medien
Loading Animationen sind UI-Muster, die während Datenladezeiten angezeigt werden, um Wartezeiten als kürzer wahrnehmen zu lassen und Nutzern zu signalisieren, dass das System aktiv arbeitet.

Was sind Loading Animationen?

Loading Animationen lösen ein grundlegendes UX-Problem: Nutzer verlassen Seiten, wenn nach 3 Sekunden noch keine Reaktion erfolgt (Google, 2018). Gleichzeitig sind Netzwerk-Anfragen, Datenbankabfragen und Berechnungen unvermeidbar.

Die Lösung liegt nicht primär in technischer Optimierung (obwohl die selbstverständlich Priorität hat), sondern auch in der wahrgenommenen Performance (Perceived Performance). Luke Wroblewski und Bill Chung (2013) zeigten in Experimenten, dass Fortschrittsanzeigen die Wartezeit gefühlt kürzer machen – selbst wenn die tatsächliche Zeit identisch ist.

Haupttypen:

  1. Spinner/Throbber – Rotierende Indikatoren für unbestimmte Ladezeiten
  2. Progress Bar – Balken für messbare Fortschritte
  3. Skeleton Screens – Platzhalter in Seitenform
  4. Optimistische UI – UI wird sofort aktualisiert, Fehlerbehandlung im Nachgang
  5. Lottie-Animationen – Markenspezifische illustrative Lader (→ Lottie – After Effects Animationen im Web)

Erklärung

CSS Spinner

```css / Klassischer Spinner / @keyframes drehen { to { transform: rotate(360deg); } }

.spinner { width: 40px; height: 40px; border: 3px solid rgba(0, 120, 255, 0.15); border-top-color: #0078ff; border-radius: 50%; animation: drehen 0.7s linear infinite; } ```

Stilvoller Dual-Ring-Spinner:

``css .spinner-dual { width: 48px; height: 48px; border-radius: 50%; border: 4px solid transparent; border-top-color: #0078ff; border-bottom-color: #0078ff; animation: drehen 1s linear infinite; } ``

Dot-Pulsier-Animation:

```css @keyframes dotPulsieren { 0%, 80%, 100% { transform: scale(0); opacity: 0; } 40% { transform: scale(1); opacity: 1; } }

.dots-container { display: flex; gap: 8px; }

.dot { width: 10px; height: 10px; border-radius: 50%; background: #0078ff; animation: dotPulsieren 1.4s ease-in-out infinite; }

.dot:nth-child(2) { animation-delay: 0.16s; } .dot:nth-child(3) { animation-delay: 0.32s; } ```

Progress Bar

```css .progress-bar-container { background: rgba(0, 120, 255, 0.1); border-radius: 4px; overflow: hidden; height: 4px; }

.progress-bar { height: 100%; background: linear-gradient(90deg, #0078ff, #0050cc); border-radius: 4px; transition: width 0.3s ease; width: 0%; }

/ Indeterminate Progress Bar / @keyframes indeterminiert { 0% { transform: translateX(-100%); width: 40%; } 100% { transform: translateX(350%); } }

.progress-bar.indeterminate { width: 30%; animation: indeterminiert 1.5s ease-in-out infinite; } ```

``javascript // Fortschritt programmatisch setzen function setzeForschritt(prozent) { document.querySelector('.progress-bar').style.width = ${prozent}%; } ``

Skeleton Screens

Skeleton Screens sind Layout-Platzhalter, die die Seitenstruktur vorwegnehmen. Facebook, LinkedIn und YouTube nutzen sie extensiv.

``html <div class="skeleton-karte"> <div class="skeleton skeleton-bild"></div> <div class="skeleton-inhalt"> <div class="skeleton skeleton-titel"></div> <div class="skeleton skeleton-text"></div> <div class="skeleton skeleton-text kurz"></div> </div> </div> ``

```css / Shimmer-Effekt für Skeleton / @keyframes shimmer { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } }

.skeleton { background: linear-gradient( 90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75% ); background-size: 200% 100%; animation: shimmer 1.5s infinite; border-radius: 4px; }

.skeleton-bild { height: 200px; border-radius: 8px 8px 0 0; } .skeleton-titel { height: 20px; width: 70%; margin: 16px 0 8px; } .skeleton-text { height: 14px; width: 100%; margin-bottom: 6px; } .skeleton-text.kurz { width: 60%; } ```

Übergang: Skeleton → Inhalt

```javascript async function ladeInhalt() { zeigeSkeleton();

try { const daten = await fetch('/api/karten').then(r => r.json());

// Kurze Pause für eine flüssigere Transition await new Promise(resolve => setTimeout(resolve, 200));

versteckeSkeleton(); renderInhalt(daten);

// Inhalt einblenden document.querySelectorAll('.karte').forEach((karte, i) => { karte.animate( [{ opacity: 0, transform: 'translateY(10px)' }, { opacity: 1, transform: 'translateY(0)' }], { duration: 300, delay: i * 50, fill: 'forwards', easing: 'ease-out' } ); });

} catch (fehler) { zeigeFehler(fehler); } } ```

NProgress – Seitenweite Fortschrittsleiste

NProgress (Rico Sta. Cruz, 2013) ist die populäre Library für seitenweite Ladebalken (bekannt von GitHub und YouTube):

```javascript import NProgress from 'nprogress'; import 'nprogress/nprogress.css';

// Bei Seitennavigation (z.B. in SPA-Router) router.beforeEach(() => NProgress.start()); router.afterEach(() => NProgress.done()); ```

In der Praxis

Spinner vs. Skeleton Screen – wann was?

SituationEmpfehlung
Unbekannte Ladezeit, komplexe DatenSkeleton Screen
Kurze, definierte Ladezeit (<2s)Progress Bar
Aktion im Hintergrund (Upload)Inline Progress
Initiales SeitenladenSkeleton Screen
Button-Aktion, API-CallSpinner im Button

Die „Optimistische UI"-Strategie: Statt zu warten, aktualisiert man die UI sofort und macht Fehlerbehandlung im Nachgang:

```javascript // Sofortiges visuelles Feedback likeButton.classList.add('aktiv'); likeCounter.textContent = parseInt(likeCounter.textContent) + 1;

// API-Call im Hintergrund fetch('/api/like', { method: 'POST', body: JSON.stringify({ id }) }) .catch(() => { // Rückgängig bei Fehler likeButton.classList.remove('aktiv'); likeCounter.textContent = parseInt(likeCounter.textContent) - 1; zeigeFehlermeldung('Like konnte nicht gespeichert werden'); }); ```

Vergleich & Abgrenzung

MusterWahrgenommene QualitätImplementierungEmpfehlung
SpinnerMittelEinfachFallback
Progress BarGutMittelFür messbare Vorgänge
Skeleton ScreenSehr gutAufwändigFür Content-Seiten
NichtsSchlechtNie

Häufige Fragen (FAQ)

Wie lange sollte eine Loading Animation dauern? Erst nach 300 ms anzeigen (Aktivierungsschwelle). Unter 300 ms gilt eine Reaktion als instantan. Animate.css und andere Frameworks nutzen 300 ms als Standardwert.

Können Skeleton Screens barrierearm sein? Mit aria-busy="true" am Container und aria-label="Inhalt wird geladen" für Screenreader. Nach dem Laden: aria-busy="false".

Ist ein animiertes Logo als Ladeindikator empfehlenswert? Nur wenn die Animation kurz und loop-fähig ist. Komplexe Intro-Animationen frustrieren Nutzer bei jedem Besuch. Besser: auf Splash-Screens beschränken (App-Start).

Verwandte Einträge

Weiterführend

  • Luke Wroblewski: Mobile First (2011) – A Book Apart (Perceived Performance)
  • Bill Chung: Psychology of Waiting (2013) – Google Research
  • Lincoln Ritter: How Skeleton Screens Work (2020) – uxdesign.cc
  • Smashing Magazine: Best Practices for Loading Indicators (2022)
  • NProgress: github.com/rstacruz/nprogress
← Zurück zu Mediendesign & Digitale Medien
Infotag · 13. Mai · 15:00 Uhr · Vor Ort

Sei am Mittwoch dabei.
Bring Eltern oder Freunde mit.

Ein halber Nachmittag, der dir drei Jahre Klarheit bringen kann. Kostenlos, unverbindlich, ehrlich.

  • Rundgang durch Studios, Schnitträume und Tonstudio
  • Echte Absolventenfilme sehen
  • 1:1-Beratung zu Bewerbung & BAföG
  • Studierende direkt fragen
  • Kaffee, kein Sales-Pitch
  • Auch online möglich

Platz beim Infotag reservieren

Dauert 30 Sekunden. Bestätigung per E-Mail.
100 % kostenlos · keine Verpflichtung · jederzeit absagbar