Un insieme di intestazioni di suggerimenti client consente ai siti di ottenere le preferenze multimediali dell'utente, se necessario, al momento della richiesta, consentendo ai server di inserire in linea il CSS corretto per motivi di prestazioni.
Le query supporti CSS e, in particolare, le funzionalità dei media per le preferenze dell'utente come prefers-color-scheme
o prefers-reduced-motion
, hanno un potenziale impatto significativo sulla quantità di CSS che deve essere inviata da una pagina e sull'esperienza che l'utente avrà al caricamento della pagina.
Se ci concentriamo su prefers-color-scheme
, ma evidenziando che il ragionamento vale anche per altre funzionalità dei contenuti multimediali per le preferenze dell'utente, è buona prassi non caricare il CSS per la particolare combinazione di colori non corrispondente nel percorso di rendering critico, ma caricare inizialmente solo il CSS attualmente pertinente. Un modo per farlo è tramite <link media>
.
Tuttavia, i siti ad alto traffico come la Ricerca Google che vogliono rispettare le funzionalità dei contenuti multimediali delle preferenze degli utenti come prefers-color-scheme
e che inseriscono il CSS in linea per motivi di rendimento devono conoscere la combinazione di colori preferita (o altre funzionalità dei contenuti multimediali delle preferenze degli utenti, rispettivamente) idealmente al momento della richiesta, in modo che il payload HTML iniziale contenga già il CSS corretto in linea.
Inoltre, in particolare per prefers-color-scheme
, i siti vogliono evitare un
lampo di tema cromatico impreciso.
Le intestazioni degli indicatori client Sec-CH-Prefers-Color-Scheme
e Sec-CH-Prefers-Reduced-Motion
sono le prime di una
serie di intestazioni degli indicatori client per le funzionalità dei contenuti multimediali in base alle preferenze dell'utente
che mirano a risolvere questo problema.
Informazioni di base sui suggerimenti client
HTTP Client Hints definisce un'intestazione di risposta Accept-CH
che i server possono utilizzare per pubblicizzare il proprio utilizzo delle intestazioni di richiesta per la negoziazione proattiva dei contenuti, colloquialmente nota come client hint. La proposta di intestazioni degli indicatori client per le funzionalità multimediali delle preferenze utente definisce un insieme di indicatori client finalizzati a trasmettere le funzionalità multimediali delle preferenze utente. Questi suggerimenti per i client sono denominati in base alla funzionalità multimediale delle preferenze dell'utente a cui si riferiscono.
Ad esempio, la combinazione di colori attualmente preferita in base a prefers-color-scheme
viene segnalata tramite il
suggerimento client Sec-CH-Prefers-Color-Scheme
, che ha un nome appropriato.
Informazioni sui suggerimenti client critici
È probabile che gli indicatori client proposti in Intestazioni degli indicatori client per le funzionalità multimediali delle preferenze utente siano utilizzati più comunemente come Indicatori client critici. I Client Hints critici sono Client Hints che modificano in modo significativo la risorsa risultante. Questa risorsa deve essere recuperata in modo coerente durante i caricamenti di pagina (incluso il caricamento iniziale della pagina) per evitare transizioni visibili agli utenti.
Sintassi del suggerimento client
Le funzionalità multimediali delle preferenze utente sono costituite da un nome (ad esempio prefers-reduced-motion
) e da valori consentiti (ad esempio no-preference
o reduce
). Ogni campo dell'intestazione dell'apposito indizio del client è rappresentato come oggetto Intestazioni strutturate per HTTP contenente un elemento il cui valore è una stringa. Ad esempio, per comunicare che l'utente preferisce un tema scuro e una riduzione dei movimenti, i suggerimenti del cliente sono come nell'esempio riportato di seguito.
GET / HTTP/2
Host: example.com
Sec-CH-Prefers-Color-Scheme: "dark"
Sec-CH-Prefers-Reduced-Motion: "reduce"
L'equivalente CSS delle informazioni trasmesse nei suggerimenti per i clienti riportati sopra è
@media (prefers-color-scheme: dark) {}
e @media (prefers-reduced-motion: reduce) {}
rispettivamente.
Elenco completo dei suggerimenti per i clienti
L'elenco dei suggerimenti del client è modellato in base alle funzionalità dei contenuti multimediali per le preferenze dell'utente in Livello 5 delle query sui contenuti multimediali.
Suggerimento client | Valori consentiti | Funzionalità multimediale corrispondente per le preferenze utente |
---|---|---|
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 |
Supporto browser
L'intestazione dell'indicazione client Sec-CH-Prefers-Color-Scheme
è supportata in Chromium 93.
L'intestazione dell'indicazione client Sec-CH-Prefers-Reduced-Motion
è supportata in Chromium 108.
I feedback di altri fornitori, ovvero di WebKit e Mozilla, sono in attesa.
Demo di Sec-CH-Prefers-Color-Scheme
Prova la demo in Chromium 93 e osserva come il CSS in linea cambia in base alla combinazione di colori preferita dall'utente.
Demo di Sec-CH-Prefers-Reduced-Motion
Prova la demo in Chromium 108 e osserva come il CSS in linea cambia in base alle preferenze di movimento dell'utente.
Come funziona
- Il client invia una richiesta iniziale al server.
bash GET / HTTP/2 Host: example.com
- Il server risponde, comunicando al client tramite
Accept-CH
che accetta iSec-CH-Prefers-Color-Scheme
e iSec-CH-Prefers-Contrast
Client Hints, di cui, come daCritical-CH
, consideraSec-CH-Prefers-Color-Scheme
un Client Hint critico in base al quale varia anche la risposta, come indicato daVary
.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
- Il client riprova quindi a inviare la richiesta, comunicando al server tramite
Sec-CH-Prefers-Color-Scheme
di avere una preferenza dell'utente per i contenuti con tema scuro.bash GET / HTTP/2 Host: example.com Sec-CH-Prefers-Color-Scheme: "dark"
- Il server può quindi personalizzare la risposta in base alle preferenze del cliente e, ad esempio, inserire il CSS responsabile del tema scuro nel corpo della risposta.
Esempio di Node.js
L'esempio di Node.js riportato di seguito, scritto per il popolare framework Express.js, mostra come potrebbe essere la gestione dell'intestazione dell'indicazione client Sec-CH-Prefers-Color-Scheme
in pratica.
Questo codice è ciò che alimenta la demo qui sopra.
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));
});
Considerazioni su privacy e sicurezza
Il team di Chromium ha progettato e implementato le intestazioni Client Hints per le funzionalità multimediali delle preferenze utente utilizzando i principi fondamentali definiti in Controllo dell'accesso alle funzionalità di piattaforme web efficaci, tra cui il controllo utente, la trasparenza e l'ergonomia.
Anche a questa proposta si applicano le considerazioni sulla sicurezza degli indicatori client HTTP e le considerazioni sulla sicurezza dell'affidabilità degli indicatori client.
Riferimenti
- Bozza delle specifiche
- Spiegazione
- Sec-CH-Prefers-Color-Scheme - Voce dello stato di Chrome
- Sec-CH-Prefers-Color-Scheme - Bug di Chromium
- Sec-CH-Prefers-Reduced-Motion - voce dello stato di Chrome
- Sec-CH-Prefers-Reduced-Motion - Bug di Chromium
- Thread WebKit
- Posizione di Mozilla in merito agli standard
- Suggerimenti client
- Affidabilità degli indicatori client
- Livello 5 delle query sui media
- Intestazioni strutturate per HTTP
Ringraziamenti
Grazie mille per i preziosi feedback e consigli di Yoav Weiss. Immagine hero di Tdadamemd su Wikimedia Commons.