Flash of inAccurate coloR Theme (FART)

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Es gibt viel zu bedenken, wenn man ein Dunkelmodus-Theme für eine Website implementiert. Wir haben einen umfangreichen Leitfaden dazu. Es gibt einige sehr clevere schnelle Lösungen, aber es gibt auch einige ziemlich knifflige Dinge zu meistern. Eines dieser kniffligen Dinge ist, dass es sich nicht um einen Dunkelmodus-"Schalter" zwischen dunkel und hell handelt, sondern eigentlich um drei Modi, die Sie unterstützen müssen: dunkel, hell und Systempräferenz verwenden. Dies ähnelt der Funktionsweise von Audioeinstellungen in vielen Anwendungen, die es Ihnen ermöglichen, sehr spezifisch auszuwählen, welchen Audioeingang oder -ausgang Sie verwenden möchten, oder die Systempräferenz zu verwenden.

CSS und JavaScript können den Systempräferenz-Aspekt über die prefers-color-scheme API handhaben, aber wenn die Benutzereinstellung geändert wurde und diese Einstellung nun von der Benutzereinstellung abweicht, befinden Sie sich im Bereich des "Flash of inAccurate coloR Theme" oder FART. Okay, okay, es ist ein Augenzwinkern-Akronym, aber es ist ein potenziell ziemlich visuell störendes Problem, also behalte ich es bei. Es ist im gleichen Sinne, wie FOUT (Flash of Unstyled Text) für das Laden von Schriftarten ist.

Das Speichern einer Benutzereinstellung bedeutet etwas wie einen Cookie, localStorage oder eine Art Datenbank. Wenn der Zugriff auf diese Daten die Ausführung von JavaScript erfordert, z. B. localStorage.getItem('color-mode-preference');, dann befinden Sie sich im FART-Bereich, da Ihr JavaScript sehr wahrscheinlich nach dem ersten Rendern einer Seite ausgeführt wird, es sei denn, Sie verzögern unnötigerweise das Rendern der Seite.

Benutzereinstellung ist "dunkler" Modus, aber die Systempräferenz ist "heller" Modus (oder nicht gesetzt), also wenn die Seite neu lädt, erhalten Sie FART.

Sie können mit einer serverseitigen Sprache auf einen Cookie zugreifen, bevor die Seite gerendert wird, was bedeutet, dass Sie ihn verwenden könnten, um etwas wie <html class="user-setting-dark-mode"> auszugeben und entsprechend zu stylen, was FART geschickt vermeidet, aber das bedeutet eine Website, die überhaupt Zugriff auf eine serverseitige Sprache hat (Jamstack-Websites zum Beispiel nicht).

All das, um zu sagen, dass ich den Artikel von Rob Morieson über Dark Mode geschätzt habe, weil er dieses wichtige Problem nicht scheute. Es geht sehr spezifisch um die Umsetzung in Next.js und verwendet localStorage, aber da Next.js JavaScript-gerendert ist, können Sie es zwingen, die gespeicherte Benutzereinstellung als allererstes zu überprüfen. Das bedeutet, dass es beim ersten Mal korrekt gerendert wird (kein Flash). Sie müssen jedoch das serverseitige Rendering deaktivieren, damit dies funktioniert, was jedoch ein unschöner Kompromiss ist.

Ich bin nicht davon überzeugt, dass es einen guten Weg gibt, FART ohne serverseitige Sprache oder verzögerte Seiten-Renderings zu vermeiden.