prefers-color-scheme CSS Media-Feature
Baseline
Weitgehend verfügbar
*
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Januar 2020 browserübergreifend verfügbar.
* Einige Teile dieser Funktion werden möglicherweise unterschiedlich gut unterstützt.
Das prefers-color-scheme CSS Media-Feature wird verwendet, um zu erkennen, ob ein Benutzer helle oder dunkle Farbthemen angefordert hat.
Ein Benutzer gibt seine Präferenz über eine Einstellung des Betriebssystems (z. B. Licht- oder Dunkelmodus) oder eine Einstellung des User-Agents an.
Eingebettete Elemente
Für SVG und iframes ermöglicht prefers-color-scheme, einen CSS-Stil für das SVG oder iframe basierend auf dem color-scheme des übergeordneten Elements in der Webseite festzulegen.
SVGs müssen eingebettet verwendet werden (d.h. <img src="circle.svg" alt="circle" />) im Gegensatz zu in HTML eingebetteten SVGs.
Ein Beispiel für die Verwendung von prefers-color-scheme in SVGs finden Sie im Abschnitt "Geerbtes Farbschema in eingebetteten Elementen".
Die Verwendung von prefers-color-scheme ist in cross-origin <svg> und <iframe> Elementen erlaubt. Cross-origin Elemente sind Elemente, die von einem anderen Host als der Seite, die sie referenziert, abgerufen werden.
Um mehr über SVGs zu erfahren, sehen Sie sich die SVG-Dokumentation an, und für mehr Informationen über Iframes, siehe die Iframe-Dokumentation.
Syntax
Beispiele
>Erkennen eines dunklen oder hellen Themas
Eine häufige Verwendung besteht darin, standardmäßig ein helles Farbschema zu verwenden und dann prefers-color-scheme: dark zu verwenden, um die Farben zu einer dunkleren Variante zu überschreiben. Es ist auch möglich, es umgekehrt zu tun.
Dieses Beispiel zeigt beide Optionen: Theme A verwendet helle Farben, kann aber zu dunklen Farben überschrieben werden. Theme B verwendet dunkle Farben, kann aber zu hellen Farben überschrieben werden. Am Ende werden, wenn der Browser prefers-color-scheme unterstützt, beide Themes hell oder dunkel sein.
HTML
<div class="box theme-a">Theme A (initial)</div>
<div class="box theme-a adaptive">Theme A (changed if dark preferred)</div>
<br />
<div class="box theme-b">Theme B (initial)</div>
<div class="box theme-b adaptive">Theme B (changed if light preferred)</div>
CSS
Theme A (braun) verwendet standardmäßig ein helles Farbschema, wechselt aber basierend auf der Media-Query zu einem dunklen Schema:
.theme-a {
background: #ddccaa;
color: #773311;
}
@media (prefers-color-scheme: dark) {
.theme-a.adaptive {
background: #775533;
color: #ddccbb;
outline: 5px dashed black;
}
}
Theme B (blau) verwendet standardmäßig ein dunkles Farbschema, wechselt aber basierend auf der Media-Query zu einem hellen Schema:
.theme-b {
background: #444477;
color: #bbbbdd;
}
@media (prefers-color-scheme: light) {
.theme-b.adaptive {
background: #bbccdd;
color: #333344;
outline: 5px dotted black;
}
}
Ergebnis
Die linken Kästchen zeigen Theme A und Theme B, wie sie ohne die prefers-color-scheme Media-Query erscheinen würden. Die rechten Kästchen zeigen die gleichen Themes, aber eines von ihnen wird basierend auf dem aktiven Farbschema des Benutzers zu einer dunkleren oder helleren Variante geändert. Der Umriss eines Kästchens wird gestrichelt oder gepunktet, wenn es basierend auf Ihren Browser- oder Betriebssystemeinstellungen geändert wurde.
Geerbtes Farbschema in eingebetteten Elementen
Das folgende Beispiel zeigt, wie man das prefers-color-scheme Media-Feature in einem eingebetteten Element verwendet, um ein Farbschema von einem übergeordneten Element zu erben.
Ein Skript wird verwendet, um die Quelle der <img> Elemente und ihre alt Attribute festzulegen. Dies würde normalerweise im HTML als <img src="circle.svg" alt="circle" /> gemacht.
Sie sollten drei Kreise sehen, wobei einer in einer anderen Farbe gezeichnet ist.
Der erste Kreis erbt das color-scheme vom Betriebssystem und kann mittels des Theme-Schalters des Systems umgeschaltet werden.
Der zweite und der dritte Kreis erben das color-scheme vom einbettenden Element; die @media Abfrage erlaubt das Setzen von Stilen des SVG-Inhalts basierend auf dem color-scheme des übergeordneten Elements.
In diesem Fall ist das übergeordnete Element mit einer color-scheme CSS-Eigenschaft ein <div>.
<div>
<img alt="circle" src="" />
</div>
<div class="light">
<img alt="circle" src="" />
</div>
<div class="dark">
<img alt="circle" src="" />
</div>
.light {
color-scheme: light;
}
.dark {
color-scheme: dark;
}
// Embed an SVG for all <img> elements
for (const img of document.querySelectorAll("img")) {
img.src = `data:image/svg+xml;base64,${window.btoa(`
<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
<style>
:root { color: blue }
@media (prefers-color-scheme: dark) {
:root { color: purple }
}
</style>
<circle fill="currentColor" cx="16" cy="16" r="16"/>
</svg>
`)}`;
}
Spezifikationen
| Spezifikation |
|---|
| Media Queries Level 5> # prefers-color-scheme> |
Browser-Kompatibilität
Siehe auch
color-schemeEigenschaft<meta name="color-scheme">Sec-CH-Prefers-Color-SchemeHTTP-Header User Agent Client Hint- Simulieren von prefers-color-scheme in Firefox
- Video: Coding a Dark Mode for your Website
- Redesigning your product and website for dark mode
- Ändern von Farbschemata in Windows, macOS, Android oder anderen Plattformen.