Dark Mode
Unter dem Dark Mode (englisch für dunklen Bildschirmmodus) versteht man eine Farbeinstellung mit dunklem Hintergrund und hellem Text, die weniger anstrengend für die Augen sein soll. Gerade nachts ist ein weniger greller Hintergrund lesefreundlicher.
Bei OLED-Displays, die hauptsächlich in höherwertigen Smart Phones verbaut werden, spart dies überdies Strom und steigert damit die Akku-Laufzeit.
Umfragen zufolge nutzen inzwischen die meisten Benutzer internetfähiger Geräte diese im Dark Mode.
Das folgende Tutorial soll einen Weg aufzeichnen, wie Nutzer bereits im Betriebssystem ihre Präferenzen angeben können und dies dann das Erscheinungsbild des Systems, aller Apps und auch der aufgerufenen Webseiten automatisch anpasst. Allerdings ist das Thema "Dark Mode" bei weitem nicht so einfach, wie es in Clickbait-Artikeln oft suggeriert wird.
Inhaltsverzeichnis
Dark Mode in Webseiten einrichten?
Eine Möglichkeit ist es, den Dark mode als zweites, austauschbares Theme anzulegen. Der Aufwand dafür ist aber eigentlich zu hoch. CSS bietet mittlerweile Möglichkeiten, in einem Stylesheet zwei Farbpaletten vorzusehen. Die Voraussetzung ist natürlich, dass du deine Farbangaben konsequent darauf ausrichten.
Eine reine Farbumkehr schwarz-weiß auf weiß-schwarz ist dabei nicht hinreichend. Das Farbschema einer Webseite hat zumeist mehr als 2 Farben. Empfehlenswert ist es, mit Hilfe von custom properties eine Farbpalette festzulegen.
Die vermeintliche Lösung: ein toggle
Setze auf deine Webseite ein Widget mit einem Button, mit dem die Nutzer zwischen hellem und dunklem Modus wählen können. Beispielsweise könnte dieses Widget mit classList.toggle bestimmte Klassen umschalten, die dann im Stylesheet die Farbgebung für das body-Element und seine Kinder beeinflussen. In einem weiteren Schritt kannst du die gewählten Einstellungen mit localStorage oder mit einem Cookie speichern.
Einstellung im OS
Alle Browser und Betriebssysteme ermöglichen es, in ihren Benutzereinstellungen Dark Mode auszuwählen:
Apple macOS 26
Wähle das Apple-Menü
> "Systemeinstellungen", klicke auf "Erscheinungsbild", und wähle eine der Optionen:
- Automatisch: Verwende automatisch das helle Erscheinungsbild während des Tages und das dunkle Erscheinungsbild nachts.[1]
- Hell: Verwende das helle Erscheinungsbild.
- Dunkel: Verwende das dunkle Erscheinungsbild.
Microsoft Windows 11
Klickt mit der rechten Maustaste auf einen freien Bereich des Desktop und wählt den Eintrag Anpassen aus. Klickt links auf den Menüpunkt Personalisierung, dann rechts auf Farben. Dort bei "Modus auswählen" auf die Option Dunkel oder Benutzerdefiniert für detailliertere Einstellung.
Im Firefox kann man Dark Mode in den Browsereinstellungen wählen, was dann bei Bedarf die OS-Einstellung überschreibt.
Im Netz finden sich Anleitungen, wie man für Webseiten, die die Betriebssystem-Einstellungen nicht automatisch übernehmen, individuell einstellen kann.
So gibt es im Chrome Web Store eine Dark Mode Extension, die das CSS der Webseiten automatisch in den Dark Mode versetzt. Seiten, die nicht verändert werden sollen, können in einer whitelist notiert werden.
Umsetzung im CSS
Diese preferred color schemes (deutsch: Farbschemata) werden im Normalfall von den Browsern für ihre Navigationsleisten und Einstellungsseiten, sowie für die Systemfarben verwendet. Des Weiteren können sie auch im CSS aufgegriffen werden.
Abfrage der Systemeinstellungen mit CSS
CSS kennt eine prefers-color-scheme-Medienabfrage, mit der man die im OS getroffene Auswahl abfragen und dein CSS entsprechend anpassen kann.
- no-preference (keine Präferenz)
- dark (dunkles Farbschema)
- light (helles Farbschema)
@media (prefers-color-scheme: dark) {
/* dunkles Farbschema für die Nacht */
body {
color: white;
background: black;
}
a {
color: skyblue;
}
}
@media (prefers-color-scheme: light) {
/* helles Farbschema für den Tag */
}
Nutzerwahl
Moderne Websites orientieren sich zunächst an den Systemeinstellungen (prefers-color-scheme). Zusätzlich bieten viele Seiten einen Toggle-Schalter, mit dem Nutzerinnen und Nutzer das Farbschema selbst wählen können.
Das fertige Beispiel „Ihr Anwalt“ enthält einen solchen Schalter.[3]
Siehe auch:
- Formulare/Auswahllisten
Toggle-Schalter - Web Components/custom elements
toggle-switch mit Custom Elements
Quick-Fix: Farbumkehr
Ein Tauschen der Farbangaben für Text und Hintergrund ist eine Fleißarbeit, einfacher geht es mit einem rudimentären Filter, der unsere Farben invertiert.
Für ein sehr einfaches Projekt mit simpler Struktur kann diese schnelle Lösung bereits genügen.
/* sehr einfache Variante: alles umdrehen, darin Bilder wieder zurück drehen */
@media screen and (prefers-color-scheme: dark) {
html { filter: invert() hue-rotate(180deg); }
img,
video { filter: invert() hue-rotate(180deg); }
}
Der invert-Filter ändert nicht nur dunkel zu hell und umgekehrt, sondern verschiebt die Farben in Richtung ihrer Komplementärfarben. Das kann grob rückgängig gemacht werden mit dem Filter hue-rotate(180deg).
Leider ist das Ergebnis nicht farbtreu, hier auffällig bei der gelben Blüte, Details dazu im SELF-Forum.
Da die Bilder so nicht farbgetreu sind, ist das eher ein Hack als eine Lösung!
color-scheme
Bisher haben wir uns nur um die Farben unserer eigenen Inhalte gekümmert. Der Browser selbst – also z. B. Formularfelder, Scrollbars oder Eingabefelder – bleibt dabei oft im hellen Standardstil. Das kann zu unschönen Mischungen führen.
Mit der CSS-Eigenschaft color-scheme teilen wir dem Browser mit, welche Farbschemata unsere Seite unterstützt:
:root {
color-scheme: light dark;
}
Damit erlauben wir sowohl ein helles als auch ein dunkles Erscheinungsbild. Der Browser kann nun automatisch passende Varianten für eingebaute Elemente verwenden – etwa dunkle Formularfelder im Dark Mode.
Man kann den Browser auf ein Farbschema ohne Umschaltung festlegen:
:root {
color-scheme: light;
}
Wenn du color-scheme nicht setzt, ist der Defaultwert normal. Das bedeutet, dass das Dokument nicht darauf vorbereitet ist, zwischen Light- und Darkmode umzuschalten und der Browser sein Standardfarbschema verwenden soll (das dem Lightmode entsprechen sollte).
color-scheme im meta-Tag
Damit der Browser schon vor dem Laden des CSS weiß, dass unsere Seite den Dark Mode unterstützt, können wir zusätzlich ein entsprechendes <meta>-Tag im <head> setzen.
<meta name="color-scheme" content="light dark">
In den meisten Fällen genügt es nicht, lediglich ein Farbschema festzulegen, damit ein Dokument korrekt im Darkmode dargestellt wird. Die color-scheme Einstellung wirkt nur auf einige Oberflächenelemente automatisch:
- Die Oberfläche des <canvas>-Elements
- Die Standardfarben von Scrollbars und anderem Interaktions-UI
- Die Standardfarben von Form-Elementen (input, button, select, textarea)
- Die Standardfarben anderer Oberflächenelemente, die der Browser erzeugt, wie z.B. die Unterstreichungen der Rechtschreibprüfung
Farbwechsel mit light-dark()
Damit eigene HTML-Elemente auf die color-scheme-Einstellung reagieren, muss man für alle Farbangaben, die vom Farbschema abhängig sein sollen, die light-dark()-Funktion verwenden. Mit dieser Funktion gibst du zwei Farben an, die erste gilt für das light-Schema, die zweite gilt für das dark-Schema.
:root {
color-scheme: light dark;
}
.scroll-demo {
height: 33em;
overflow: auto;
}
body {
background: light-dark(white, #111);
}
.blau { color: steelblue; }
.gruen { color: light-dark(darkgreen, #59E44F); }
.rot { color: light-dark(darkred, #FF93A9); }
Im Beispiel werden für Hintergrundfarben und einige Text-Farben die Farbangaben mit der light-dark()-Funktion festgelegt.
Wenn wie bei der h1.blau der Kontrast für beide Hintergründe ausreichend ist, reicht eine normale Farbangabe.
color-scheme:light; festlegst, der Browser aber auf Darkmode eingestellt ist, dann werden die genannten automatischen Farbgebungen und die mit light-dark() gesetzten Farben den Lightmode verwenden. Die @media-Abfrage prefers-color-scheme:dark wird aber weiterhin zutreffen, weil sie den Browser-Modus abfragt und nicht die color-scheme Vorgabe.Beispiel
Lass uns alles kombinieren und ein Anwendungsbeispiel erstellen, das:
- automatisch ein dunkles oder helles Theme basierend auf den Systemeinstellungen lädt
- dem Benutzer erlaubt, seine Systempräferenz manuell zu überschreiben
- das bevorzugte Thema des Benutzers beim Neuladen der Seite beibehält
zwei Themes oder sogar drei?
Das folgende Beispiel basiert auf einem der fertigen Layouts aus dem Jahre 2014. Damals wurde jeder Farbwert einzeln festgelegt. Mit currentColor konnte die Textfarbe bei Navigationen für den Hintergrund verwendet werden und sparte so eine Festlegung.
Mit custom properties kannst du nun beliebig viele Werte definieren und wieder aufrufen. Dies wird von allen modernen Browsern verstanden. Trotzdem sollte man auch für den IE9-11 und auch ältere Versionen der Evergreen-Browser eine konventionelle Variante zur Verfügung stellen. Deshalb werden im Stylesheet zuerst HEX-Werte angegeben, die dann durch custom properties überschrieben werden:
/* Farbfestlegungen nur als Fallback für IE9-11
custom properties für alle anderen! */
body {
color: darkRed; /* wird als currentColor für die Akzentfarbe verwendet. */
color: var(--accent1-color);
background-color: #fff;
background-color: var(--background-color);
}
p, ol, ul, dl {
color: #333;
color: var(--font-color);
}
:root {
--background-color: #fff;
--background2-color: #ccc;
--background3-color: #ccc;
--accent1-color: darkred;
--accent2-color: orange;
--accent3-color: #fede9e;
--font-color: #333;
--font2-color: #666;
--link-color: darkred;
}
:root.dark {
--background-color: #666;
--background2-color: #666;
--background3-color: #ccc;
--accent1-color: darkred;
--accent2-color: orange;
--accent3-color: #fede9e;
--font-color: #fff;
--font2-color: orange;
--link-color: orange;
}
Wie der Toggle-Schalter zum Umschalten gebaut wird, kannst du auf Formulare/Auswahllisten#Toggle-Schalter sehen.
Grafiken
Das picture-Element erlaubt es, unterschiedliche Bilder für light und dark mode zu laden:
<picture>
<source srcset="tb-dark.webp" media="(prefers-color-scheme: dark)">
<img src="tb-light.img" alt="">
<picture>
Dies wird nur in Ausnahmefälllen realisiert werden können. Nichtsdestotrotz mag es sinnvoll sein, die Helligkeit und den Kontrast von Bildern auf dunklen Hintergründen ein wenig zu verringern. Ein sehr helles Bild auf einem dunklen Hintergrund kann störend wirken, und das Dimmen des Bildes reduziert etwas von diesem starken Kontrast.
/* Apply the filter directly on the body tag */
body.dark-theme img {
filter: brightness(.8) contrast(1.2);
}
/* Or apply it via media query */
@media (prefers-color-scheme: dark) {
img {
filter: brightness(.8) contrast(1.2);
}
}
Schatten und Tiefe
Dark-Modus-Schatten sind knifflig. Wenn wir einfach einen dunklen Schatten mit hellen Farben invertieren, dann erhalten wir dieses komische Ding mit einem hellen Schatten auf einem dunklen Hintergrund... und das ist kein gutes Aussehen.
Es ist möglich, einen dunklen Schatten im dunklen Modus zu verwenden, aber die Hintergrundfarbe muss "hell" genug sein (z. B. ein dunkles Grau), um genügend Kontrast zu bieten, damit man den Schatten tatsächlich sehen kann.
Verwende die Deckkraft, um Tiefe zu vermitteln, wobei Bereiche mit hoher Deckkraft eine geringere Tiefe haben. Das heißt, dass Elemente, die eine größere Höhe haben, eine geringere Deckkraft haben sollten als Elemente, die in der Tiefe "näher" am Hintergrund sind. Verschiedene Farbtöne erzeugen unterschiedliche Wahrnehmungen von "Tiefe"
Typografie
Ähnlich wie bei Bildern musst du auch bei Text den Kontrast ausbalancieren. Wenn du eine zu große Schrift verwendest, wirkt heller Text zu grell und man versucht sich intuitiv vom Bildschirm zu entfernen. Wenn du eine zu helle Schrift verwendest, überanstrengst du deine Augen, während du dich auf den Bildschirm zubewegst, um ihn genauer zu betrachten.
Balanciere Helligkeit und Schriftgröße so aus, dass Text auch im Dark Mode lesbar bleibt. Eine Erleichterung könnten schmalere Schriftschnitte sein:
body {
font-weight: 400;
}
@media (prefers-color-scheme: dark) {
body {
font-weight: 300;
}
}
Eine solche Angabe funktioniert aber nur, wenn der Variable Font auch wirklich in diesen Schriftschnitten verfügbar ist.
Siehe auch
Unter den fertigen Layouts finden sich Beispiele für Webseiten im Dark Mode:
OnePager
Ein eleganter OnePager mit Scroll Snap
Perfekt geeignet für eine Web-Visitenkarte oder eine Einladung für ein Event!
- Webseiten-Ansicht
- Download (ZIP, 10kB)
Ihr Anwalt
Aus dem Dark Mode-Tutorial
Eine farblich ansprechende Seite für eine kleine Firma, Kanzlei oder Privatperson mit Light und Dark Mode
- Webseiten-Ansicht
- Download (ZIP, 40kB)
Vom Entwurf zum Layout
Aus dem Einstieg in CSS-Tutorial
Aus einer einfachen „Mobile first!“-Seite wird auf großen Viewports ein attraktives Grid mit Zier-Elementen.
- Webseiten-Ansicht
- Download (ZIP, 1.61MB)
SportVerein
Diese grafisch ansprechende Seite eines Sportvereins ist die Ausgangslage für weitere Projekte.
- Webseiten-Ansicht
- Download (13,3KB, Prüfsumme: )
Weblinks
- PC-Magazin: Augen und Akku schonen
- Andy Clarke: Redesigning your product and website for dark mode
- css-tricks: A Complete Guide to Dark Mode on the Web
- lea.verou.me: Dark mode in 5 minutes, with inverted lightness variables
- MDN: color-index
- Jonathan Neal, Prefers Color Scheme (Github)
- SELF-Blog: Dark Mode - die dunkle Seite … vom 30.04.2021
- SELF-Forum: Dark Mode - was haltet Ihr davon? vom 20.01.2019
- SELF-Forum: Dunkle Ansicht für das Wiki? vom 18.11.2018
Dark Mode im Design
- webdesignerdepot: The Dos and Don’ts of Dark Web Design Aug. 03, 2009
- ↑ support.apple.com Dunkelmodus auf dem Mac verwenden
- ↑ CSSWG: Preferred Color Schemes
- ↑ kombinierte Abfrage von prefers-color-scheme und Nutzerauswahl
const toggle = document.getElementById('toggle-input'); function updateUI(theme) { toggle.checked = theme === 'light'; } toggle.addEventListener('click', () => { const theme = toggle.checked ? 'light' : 'dark'; setTheme(theme, true); updateUI(theme); }); const osPreference = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; const preferredTheme = localStorage.getItem('preferred-theme') || osPreference; setTheme(preferredTheme, false); updateUI(preferredTheme); function setTheme(theme, persist = false) { const on = theme; const off = theme === 'light' ? 'dark' : 'light' const htmlEl = document.documentElement; htmlEl.classList.add(on); htmlEl.classList.remove(off); if (persist) { localStorage.setItem('preferred-theme', theme); } }
