Theme Umschalten

Ein einfaches Lernbeispiel, wie du in WordPress zwischen Hell- und Dunkel-Theme umschaltest.
Unten findest du Beispiel-Code für Button, Styles und Skript – zum Anschauen und Kopieren.

Dark Mode Button HTML & CSS

Dies ist der HTML- und CSS-Code für den Umschalt-Button und das Basis-Design.


<button id="dark-mode-toggle" aria-pressed="false" aria-label="Dark Mode umschalten">Umschalten</button>
<style>
  body {
    background-color: white;
    color: black;
    transition: background-color 0.4s, color 0.4s;
  }
  body.dark-mode {
    background-color: #121212;
    color: #eee;
  }
</style>

JavaScript fürs Umschalten (Footer)

So erreichst du das Umschalten zwischen den Themes per Button-Klick mit einfachem Script.


<script>
  const btn = document.getElementById('dark-mode-toggle');
  const body = document.body;
  btn.addEventListener('click', () => {
    const enabled = body.classList.toggle('dark-mode');
    btn.setAttribute('aria-pressed', enabled);
  });
</script>

Theme umschalten – sichere Variante

Hier zeigen wir eine verbesserte und sichere Variante, die den Dark Mode bereits beim Laden der Seite aktiviert, falls der Benutzer ihn zuvor gewählt hat. So wird vermieden, dass die Seite kurz im hellen Design auftaucht (FOUC – Flash of Unstyled Content).


<head>
  <script>
    try {
      if(localStorage.getItem('darkMode') === 'true') {
        document.documentElement.classList.add('dark-mode');
      }
    } catch(e) {}
  </script>

  <style>
    :root {
      --background: #fff;
      --text-color: #000;
    }
    html.dark-mode {
      --background: #121212;
      --text-color: #eee;
    }
    body {
      background-color: var(--background);
      color: var(--text-color);
      transition: background-color 0.3s, color 0.3s;
    }
  </style>
</head>

<body>
  <button id="dark-mode-toggle" aria-pressed="false" aria-label="Theme umschalten">Umschalten</button>

  <script>
    const html = document.documentElement;
    const btn = document.getElementById('dark-mode-toggle');

    function applyDarkMode(enabled) {
      if(enabled) {
        html.classList.add('dark-mode');
      } else {
        html.classList.remove('dark-mode');
      }
      btn.setAttribute('aria-pressed', enabled);
    }

    // Status beim Laden anwenden
    const darkModeEnabled = localStorage.getItem('darkMode') === 'true';
    applyDarkMode(darkModeEnabled);

    // Umschalten bei Button-Klick
    btn.addEventListener('click', e => {
      e.preventDefault();
      const enabled = html.classList.toggle('dark-mode');
      applyDarkMode(enabled);
      localStorage.setItem('darkMode', enabled);
    });
  </script>
</body>

Was macht die sichere Variante anders?

  • Frühes Setzen der Klasse im <head>: Das kleine Script prüft localStorage und setzt die dark-mode Klasse auf <html>, bevor CSS geladen wird – so vermeidest du das kurze Aufblitzen des hellen Designs.
  • CSS Variablen: Anstatt fixe Farben in body.dark-mode zu setzen, werden CSS-Variablen --background und --text-color mit html.dark-mode überschrieben. Das macht die Farbverwaltung flexibler und moderner.
  • Speicherung des Modus: Wie im einfachen Beispiel wird der Dark Mode Zustand mit localStorage gespeichert und beim Laden wiederhergestellt.

Fazit: Die sichere Variante ist empfehlenswert für eine bessere User Experience, besonders wenn deine Website viele CSS lädt oder große Inhalte hat.

Demo

Home | Unternehmen | Service | Referenzen | Kontakt

Beispielinhalt

Der Hintergrund und die Textfarbe dieses Bereichs ändern sich nur bei diesem Div.

Ob Webseite, Webshop oder Portal, ich setze Ihr Vorhaben zu Ihrer Zufriedenheit um.
Von der Konzeption über die Gestaltung und der technischen Umsetzung bis zum Internetmarketing Ihrer Webseite biete ich Ihnen professionelles und modernes Webdesign aus einer Hand.

Web programmierung

FAQ: Theme umschalten

Was bedeutet „Theme umschalten“ (Dark Mode / Light Mode)?

„Theme umschalten“ bezeichnet das Umschalten zwischen unterschiedlichen visuellen Darstellungen einer Website — typischerweise Hell‑ und Dunkelmodus. Nutzer können per Button oder Systemeinstellung (z. B. Betriebssystem‑Theme) eine Variante wählen. Ein korrekt implementiertes Umschalten verbessert Lesbarkeit, Nutzerkomfort und kann Energie sparen (bei OLED‑Displays).

Was ist der einfachste Weg, um ein Theme‑Umschalt‑Button zu implementieren?

Die einfachste Lösung besteht aus drei Teilen: HTML‑Button, CSS‑Klassenschalter (z. B. body.dark-mode oder html.dark-mode) und ein kleines JavaScript, das beim Klick die Klasse toggelt. Diese Minimalvariante ist schnell einzubauen und eignet sich gut zum Prototyping. Für Produktion empfiehlt sich jedoch die „sichere Variante“ (siehe unten), die FOUC vermeidet und den Zustand speichert.

Was ist FOUC (Flash of Unstyled Content) und wie verhindert die sichere Variante das Aufblitzen?

FOUC bezeichnet das kurzzeitige Anzeigen des Default‑Designs (z. B. hell) bevor die gewünschte Theme‑Klasse/CSS angewendet wird. Die sichere Variante führt ein kleines Script bereits im aus, prüft localStorage und fügt ggf. sofort die Klasse (z. B. html.classList.add(‚dark-mode‘)) hinzu. So ist die richtige Farbvariable bereits beim Laden aktiv und das Aufblitzen wird vermieden.

Warum sind CSS‑Variablen für Theme‑Umschaltung empfehlenswert?

CSS‑Variablen (Custom Properties) erlauben zentrale Farb‑ und Stilsteuerung. Durch Überschreiben von Variablen in html.dark-mode lassen sich Farben, Abstände oder Schatten an einer Stelle anpassen, ohne alle Selektoren doppelt pflegen zu müssen. Das macht Wartung und Erweiterung deutlich einfacher — z. B. für Komponenten, Buttons und Icons.

Sollte ich localStorage oder Cookies zur Speicherung der Theme‑Wahl verwenden?

localStorage ist die gängige und einfache Methode, um die Auswahl im Browser zu persistieren (nur clientseitig). Cookies würden zusätzliche Serverkommunikation erfordern und sind für rein clientseitige UI‑Präferenzen meist überdimensioniert. Wichtig: Beim Einsatz von localStorage immer Zugriff in try/catch einbetten, um Fehler in eingeschränkten Umgebungen (z. B. strict mode, private Browsing) abzufangen.

Kann ich das Umschalten auch an die Systemeinstellung (prefers-color-scheme) koppeln?

Ja. Mit @media (prefers-color-scheme: dark) lässt sich ein Default‑Verhalten definieren, das die Nutzer‑Systemeinstellung berücksichtigt. Kombiniere das mit localStorage‑Persistenz: zuerst prüfst du localStorage (Nutzerwahl), danach falls ungelegt die Systempräferenz. So respektierst du sowohl explizite Nutzerentscheidungen als auch systemweite Einstellungen.

Wie integriere ich das Umschalten sauber in WordPress (Themes / Page Builder)?

Für WordPress reicht die sichere Variante: Script im head (z. B. via wp_head() oder als Inline‑Script im Theme), Styles im globalen CSS und das Umschalt‑Script im Footer (enqueue). Bei Page‑Buildern (Elementor etc.) kannst du den Button als Widget einfügen oder per Template‑Part liefern. Achte auf Enqueue‑Konventionen (wp_enqueue_script/style) und darauf, dass Inline‑Skripte ggf. in CSP‑Settings berücksichtigt werden.

Wie teste ich das Umschalten auf Kompatibilität und Fehler?

Testen auf verschiedenen Browsern (Chrome, Firefox, Safari), Geräten (Mobile/Desktop), und im privaten Modus. Prüfe außerdem: 1) FOUC (kurzes Aufblitzen), 2) localStorage funktioniert, 3) Kontrastverhältnisse (WCAG) beider Themes, 4) keine JS‑Fehler in der Console. Nutze Lighthouse für Accessibility/Performance‑Checks.

Welche Accessibility‑Aspekte sind beim Dark Mode wichtig?

Wichtige Punkte: ausreichender Farbkontrast (Text vs. Hintergrund), klare Fokuszustände für Tastaturnavigation, aria‑labels für den Umschaltbutton (z. B. aria‑pressed, aria‑label), Vermeidung von rein farbabhängigen Hinweisen, und Screenreader‑Tests. Stelle sicher, dass der Button per Tab erreichbar ist und Zustandsänderungen auch für Assistive Technologien nachvollziehbar sind.

Kann das Umschalten Layout‑ oder Design‑Bugs verursachen?

Ja — insbesondere bei Komponenten mit festen Farben, Shadow‑Effekten oder Bildern/Icons, die nur für ein Theme erstellt wurden. Deshalb: 1) Farben über Variablen steuern, 2) Bilder ggf. invertieren oder alternative Assets bereitstellen, 3) Testen von Komponenten in beiden Modi. Falls nötig, lege zusätzliche Klassen für komponentenspezifische Anpassungen an (z. B. .card.dark-mode).

Wie gehe ich mit Bildern, Icons oder Logos im Dark Mode um?

Prüfe Kontrast und Lesbarkeit. Für Logos empfiehlt sich ein reduziertes (weißes) Variant oder SVG‑Icons mit CSS‑Fill‑Variablen. Bilder mit transparenten Hintergründen können im Dark Mode unschön wirken — ggf. alternative Bildvarianten anbieten oder CSS‑Filter (brightness/contrast) einsetzen, aber Filter können die Bildqualität verändern.

Sollte der Dark Mode Animationen oder Übergänge haben?

Sanfte Übergänge (background-color / color transition) verbessern UX; schnelle, subtile Animationen sind gut. Achte auf Präferenzen für reduzierte Bewegung (@media (prefers-reduced-motion: reduce)) — nutze diese Media‑Query, um Animationen bei Nutzern zu deaktivieren, die Bewegung reduzieren möchten.

Wie verhindere ich, dass Server‑Side‑Rendering (SSR) Probleme beim Theme‑Umschalten verursacht?

Bei SSR‑Setups (Next.js, Gatsby) ist localStorage clientseitig nicht verfügbar während der initialen Renderphase. Lösung: beim Server‑Render eine neutrale Default‑Theme‑Variante ausliefern und clientseitig das Theme synchronisieren; oder SSR‑Logik nutzen, um Theme‑Präferenz aus Cookies zu lesen (falls du Cookies nutzen willst). Ziel ist, FOUC zu vermeiden und konsistente Darstellung sicherzustellen.

Kann ich das Theme‑Umschalten per CSS‑Only umsetzen?

Teilweise ja (z. B. mittels checkbox hack und :checked + selector), aber CSS‑Only Lösungen haben Einschränkungen (keine einfache Persistenz über Seitenladezyklen, weniger robust gegenüber Accessibility und Systempräferenzen). Für persistente, zugängliche und FOUC‑freie Lösungen ist eine kleine JavaScript‑Implementierung empfehlenswert.

Wo platziere ich den Umschalt‑Button idealerweise auf der Seite?

Häufig oben rechts in der Navigation oder als leicht zugänglicher Button im Header/Toolbar. Wichtig ist gute Sichtbarkeit und konsistente Platzierung. Auf mobilen Ansichten achte auf ausreichend große Touch‑Targets und dass der Button nicht mit anderen UI‑Elementen kollidiert.

Kann ich den Dark Mode per CSS‑Class global auf statt body setzen?

Ja — viele empfehlen html.dark-mode statt body.dark-mode, weil Variablen der :root (html) früher greifen und einige CSS‑Reset/Frameworks speziell auf html‑Level arbeiten. In der sicheren Variante wird daher oft html.classList.add(‚dark-mode‘) verwendet, um FOUC zu minimieren.

Welche Best Practices empfiehlst du für Entwickler, die Theme‑Umschaltung einbauen wollen?

Nutze CSS‑Variablen, setze die Theme‑Klasse früh im head (sichere Variante), speichere Nutzerwahl in localStorage, unterstütze prefers‑color‑scheme und prefers‑reduced‑motion, teste intensiv (Kontrast, Screenreader, mobile), und dokumentiere Theme‑Variablen im Design‑System. Halte die JS‑Logik klein und robust (try/catch für Storage), und halte Komponenten theme‑unabhängig, indem du Farben aus Variablen ziehst.

Kontakt

Webdesignstudio WedDesign

Eduard Wischnewski

Am Justusberg 7
41849 Wassenberg

    Ja, ich möchte den Newsletter erhalten