===== LU03b - 🚀 Bonusauftrag: CSS-nativer Dark Mode =====
**Für wen ist das?** Sie haben alle Schritte abgeschlossen und möchten tiefer einsteigen. Dieser Bonusauftrag zeigt Ihnen, wie modernes CSS den Dark Mode eleganter löst – ganz ohne JavaScript.
In den Schritten 1–9 haben Sie den Dark Mode mit JavaScript und einer CSS-Klasse umgesetzt. Das funktioniert gut, hat aber einen Nachteil: Die Seite kennt die Systemeinstellung des Users nicht automatisch. Wer sein Betriebssystem auf Dark Mode gestellt hat, sieht trotzdem zuerst Light Mode – bis er den Switch betätigt.
Moderneres CSS bietet zwei Werkzeuge, die das eleganter lösen:
- Die Media Query ''%%@media (prefers-color-scheme: dark)%%'' liest die Systemeinstellung des Users aus.
- Die CSS-Funktion ''%%light-dark()%%'' erlaubt es, beide Farbwerte direkt in einer Deklaration zu definieren.
Quelle und Vertiefung: [[https://www.bram.us/2023/10/09/the-future-of-css-easy-light-dark-mode-color-switching-with-light-dark/|The Future of CSS: Easy Light-Dark Mode Color Switching with light-dark() – bram.us]]
==== Schritt A: Systemfarbe mit prefers-color-scheme auslesen ====
Ohne JavaScript lässt sich der Dark Mode über eine Media Query aktivieren. Der Browser fragt dabei das Betriebssystem ab.
:root {
--text-color: #333;
--bg-color: #ffffff;
}
@media (prefers-color-scheme: dark) {
:root {
--text-color: #cccccc;
--bg-color: #1a1a1a;
}
}
body {
color: var(--text-color);
background-color: var(--bg-color);
}
Was passiert hier: Im Light Mode gelten die Standardwerte aus '':root''. Sobald das Betriebssystem des Users auf Dark Mode steht, überschreibt die Media Query die CSS-Variablen – der Rest der Seite bekommt davon nichts mit und verwendet weiterhin ''var(--text-color)''.
**Testen:** Wechseln Sie in den Systemeinstellungen Ihres Computers zwischen Light und Dark Mode. Die Seite sollte automatisch reagieren – ohne Klick, ohne JavaScript.
==== Schritt B: light-dark() Funktion einsetzen ====
Seit 2024 unterstĂĽtzen alle modernen Browser die Funktion ''%%light-dark()%%''. Sie nimmt zwei Farbwerte entgegen und gibt je nach aktivem Farbschema den ersten (Light) oder den zweiten (Dark) zurĂĽck.
**Wichtig:** Damit ''%%light-dark()%%'' funktioniert, muss zwingend ''%%color-scheme: light dark%%'' auf '':root'' gesetzt sein. Ohne diese Deklaration weiss der Browser nicht, welches Schema aktiv ist.
:root {
/* Pflicht: Ohne diese Zeile funktioniert light-dark() nicht! */
color-scheme: light dark;
--text-color: light-dark(#333333, #cccccc);
--bg-color: light-dark(#ffffff, #1a1a1a);
--nav-color: light-dark(#000000, #ffffff);
}
body {
color: var(--text-color);
background-color: var(--bg-color);
}
Der Vorteil gegenüber dem Media-Query-Ansatz: Beide Werte stehen direkt nebeneinander. Das macht den Code lesbarer und vermeidet doppelte Variablenblöcke.
==== Schritt C: Beide Ansätze kombinieren ====
In der Praxis kombiniert man beide Techniken: ''%%light-dark()%%'' für die Farbdefinitionen und ''%%prefers-color-scheme%%'' als Fallback für ältere Browser. Das vollständige Beispiel unten zeigt, wie Sie Ihre bisherige Lösung mit CSS-Variablen und ''%%light-dark()%%'' umschreiben könnten:
/* 1. color-scheme deklarieren – Pflicht für light-dark() */
:root {
color-scheme: light dark;
}
/* 2. Farben mit light-dark() definieren */
:root {
--text-color: light-dark(#1a1a1a, #f0f0f0);
--bg-color: light-dark(#ffffff, #1a1a1a);
--nav-link: light-dark(#333333, #dddddd);
}
/* 3. Fallback fĂĽr Browser ohne light-dark()-Support */
@media (prefers-color-scheme: dark) {
:root {
--text-color: #f0f0f0;
--bg-color: #1a1a1a;
--nav-link: #dddddd;
}
}
/* 4. Styles verwenden – identisch wie bisher */
body {
color: var(--text-color);
background-color: var(--bg-color);
}
.menu li a:not(.active) {
color: var(--nav-link);
}
Mit diesem Ansatz brauchen Sie für den systemgesteuerten Dark Mode **kein JavaScript** mehr. Der Switch aus den Schritten 1–9 kann weiterhin existieren und zusätzlich einen manuellen Override ermöglichen – das ist eine bewusste Designentscheidung.
**Checkliste Bonusauftrag**
* ''%%color-scheme: light dark%%'' ist auf '':root'' gesetzt.
* ''%%light-dark()%%'' wird fĂĽr mindestens Hintergrund- und Textfarbe verwendet.
* Die Seite reagiert automatisch auf die Systemeinstellung (kein Klick nötig).
* Der bestehende JavaScript-Switch funktioniert weiterhin.