Mithilfe einer Reihe von Client-Hinweis-Headern können Websites die Medieneinstellungen des Nutzers optional bei der Anfrage abrufen, sodass Server aus Leistungsgründen das richtige CSS einfügen können.
CSS-Medienabfragen und insbesondere Medienfunktionen für Nutzereinstellungen wie prefers-color-scheme
oder prefers-reduced-motion
können sich erheblich auf die Menge an CSS auswirken, die von einer Seite gesendet werden muss, und auf die Nutzererfahrung beim Laden der Seite.
Wir konzentrieren uns hier auf prefers-color-scheme
, möchten aber betonen, dass die Begründung auch für andere Medienfunktionen für Nutzereinstellungen gilt. Es ist eine Best Practice, CSS für das jeweilige nicht übereinstimmende Farbschema nicht im kritischen Rendering-Pfad zu laden, sondern stattdessen zuerst nur das aktuell relevante CSS. Eine Möglichkeit dazu ist über <link media>
.
Websites mit hohem Traffic wie die Google Suche, die Medienfunktionen für Nutzereinstellungen wie prefers-color-scheme
berücksichtigen und aus Leistungsgründen Inline-CSS verwenden, müssen das bevorzugte Farbschema (oder andere Medienfunktionen für Nutzereinstellungen) idealerweise zum Zeitpunkt der Anfrage kennen, damit in der ursprünglichen HTML-Nutzlast bereits das richtige CSS eingefügt ist.
Außerdem sollten Websites, insbesondere für prefers-color-scheme
, unbedingt vermeiden, dass ein falsches Farbschema kurz eingeblendet wird.
Die Client-Hinweis-Header Sec-CH-Prefers-Color-Scheme
und Sec-CH-Prefers-Reduced-Motion
sind die ersten von mehreren Client-Hinweis-Headern für Medienfunktionen mit Nutzereinstellungen, mit denen dieses Problem behoben werden soll.
Hintergrund zu Client-Hints
HTTP-Clienthinweise definieren einen Accept-CH
-Antwortheader, mit dem Server ihre Verwendung von Anfrageheadern für die proaktive Inhaltsverhandlung angeben können. Diese werden auch als Clienthinweise bezeichnet. Der Vorschlag Client-Hinweise zu Medienfunktionen mit Nutzereinstellungen definiert eine Reihe von Client-Hinweisen, die Medienfunktionen mit Nutzereinstellungen übertragen sollen. Diese Clienthinweise sind nach der entsprechenden Medienfunktion für Nutzereinstellungen benannt, für die sie Berichte enthalten.
Das derzeit bevorzugte Farbschema gemäß prefers-color-scheme
wird beispielsweise über den treffend benannten Clienthinweis Sec-CH-Prefers-Color-Scheme
gemeldet.
Wichtige Client-Hinweise
Die in den Client-Hinweisen für die Medienfunktionen der Nutzereinstellungen vorgeschlagenen Client-Hinweise werden vermutlich am häufigsten als kritische Client-Hinweise verwendet. Kritische Client-Hints sind Client-Hints, die die resultierende Ressource erheblich ändern. Eine solche Ressource sollte bei jedem Seitenaufbau (einschließlich des ersten Seitenaufbaus) konsistent abgerufen werden, um unnötige, für Nutzer sichtbare Wechsel zu vermeiden.
Syntax für Client-Hinweise
Medienfunktionen für Nutzereinstellungen bestehen aus einem Namen (z. B. prefers-reduced-motion
) und zulässigen Werten (z. B. no-preference
oder reduce
). Jedes Client-Hinweis-Header-Feld wird als strukturierter Header für HTTP-Objekt dargestellt, das ein Element mit dem Wert String enthält. Wenn Sie beispielsweise vermitteln möchten, dass der Nutzer ein dunkles Design und weniger Bewegung bevorzugt, sehen die Clienthinweise so aus wie im Beispiel unten.
GET / HTTP/2
Host: example.com
Sec-CH-Prefers-Color-Scheme: "dark"
Sec-CH-Prefers-Reduced-Motion: "reduce"
Die Informationen in den obigen Clienthinweisen entsprechen in Preisvergleichsportalen den Werten @media (prefers-color-scheme: dark) {}
und @media (prefers-reduced-motion: reduce) {}
.
Vollständige Liste der Clienthinweise
Die Liste der Clienthinweise ist an den Medienfunktionen für Nutzereinstellungen in Media Queries Level 5 angelehnt.
Client-Hinweis | Zulässige Werte | Entsprechende Medienfunktion für Nutzereinstellungen |
---|---|---|
Sec-CH-Prefers-Reduced-Motion |
no-preference , reduce |
prefers-reduced-motion |
Sec-CH-Prefers-Reduced-Transparency |
no-preference , reduce |
prefers-reduced-transparency |
Sec-CH-Prefers-Contrast |
no-preference , less , more , custom |
prefers-contrast |
Sec-CH-Forced-Colors |
active , none |
forced-colors |
Sec-CH-Prefers-Color-Scheme |
light , dark |
prefers-color-scheme |
Sec-CH-Prefers-Reduced-Data |
no-preference , reduce |
prefers-reduced-data |
Unterstützte Browser
Der Sec-CH-Prefers-Color-Scheme
-Clienthinweis-Header wird in Chromium 93 unterstützt.
Der Sec-CH-Prefers-Reduced-Motion
-Client-Hinweis-Header wird in Chromium 108 unterstützt.
Das Feedback anderer Anbieter, nämlich von WebKit und Mozilla, steht noch aus.
Demo von Sec-CH-Prefers-Color-Scheme
Sehen Sie sich die Demo in Chromium 93 an und achten Sie darauf, wie sich das Inline-CSS entsprechend dem bevorzugten Farbschema des Nutzers ändert.
Demo von Sec-CH-Prefers-Reduced-Motion
Sehen Sie sich die Demo in Chromium 108 an und achten Sie darauf, wie sich das Inline-CSS entsprechend den Bewegungseinstellungen des Nutzers ändert.
Funktionsweise
- Der Client sendet eine erste Anfrage an den Server.
bash GET / HTTP/2 Host: example.com
- Der Server antwortet und teilt dem Client über
Accept-CH
mit, dass er dieSec-CH-Prefers-Color-Scheme
- und dieSec-CH-Prefers-Contrast
-Clienthinweise akzeptiert. GemäßCritical-CH
betrachtet erSec-CH-Prefers-Color-Scheme
als kritischen Clienthinweis, auf den er die Antwort variiert, wie inVary
angegeben.bash HTTP/2 200 OK Content-Type: text/html Accept-CH: Sec-CH-Prefers-Color-Scheme, Sec-CH-Prefers-Contrast Vary: Sec-CH-Prefers-Color-Scheme Critical-CH: Sec-CH-Prefers-Color-Scheme
- Der Client versucht dann noch einmal, die Anfrage zu senden, und teilt dem Server über
Sec-CH-Prefers-Color-Scheme
mit, dass die Nutzereinstellung für Inhalte mit dunklem Design festgelegt ist.bash GET / HTTP/2 Host: example.com Sec-CH-Prefers-Color-Scheme: "dark"
- Der Server kann die Antwort dann entsprechend den Einstellungen des Clients anpassen und beispielsweise das für das dunkle Design zuständige CSS in den Antworttext einfügen.
Node.js-Beispiel
Das folgende Node.js-Beispiel, das für das beliebte Express.js-Framework geschrieben wurde, zeigt, wie der Umgang mit dem Sec-CH-Prefers-Color-Scheme
-Clienthinweis-Header in der Praxis aussehen könnte.
Dieser Code ist die Grundlage der Demo oben.
app.get("/", (req, res) => {
// Tell the client the server accepts the `Sec-CH-Prefers-Color-Scheme` client hint…
res.set("Accept-CH", "Sec-CH-Prefers-Color-Scheme");
// …and that the server's response will vary based on its value…
res.set("Vary", "Sec-CH-Prefers-Color-Scheme");
// …and that the server considers this client hint a _critical_ client hint.
res.set("Critical-CH", "Sec-CH-Prefers-Color-Scheme");
// Read the user's preferred color scheme from the headers…
const prefersColorScheme = req.get("sec-ch-prefers-color-scheme");
// …and send the adequate HTML response with the right CSS inlined.
res.send(getHTML(prefersColorScheme));
});
Datenschutz- und Sicherheitsaspekte
Das Chromium-Team hat Client-Hinweise-Header für Medienfunktionen mit Nutzereinstellungen entworfen und implementiert. Dabei wurden die in Controlling Access to Powerful Web Platform Features (Zugriff auf leistungsstarke Funktionen der Webplattform steuern) definierten Grundprinzipien berücksichtigt, darunter Nutzersteuerung, Transparenz und Ergonomie.
Die Sicherheitsaspekte von HTTP-Clienthinweisen und die Sicherheitsaspekte der Zuverlässigkeit von Clienthinweisen gelten ebenfalls für diesen Vorschlag.
Verweise
- Spezifikationsentwurf
- Erläuterung
- Sec-CH-Prefers-Color-Scheme – Chrome-Statuseintrag
- Sec-CH-Prefers-Color-Scheme – Chromium-Fehler
- Sec-CH-Prefers-Reduced-Motion – Chrome-Statuseintrag
- Sec-CH-Prefers-Reduced-Motion – Chromium-Fehler
- WebKit-Thread
- Mozilla-Standpunkt zu Standards
- Client-Hinweise
- Zuverlässigkeit von Clienthinweisen
- Media Queries Level 5
- Strukturierte Header für HTTP
Danksagungen
Vielen Dank für das wertvolle Feedback und die Ratschläge von Yoav Weiss. Hero-Image von Tdadamemd auf Wikimedia Commons.