bevorzugt-Farbschema: Hallo Dunkelheit, mein alter Freund

Überbewertet oder notwendig? Hier erfahren Sie alles über den dunklen Modus und wie Sie ihn für Ihre Nutzer unterstützen können.

Computermonitor mit Greenscreen
Greenscreen (Quelle)

Mit dem dunklen Modus haben wir einen Kreis geschlossen. In den Anfängen des Personal Computing war der dunkle Modus keine Frage der Wahl, aber umso wichtiger: Monochrome CRT-Computermonitore feuerten Elektronenstrahlen auf einen phosphoreszierenden Bildschirm ab und der in frühen CRTs verwendete Phosphor war grün. Da der Text grün und der Rest des Bildschirms schwarz war, wurden diese Modelle oft als Greenscreens bezeichnet.

Textverarbeitung mit dunklem Text auf weißem Hintergrund
Dunkel auf Weiß (Quelle)

Die später eingeführten Farb-CRTs konnten durch die Verwendung von rot, grün und blau leuchtenden Phosphoren mehrere Farben anzeigen. Weiß wurde durch gleichzeitige Aktivierung aller drei Phosphore erzeugt. Mit der Einführung ausgefeilterer WYSIWYG-Desktop-Publishing-Programme wurde die Idee populär, das virtuelle Dokument einem physischen Blatt Papier ähneln zu lassen.

Dunkel auf Weiß-Webseite im WorldWideWeb-Browser
WorldWideWeb-Browser (Quelle)

Hier begann der Designtrend Dunkel auf Weiß, der sich auch auf das frühe dokumentbasierte Web auswirkte. Der erste Browser, WorldWideWeb (CSS wurde noch nicht erfunden), zeigte Webseiten auf diese Weise an. Fun Fact: Der zweite Browser überhaupt, der Line Mode Browser, ein terminalbasierter Browser, war grün auf dunkel. Heutzutage werden Webseiten und Webanwendungen in der Regel mit dunklem Text auf hellem Hintergrund gestaltet. Dies ist eine Grundannahme, die auch in User-Agent-Stylesheets hartcodiert ist. Dies gilt auch für Chrome.

Smartphone, das im Bett verwendet wird
Smartphone im Bett verwendet (Quelle: Unsplash)

Die Zeiten von CRTs sind lange vorbei. Der Konsum und die Erstellung von Inhalten haben sich auf Mobilgeräte mit hintergrundbeleuchteten LCD- oder energieeffizienten AMOLED-Displays verlagert. Kleinere und besser transportierbare Computer, Tablets und Smartphones führten zu neuen Nutzungsmustern. Freizeitaktivitäten wie Surfen im Internet, Programmieren zum Spaß und High-End-Gaming finden häufig nach Feierabend in gedimmten Umgebungen statt. Viele Nutzer nutzen ihre Geräte sogar nachts im Bett. Je mehr Nutzer ihre Geräte im Dunkeln verwenden, desto beliebter wird die Idee, zu den Wurzeln des hell-auf-dunkel-Konzepts zurückzukehren.

Vorteile des dunklen Modus

Dunkler Modus aus ästhetischen Gründen

Wenn Nutzer gefragt werden, warum sie den dunklen Modus mögen oder wollen, lautet die häufigste Antwort: „Es ist angenehmer für die Augen“, gefolgt von „er ist elegant und schön“. In der Entwicklerdokumentation zum dunklen Modus schreibt Apple explizit: „Die Entscheidung, ob ein helles oder ein dunkles Erscheinungsbild aktiviert werden soll, ist für die meisten Nutzer ästhetisch und hat möglicherweise keinen Bezug zu den Lichtverhältnissen in der Umgebung.“

CloseView in Mac OS 7 mit
System 7 CloseView (Quelle)

Dunkler Modus als Bedienungshilfe

Es gibt auch Nutzer, die den dunklen Modus tatsächlich brauchen und ihn als weiteres Bedienungshilfen-Tool verwenden, z. B. sehbehinderte Nutzer. Das früheste Auftreten eines solchen Bedienungshilfen-Tools, das ich finden konnte, war die Funktion CloseView von System 7 mit den Ein-/Aus-Schaltflächen Schwarz auf Weiß und Weiß auf Schwarz. Obwohl System 7 Farben unterstützte, war die Standardbenutzeroberfläche weiterhin schwarz-weiß.

Diese inversionsbasierten Implementierungen zeigten ihre Schwächen, als Farbe eingeführt wurde. Eine Nutzerstudie von Szpiro et al. zum Zugriff von Menschen mit eingeschränktem Sehvermögen auf Computer zeigte, dass alle befragten Nutzer invertierte Bilder nicht mochten, viele aber hellen Text auf dunklem Hintergrund bevorzugten. Apple bietet mit der Funktion Smarte Farbumkehr eine Lösung für diese Nutzerpräferenz. Dabei werden die Farben auf dem Display umgekehrt, mit Ausnahme von Bildern, Medien und einigen Apps, die dunkle Farbstile verwenden.

Eine besondere Form der Sehschwäche ist das Computer Vision Syndrome, auch als Digital Eye Strain bezeichnet. Es wird definiert als „die Kombination von Augen- und Sehproblemen, die mit der Verwendung von Computern (einschließlich Desktop-Computern, Laptops und Tablets) und anderen elektronischen Displays (z. B. Smartphones und elektronische Lesegeräte) verbunden sind“. Es wurde vorgeschlagen, dass die Nutzung elektronischer Geräte durch Jugendliche, insbesondere nachts, zu einem erhöhten Risiko für eine kürzere Schlafdauer, eine längere Latenz beim Einschlafen und einen erhöhten Schlafmangel führt. Darüber hinaus ist eine Belastung mit blauem Licht allgemein bekannt, dass sie an der Regulierung des zirkadischen Rhythmus und des Schlafzyklus beteiligt ist. Unregelmäßiges Licht kann zu Schlafmangel führen, was sich laut Forschung von Rosenfield möglicherweise auf die Stimmung und die Aufgabenleistung auswirkt. Um diese negativen Auswirkungen zu begrenzen, können Sie die Blaulichtstrahlung reduzieren, indem Sie die Farbtemperatur des Displays über Funktionen wie Night Shift unter iOS oder Nachtlicht unter Android anpassen. Außerdem sollten Sie grelles Licht oder unregelmäßiges Licht im Allgemeinen durch dunkle Themen oder dunkle Modi vermeiden.

Energieeinsparung durch den dunklen Modus auf AMOLED-Displays

Der dunkle Modus spart auf AMOLED außerdem eine Menge Energie ein. Android-Fallstudien, die sich auf beliebte Google-Apps wie YouTube konzentrierten, haben gezeigt, dass die Energieeinsparungen bis zu 60 % betragen können. Im Video unten finden Sie weitere Informationen zu diesen Fallstudien und den Energieeinsparungen pro App.

Dunklen Modus im Betriebssystem aktivieren

Nachdem wir uns angesehen haben, warum der dunkle Modus für viele Nutzer so wichtig ist, sehen wir uns nun an, wie er unterstützt werden kann.

Einstellungen für den dunklen Modus in Android Q
Einstellungen für das dunkle Design in Android Q

Betriebssysteme, die einen dunklen Modus oder ein dunkles Design unterstützen, haben in der Regel eine Option, mit der er in den Einstellungen aktiviert werden kann. Unter macOS X befindet sie sich in den Systemeinstellungen im Bereich Allgemein unter Darstellung (Screenshot) und unter Windows 10 im Bereich Farben unter Farbe auswählen (Screenshot). Unter Android Q finden Sie die Option unter Display als Schalter für das Dunkle Design (Screenshot). Unter iOS 13 können Sie die Darstellung im Bereich Display und Helligkeit der Einstellungen ändern (Screenshot).

Die Medienabfrage prefers-color-scheme

Noch ein letztes bisschen Theorie, bevor ich loslege. Mit Medienabfragen können Autoren Werte oder Funktionen des User-Agents oder Anzeigegeräts unabhängig vom gerenderten Dokument testen und abfragen. Sie werden in der CSS-Regel @media verwendet, um Stile bedingt auf ein Dokument anzuwenden, und in verschiedenen anderen Kontexten und Sprachen wie HTML und JavaScript. Media Queries Level 5 führt sogenannte Medienfunktionen für Nutzereinstellungen ein. Das bedeutet, dass Websites die bevorzugte Darstellungsweise von Inhalten für den Nutzer erkennen können.

Mit der Medienfunktion prefers-color-scheme wird ermittelt, ob der Nutzer ein helles oder dunkles Farbdesign für die Seite angefordert hat. Es funktioniert mit den folgenden Werten:

  • light: Gibt an, dass der Nutzer dem System mitgeteilt hat, dass er eine Seite mit hellem Design bevorzugt (dunkler Text auf hellem Hintergrund).
  • dark: Gibt an, dass der Nutzer dem System mitgeteilt hat, dass er eine Seite mit dunklem Design bevorzugt (heller Text auf dunklem Hintergrund).

Unterstützung für dunklen Modus

Herausfinden, ob der dunkle Modus vom Browser unterstützt wird

Da der dunkle Modus über eine Mediaabfrage gemeldet wird, können Sie ganz einfach prüfen, ob der aktuelle Browser den dunklen Modus unterstützt, indem Sie prüfen, ob die Mediaabfrage prefers-color-scheme überhaupt übereinstimmt. Beachten Sie, dass ich keinen Wert angeben, sondern nur prüfe, ob die Mediaabfrage allein übereinstimmt.

if (window.matchMedia('(prefers-color-scheme)').media !== 'not all') {
  console.log('🎉 Dark mode is supported');
}

Zum Zeitpunkt der Erstellung dieses Artikels wird prefers-color-scheme sowohl auf Computern als auch auf Mobilgeräten (sofern verfügbar) von Chrome und Edge ab Version 76, von Firefox ab Version 67 und von Safari ab Version 12.1 auf macOS und ab Version 13 auf iOS unterstützt. Für alle anderen Browser können Sie den Hilfeartikel Kann ich Supporttabellen verwenden? lesen.

Informationen zu den Einstellungen eines Nutzers zum Zeitpunkt der Anfrage

Mit dem Client-Hinweisheader Sec-CH-Prefers-Color-Scheme können Websites die Farbschemaeinstellungen des Nutzers optional bei der Anfrage abrufen. So können Server das richtige CSS einfügen und ein vorübergehendes Aufblinken des falschen Farbschemas vermeiden.

Der dunkle Modus in der Praxis

Sehen wir uns nun an, wie die Unterstützung des dunklen Modus in der Praxis aussieht. Ähnlich wie beim Highlander kann es beim dunklen Modus nur einen geben: dunkel oder hell, aber nie beides! Warum erwähne ich das? Weil sich dieser Umstand auf die Ladestrategie auswirken sollte. Zwingen Sie Nutzer nicht dazu, CSS im kritischen Rendering-Pfad herunterzuladen, das für einen Modus vorgesehen ist, den sie derzeit nicht verwenden. Um die Ladegeschwindigkeit zu optimieren, habe ich das CSS für die Beispiel-App, in der die folgenden Empfehlungen in der Praxis gezeigt werden, in drei Teile aufgeteilt, um nicht kritisches CSS zu verzögern:

  • style.css mit allgemeinen Regeln, die auf der Website universell gelten.
  • dark.css, die nur die für den dunklen Modus erforderlichen Regeln enthält.
  • light.css, die nur die für den hellen Modus erforderlichen Regeln enthält.

Lademethode

Die beiden letzteren, light.css und dark.css, werden bedingt mit einer <link media>-Abfrage geladen. Anfangs wird prefers-color-scheme nicht von allen Browsern unterstützt (erkennbar am Muster oben). Ich gehe damit dynamisch um, indem ich die Standardlight.css-Datei über ein bedingt eingefügtes <link rel="stylesheet">-Element in einem winzigen Inline-Script lade. „Light“ ist eine beliebige Auswahl, ich hätte auch „dark“ als Standard-Fallback-Option festlegen können. Um zu vermeiden, dass unformatierte Inhalte kurz eingeblendet werden, blende ich den Inhalt der Seite aus, bis light.css geladen wurde.

<script>
  // If `prefers-color-scheme` is not supported, fall back to light mode.
  // In this case, light.css will be downloaded with `highest` priority.
  if (window.matchMedia('(prefers-color-scheme: dark)').media === 'not all') {
    document.documentElement.style.display = 'none';
    document.head.insertAdjacentHTML(
      'beforeend',
      '<link rel="stylesheet" href="/light.css" onload="document.documentElement.style.display = \'\'">',
    );
  }
</script>
<!--
  Conditionally either load the light or the dark stylesheet. The matching file
  will be downloaded with `highest`, the non-matching file with `lowest`
  priority. If the browser doesn't support `prefers-color-scheme`, the media
  query is unknown and the files are downloaded with `lowest` priority (but
  above I already force `highest` priority for my default light experience).
-->
<link rel="stylesheet" href="/dark.css" media="(prefers-color-scheme: dark)" />
<link
  rel="stylesheet"
  href="/light.css"
  media="(prefers-color-scheme: light)"
/>
<!-- The main stylesheet -->
<link rel="stylesheet" href="/style.css" />

Stylesheet-Architektur

Ich nutze die CSS-Variablen maximal. Dadurch kann mein generisches style.css allgemein gehalten werden und die gesamte Anpassung des hellen oder dunklen Modus erfolgt in den beiden anderen Dateien dark.css und light.css. Unten sehen Sie einen Auszug aus den tatsächlichen Stilen. Er sollte jedoch ausreichen, um die allgemeine Idee zu vermitteln. Ich deklariere zwei Variablen, -⁠-⁠color und -⁠-⁠background-color, die im Wesentlichen ein Basisthema dark-on-light und light-on-dark erstellen.

/* light.css: 👉 dark-on-light */
:root {
  --color: rgb(5, 5, 5);
  --background-color: rgb(250, 250, 250);
}
/* dark.css: 👉 light-on-dark */
:root {
  --color: rgb(250, 250, 250);
  --background-color: rgb(5, 5, 5);
}

In meiner style.css verwende ich diese Variablen dann in der body { … }-Regel. Da sie für die CSS-Pseudoklasse :root definiert sind, einem Selektor, der in HTML das Element <html> darstellt und mit dem Selektor html identisch ist, mit der Ausnahme, dass seine Spezifität höher ist, werden sie kaskadiert, was mir bei der Deklaration globaler CSS-Variablen hilft.

/* style.css */
:root {
  color-scheme: light dark;
}

body {
  color: var(--color);
  background-color: var(--background-color);
}

Im Codebeispiel oben ist Ihnen wahrscheinlich das Attribut color-scheme mit dem durch Leerzeichen getrennten Wert light dark aufgefallen.

Dadurch wird dem Browser mitgeteilt, welche Farbdesigns von meiner App unterstützt werden. Außerdem kann er spezielle Varianten des User-Agent-Stylesheets aktivieren. Dies ist beispielsweise nützlich, wenn der Browser Formularfelder mit dunklem Hintergrund und hellem Text rendern, die Bildlaufleisten anpassen oder eine designbasierte Hervorhebungsfarbe aktivieren kann. Die genauen Details zu color-scheme finden Sie im CSS-Modul zur Farbanpassung – Level 1.

Alles andere besteht dann nur noch darin, CSS-Variablen für die wichtigen Elemente auf meiner Website zu definieren. Die semantische Organisation von Stilen ist beim Arbeiten im Dunkelmodus sehr hilfreich. Anstatt -⁠-⁠highlight-yellow könnten Sie beispielsweise die Variable -⁠-⁠accent-color aufrufen, da „gelb“ im Dunkelmodus möglicherweise nicht gelb ist oder umgekehrt. Unten finden Sie einige weitere Variablen, die ich in meinem Beispiel verwende.

/* dark.css */
:root {
  --color: rgb(250, 250, 250);
  --background-color: rgb(5, 5, 5);
  --link-color: rgb(0, 188, 212);
  --main-headline-color: rgb(233, 30, 99);
  --accent-background-color: rgb(0, 188, 212);
  --accent-color: rgb(5, 5, 5);
}
/* light.css */
:root {
  --color: rgb(5, 5, 5);
  --background-color: rgb(250, 250, 250);
  --link-color: rgb(0, 0, 238);
  --main-headline-color: rgb(0, 0, 192);
  --accent-background-color: rgb(0, 0, 238);
  --accent-color: rgb(250, 250, 250);
}

Vollständiges Beispiel

Im folgenden Glitch-Embed sehen Sie das vollständige Beispiel, in dem die oben genannten Konzepte in die Praxis umgesetzt werden. Aktivieren oder deaktivieren Sie den dunklen Modus in den Einstellungen Ihres Betriebssystems und sehen Sie, wie die Seite reagiert.

Auswirkungen des Ladens

Wenn Sie mit diesem Beispiel experimentieren, sehen Sie, warum ich meine dark.css und light.css über Medienabfragen lade. Aktivieren Sie den dunklen Modus und aktualisieren Sie die Seite: Die derzeit nicht übereinstimmenden Stylesheets werden zwar geladen, aber mit der niedrigsten Priorität, damit sie nicht mit Ressourcen konkurrieren, die derzeit von der Website benötigt werden.

Diagramm zum Laden des Netzwerks, das zeigt, wie das CSS im dunklen Modus im hellen Modus mit der niedrigsten Priorität geladen wird
Die Website lädt im hellen Modus das CSS für den dunklen Modus mit der niedrigsten Priorität.
Netzwerkladediagramm, das zeigt, wie im Dunkelmodus das CSS für den hellen Modus mit der niedrigsten Priorität geladen wird
Website im dunklen Modus lädt das CSS im hellen Modus mit der niedrigsten Priorität.
Netzwerkladediagramm, das zeigt, wie im Standard-hellen Modus die CSS-Datei für den dunklen Modus mit der niedrigsten Priorität geladen wird
Wenn die Website im Standardmodus (hell) in einem Browser angezeigt wird, der prefers-color-scheme nicht unterstützt, wird das CSS für den dunklen Modus mit der niedrigsten Priorität geladen.

Auf Änderungen am dunklen Modus reagieren

Wie bei jeder anderen Änderung an einer Medienabfrage können Änderungen am dunklen Modus über JavaScript abonniert werden. So können Sie beispielsweise das Favicon einer Seite dynamisch ändern oder die <meta name="theme-color">, die die Farbe der URL-Leiste in Chrome bestimmt. Im vollständigen Beispiel oben wird dies veranschaulicht. Wenn Sie die Änderungen an der Designfarbe und dem Favicon sehen möchten, öffnen Sie die Demo in einem separaten Tab.

const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
darkModeMediaQuery.addEventListener('change', (e) => {
  const darkModeOn = e.matches;
  console.log(`Dark mode is ${darkModeOn ? '🌒 on' : '☀️ off'}.`);
});

In Chromium 93 und Safari 15 können Sie die Farbe basierend auf einer Medienabfrage mit dem Attribut media des Design-Farbelements meta anpassen. Die erste Übereinstimmung wird ausgewählt. Zum Beispiel könnten Sie eine Farbe für den hellen Modus und eine andere für den dunklen Modus verwenden. Zum Zeitpunkt der Erstellung dieses Artikels können Sie diese nicht in Ihrem Manifest definieren. Siehe GitHub-Problem w3c/manifest#975.

<meta
  name="theme-color"
  media="(prefers-color-scheme: light)"
  content="white"
/>
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="black" />

Dunklen Modus debuggen und testen

prefers-color-scheme in den Entwicklertools emulieren

Der Wechsel des Farbschemas des gesamten Betriebssystems kann sehr schnell lästig sein. Daher können Sie in den Chrome-Entwicklertools jetzt das bevorzugte Farbschema des Nutzers so emulieren, dass sich nur der aktuell sichtbare Tab auswirkt. Öffne das Befehlsmenü, gib Rendering ein, führe den Befehl Show Rendering aus und ändere dann die Option CSS-Medienfunktion „prefers-color-scheme“ emulieren.

Screenshot der Option „CSS-Medienfunktion „prefers-color-scheme emulieren“ auf dem Tab „Rendering“ in den Chrome-Entwicklertools

Screenshots von prefers-color-scheme mit Puppeteer erstellen

Puppeteer ist eine Node.js-Bibliothek, die eine API auf übergeordneter Ebene zur Steuerung von Chrome oder Chromium über das DevTools-Protokoll bietet. Mit dark-mode-screenshot stellen wir ein Puppeteer-Script bereit, mit dem Sie Screenshots Ihrer Seiten sowohl im dunklen als auch im hellen Modus erstellen können. Sie können dieses Script einmalig ausführen oder es in Ihre CI-Testsuite (Continuous Integration) aufnehmen.

npx dark-mode-screenshot --url https://googlechromelabs.github.io/dark-mode-toggle/demo/ --output screenshot --fullPage --pause 750

Best Practices für den dunklen Modus

Reines Weiß vermeiden

Ein kleines Detail, das Sie vielleicht bemerkt haben, ist, dass ich kein reines Weiß verwende. Stattdessen wähle ich ein etwas dunkleres Weiß aus, um ein Leuchten und Auslaufen vor dem dunklen Hintergrund zu vermeiden. Etwas wie rgb(250, 250, 250) funktioniert gut.

Fotos neu einfärben und abdunkeln

Wenn Sie die beiden Screenshots unten vergleichen, sehen Sie, dass sich nicht nur das Hauptthema von dunkel auf hell zu hell auf dunkel geändert hat, sondern auch das Hero-Image sieht etwas anders aus. Meine Nutzerstudien haben gezeigt, dass die Mehrheit der Befragten etwas weniger kräftige und brillante Bilder bevorzugt, wenn der dunkle Modus aktiv ist. Ich bezeichne das als Neufärbung.

Das Hero-Image ist im dunklen Modus etwas abgedunkelt.
Hero-Bild ist im dunklen Modus etwas abgedunkelt.
Normales Hero-Image im hellen Modus.
Normales Hero-Image im hellen Modus.

Die Bilder können mit einem CSS-Filter neu eingefärbt werden. Ich verwende einen CSS-Selektor, der mit allen Bildern ohne .svg in der URL übereinstimmt. Ich kann Vektorgrafiken (Symbolen) anders als meinen Bildern (Fotos) die Farben neu einfärben lassen. Mehr dazu im nächsten Abschnitt. Wie ich noch einmal eine CSS-Variable verwende, kann ich den Filter später flexibel ändern.

Da eine Neufarbgebung nur im Dunkelmodus erforderlich ist, also wenn dark.css aktiv ist, gibt es in light.css keine entsprechenden Regeln.

/* dark.css */
--image-filter: grayscale(50%);

img:not([src*='.svg']) {
  filter: var(--image-filter);
}

Intensität der Neufärbung im dunklen Modus mit JavaScript anpassen

Nicht jeder ist gleich und jeder hat unterschiedliche Anforderungen an den dunklen Modus. Wenn ich die oben beschriebene Methode zur Umwandlung in Graustufen verwende, kann ich die Graustufenintensität ganz einfach zu einer Nutzereinstellung machen, die ich über JavaScript ändern kann. Wenn ich den Wert auf 0% setze, kann ich die Umwandlung in Graustufen auch vollständig deaktivieren. Beachten Sie, dass document.documentElement auf das Stammelement des Dokuments verweist, also auf dasselbe Element, auf das ich mit der :root-CSS-Pseudoklasse verweisen kann.

const filter = 'grayscale(70%)';
document.documentElement.style.setProperty('--image-filter', value);

Vektorgrafiken und Symbole invertieren

Für Vektorgrafiken, die in meinem Fall als Symbole verwendet werden, auf die ich über <img>-Elemente verweise, verwende ich eine andere Methode zum Neufärben. Forschungen haben gezeigt, dass Nutzer die Inversion von Fotos nicht mögen, sie funktioniert jedoch sehr gut für die meisten Symbole. Auch hier verwende ich CSS-Variablen, um den Inversionsgrad im Normal- und im :hover-Status zu bestimmen.

Im dunklen Modus werden die Symbole umgekehrt.
Symbole werden im dunklen Modus umgekehrt.
Normale Symbole im hellen Modus.
Normale Symbole im hellen Modus.

Beachten Sie, dass ich auch hier nur die Symbole in dark.css, aber nicht in light.css invertiere. Außerdem wird :hover in beiden Fällen mit einer unterschiedlichen Inversionsintensität versehen, damit das Symbol je nach ausgewähltem Modus etwas dunkler oder heller erscheint.

/* dark.css */
--icon-filter: invert(100%);
--icon-filter_hover: invert(40%);

img[src*='.svg'] {
  filter: var(--icon-filter);
}
/* light.css */
--icon-filter_hover: invert(60%);
/* style.css */
img[src*='.svg']:hover {
  filter: var(--icon-filter_hover);
}

currentColor für Inline-SVGs verwenden

Für Inline-SVG-Bilder können Sie anstelle von Inversionsfiltern das CSS-Schlüsselwort currentColor verwenden, das den Wert des Attributs color eines Elements darstellt. So können Sie den Wert color für Attribute verwenden, die ihn nicht standardmäßig erhalten. Wenn currentColor als Wert der SVG-Attribute fill oder stroke verwendet wird, wird stattdessen der Wert aus dem übernommenen Wert der Property „color“ übernommen. Noch besser: Das funktioniert auch für <svg><use href="…"></svg>. Sie können also separate Ressourcen haben und currentColor wird trotzdem im Kontext angewendet. Dies funktioniert nur für Inline- oder <use href="…">-SVGs, aber nicht für SVGs, die als src eines Bildes oder irgendwie über CSS referenziert werden. In der Demo unten sehen Sie, wie das funktioniert.

<!-- Some inline SVG -->
<svg xmlns="http://www.w3.org/2000/svg"
    stroke="currentColor"
>
  […]
</svg>

Nahtlose Übergänge zwischen den Modi

Der Wechsel vom dunklen in den hellen Modus oder umgekehrt kann geglättet werden, da sowohl color als auch background-color animierbare CSS-Eigenschaften sind. Zum Erstellen der Animation müssen Sie lediglich zwei transition-Elemente für die beiden Properties deklarieren. Das folgende Beispiel veranschaulicht die Grundidee. Sie können sie in der Demo live erleben.

body {
  --duration: 0.5s;
  --timing: ease;

  color: var(--color);
  background-color: var(--background-color);

  transition: color var(--duration) var(--timing), background-color var(
        --duration
      ) var(--timing);
}

Art-Direction im dunklen Modus

Aus Gründen der Ladeleistung empfehle ich im Allgemeinen, ausschließlich mit prefers-color-scheme im Attribut media von <link>-Elementen zu arbeiten und nicht inline in Stylesheets. Es kann jedoch Situationen geben, in denen Sie direkt inline im HTML-Code mit prefers-color-scheme arbeiten möchten. Die Art Direction ist eine solche Situation. Im Web befasst sich die Art Direction mit dem visuellen Erscheinungsbild einer Seite und damit, wie sie visuell kommuniziert, Stimmungen erzeugt, Funktionen kontrastiert und psychologisch auf eine Zielgruppe einwirkt.

Im dunklen Modus liegt es im Ermessen des Designers, welches Bild in einem bestimmten Modus am besten geeignet ist und ob die Neufärbung von Bildern nicht gut genug ist. Bei Verwendung mit dem <picture>-Element kann der <source> des anzuzeigenden Bildes vom media-Attribut abhängig gemacht werden. Im folgenden Beispiel zeige ich die westliche Hemisphäre im dunklen Modus und die östliche Hemisphäre im hellen Modus oder wenn keine Präferenz angegeben wird. In allen anderen Fällen wird die östliche Hemisphäre standardmäßig verwendet. Dies dient natürlich nur der Veranschaulichung. Aktiviere den dunklen Modus auf deinem Gerät, um den Unterschied zu sehen.

<picture>
  <source srcset="western.webp" media="(prefers-color-scheme: dark)" />
  <source srcset="eastern.webp" media="(prefers-color-scheme: light)" />
  <img src="eastern.webp" />
</picture>

Dunkler Modus – mit Opt-out-Option

Wie bereits im Abschnitt Warum der dunkle Modus erwähnt, ist der dunkle Modus für die meisten Nutzer die richtige Wahl. Dies kann dazu führen, dass einige Nutzer die Benutzeroberfläche ihres Betriebssystems lieber im Dunkeln sehen möchten, aber es vorziehen, ihre Webseiten so zu sehen, wie sie es gewohnt sind. Ein gutes Muster ist es, sich zuerst an das Signal zu halten, das der Browser über prefers-color-scheme sendet, aber den Nutzern dann optional zu erlauben, ihre Einstellung auf Systemebene zu überschreiben.

Das benutzerdefinierte Element <dark-mode-toggle>

Sie können den Code dafür natürlich selbst erstellen, aber Sie können auch ein fertiges benutzerdefiniertes Element (Webkomponente) verwenden, das ich speziell für diesen Zweck erstellt habe. Es heißt <dark-mode-toggle> und fügt Ihrer Seite einen Schalter (dunkler Modus: an/aus) oder einen Design-Schalter (Design: hell/dunkel) hinzu, den Sie vollständig anpassen können. In der Demo unten sehen Sie das Element in Aktion. 🤫 Außerdem habe ich es in alle anderen Beispiele oben heimlich eingefügt.

<dark-mode-toggle
  legend="Theme Switcher"
  appearance="switch"
  dark="Dark"
  light="Light"
  remember="Remember this"
></dark-mode-toggle>
dark-mode-toggle im hellen Modus
<dark-mode-toggle> im hellen Modus.
dark-mode-toggle im hellen Modus
<dark-mode-toggle> im dunklen Modus.

Klicken oder tippen Sie in der Demo unten rechts oben auf die Steuerelemente für den dunklen Modus. Wenn du das Kästchen im dritten und vierten Steuerelement anklickst, kannst du prüfen, wie deine Modusauswahl gespeichert wird, auch wenn du die Seite neu lädst. So können Ihre Besucher ihr Betriebssystem im dunklen Modus lassen, Ihre Website aber im hellen Modus nutzen oder umgekehrt.

Schlussfolgerungen

Die Arbeit mit dem dunklen Modus macht Spaß und eröffnet neue Designmöglichkeiten. Für einige Ihrer Besucher kann das den Unterschied zwischen einer nicht funktionierenden Website und einer zufriedenstellenden Website ausmachen. Es gibt einige Fallstricke und sorgfältige Tests sind unbedingt erforderlich. Der dunkle Modus ist jedoch eine gute Gelegenheit, um zu zeigen, dass Sie sich um alle Ihre Nutzer kümmern. Mit den in diesem Beitrag erwähnten Best Practices und Hilfsmitteln wie dem benutzerdefinierten Element <dark-mode-toggle> sollten Sie in der Lage sein, einen ansprechenden dunklen Modus zu erstellen. Teilt mir auf Twitter mit, was ihr erstellt habt und ob dieser Beitrag hilfreich war. Ihr könnt mir auch Verbesserungsvorschläge schicken. Vielen Dank, dass Sie sich die Zeit zum Lesen dieser E-Mail genommen haben. 🌒

Ressourcen für die Medienabfrage prefers-color-scheme:

Ressourcen für das Meta-Tag color-scheme und die CSS-Eigenschaft:

Allgemeine Links im dunklen Modus:

Artikel zur Hintergrundrecherche für diesen Beitrag:

Danksagungen

Die Medienfunktion prefers-color-scheme, die CSS-Eigenschaft color-scheme und das zugehörige Meta-Tag sind Bestandteil der Implementierung von 👏 Rune Lillesveen. Rune ist auch Mitbearbeiter der CSS-Spezifikation für das Farbkorrekturmodul – Level 1. Ich möchte Lukasz Zbylut, Rowan Merewood, Chirag Desai und Rob Dodson für ihre gründliche Überprüfung dieses Artikels 🙏 danken. Die Ladestrategie ist ein Konzept von Jake Archibald. Emilio Cobos Álvarez hat mich auf die richtige prefers-color-scheme-Erkennungsmethode hingewiesen. Der Tipp zu referenzierten SVGs und currentColor stammt von Timothy Hatcher. Abschließend möchte ich mich bei den vielen anonymen Teilnehmern der verschiedenen Nutzerstudien bedanken, die zu den Empfehlungen in diesem Artikel beigetragen haben. Hero-Image von Nathan Anderson.