prefers-color-scheme: Ciao buio, amico mio

Sopravvalutato o necessario? Scopri tutto sulla modalità Buio e su come supportarla a vantaggio dei tuoi utenti.

Monitor per computer con schermo verde
Scherma verde (sorgente)

Abbiamo chiuso il cerchio con la modalità Buio. Agli albori del personal computing, la modalità Buio non era una questione di scelta, ma era un dato di fatto: i monitor dei computer CRT monocromatici funzionavano con fasci di elettroni sparavano su uno schermo fosforescente e il fosforo utilizzato nei primi CRT era verde. Poiché il testo era visualizzato in verde e il resto dello schermo era nero, questi modelli erano spesso indicati come schermi verdi.

Elaborazione di testi in nero su bianco
Dark-on-white (Fonte)

I CRT a colori introdotti successivamente mostravano più colori tramite l'uso di fosfori rossi, verdi e blu. Hanno creato il bianco attivando contemporaneamente tutti e tre i fosfori. Con l'avvento di sistemi di pubblicazione di desktop più sofisticati, WYSIWYG, si è diffusa l'idea di rendere il documento virtuale simile a un foglio di carta fisico.

Pagina web scura su sfondo bianco nel browser WorldWideWeb
Il browser WorldWideWeb (fonte)

È qui che è iniziata la tendenza del bianco su nero come design, che è stata poi trasferita al primo web basato su documenti. Il primo browser in assoluto, WorldWideWeb (ricorda, CSS non è stato ancora inventato), mostrava le pagine web in questo modo. Curiosità: il secondo browser in assoluto, il browser in modalità linea, un browser basato su terminale, era verde su scuro. Al giorno d'oggi, le pagine web e le app web sono in genere progettate con testo scuro su sfondo chiaro, un presupposto di base che è anche hardcoded negli stili delle stylesheet dello user agent, incluso quello di Chrome.

Smartphone usato mentre si è sdraiati a letto
Smartphone usato a letto (fonte: Unsplash)

I tempi dei CRT sono finiti da tempo. Il consumo e la creazione di contenuti si sono spostati sui dispositivi mobili che utilizzano schermi LCD con retroilluminazione o AMOLED a risparmio energetico. Computer, tablet e smartphone più piccoli e trasportabili hanno portato a nuovi pattern di utilizzo. Attività ricreative come la navigazione web, la programmazione per divertimento e i giochi di fascia alta spesso si svolgono dopo l'orario di lavoro in ambienti poco illuminati. Le persone usano i dispositivi sul letto anche di notte. Più persone usano i loro dispositivi al buio, più l'idea di tornare alle origini del chiaro su scuro diventa popolare.

Perché la modalità Buio

Modalità Buio per motivi estetici

Quando viene chiesto alle persone perché preferiscono o vogliono la modalità Buio, la risposta più comune è "è più facile per gli occhi", seguita da "è elegante e bella". Nella sua documentazione per gli sviluppatori relativa alla modalità Buio, Apple scrive esplicitamente: "La scelta di attivare un'interfaccia chiara o scura è estetica per la maggior parte degli utenti e potrebbe non essere correlata alle condizioni di illuminazione ambientale".

CloseView in Mac OS System 7 con
System 7 CloseView (Source)

La modalità Buio come strumento di accessibilità

Ci sono anche persone che in realtà hanno bisogno della modalità Buio e la utilizzano come altro strumento di accessibilità, ad esempio gli utenti ipovedenti. La prima occorrenza di uno strumento di accessibilità di questo tipo che ho trovato è la funzionalità CloseView di System 7, che aveva un pulsante di attivazione/disattivazione per Nero su bianco e Bianco su nero. Anche se il sistema 7 supportava i colori, l'interfaccia utente predefinita era ancora in bianco e nero.

Queste implementazioni basate sull'inversione hanno dimostrato le loro debolezze una volta introdotto il colore. La ricerca condotta da Szpiro et al. sugli strumenti di calcolo utilizzati dalle persone con disabilità visive ha dimostrato che a tutti gli utenti intervistati non piacevano le immagini invertite, ma molti preferivano il testo chiaro su sfondo scuro. Apple soddisfa questa preferenza dell'utente con una funzionalità chiamata Inversione smart, che inverte i colori sul display, ad eccezione di immagini, contenuti multimediali e alcune app che usano stili di colore scuro.

Una forma speciale di bassa visibilità è la sindrome da visione al computer, nota anche come affaticamento degli occhi da dispositivi digitali, che viene definita come "la combinazione di problemi agli occhi e alla vista associati all'uso di computer (inclusi computer, laptop e tablet) e altri display elettronici (ad es. smartphone e dispositivi di lettura elettronici)". È stato suggerito che l'uso di dispositivi elettronici da parte degli adolescenti, in particolare di notte, porti a un aumento del rischio di durata del sonno più breve, latenza dell'inizio del sonno più lunga e aumento della carenza di sonno. Inoltre, è stato ampiamente sperimentato che l'esposizione alla luce blu sia coinvolta nella regolazione del ritmo circodiano e del ciclo del sonno, e ambienti luminosi irregolari possono portare alla carenza di sonno, influenzando potenzialmente umore e attività, secondo una ricerca di Rosenfield. Per limitare questi effetti negativi, puoi ridurre la luce blu regolando la temperatura di colore del display tramite funzionalità come Night Shift di iOS o Luce notturna di Android, nonché evitando in generale luci luminose o irregolari tramite temi scuri o modalità scura.

Risparmio energetico in modalità Buio sugli schermi AMOLED

Infine, è noto che la modalità scura consente di risparmiare molto di energia sugli schermi AMOLED. I case study su Android incentrati su app Google popolari come YouTube hanno dimostrato che il risparmio energetico può arrivare fino al 60%. Il video di seguito fornisce ulteriori dettagli su questi case study e sul risparmio energetico per app.

Attivazione della modalità Buio nel sistema operativo

Ora che ho spiegato perché la modalità Buio è così importante per molti utenti, vediamo come puoi supportarla.

Impostazioni della modalità Buio di Android Q
Impostazioni del tema scuro di Android Q

I sistemi operativi che supportano una modalità scura o un tema scuro solitamente dispongono di un'opzione per attivarla nelle impostazioni. Su macOS X, si trova nella sezione Generale delle preferenze di sistema e si chiama Aspetto (screenshot), mentre su Windows 10 si trova nella sezione Colori e si chiama Scegli il tuo colore (screenshot). Su Android Q, puoi trovarlo in Display sotto forma di pulsante di attivazione/disattivazione Tema scuro (screenshot), mentre su iOS 13 puoi modificare l'Aspetto nella sezione Display e luminosità delle impostazioni (screenshot).

La query multimediale prefers-color-scheme

Un'ultima teoria prima di iniziare. Le query sui media consentono agli autori di testare e eseguire query sui valori o sulle funzionalità dell'agente utente o del dispositivo di visualizzazione, indipendentemente dal documento visualizzato. Vengono utilizzate nella regola @media CSS per applicare in modo condizionale gli stili a un documento e in vari altri contesti e linguaggi, come HTML e JavaScript. Media Queries 5 introduce le cosiddette funzionalità multimediali per le preferenze dell'utente, ovvero un modo per i siti di rilevare il modo preferito dall'utente per visualizzare i contenuti.

La funzionalità media prefers-color-scheme viene utilizzata per rilevare se l'utente ha richiesto di utilizzare un tema chiaro o scuro per la pagina. Funziona con i seguenti valori:

  • light: indica che l'utente ha informato il sistema che preferisce una pagina con tema chiaro (testo scuro su sfondo chiaro).
  • dark: indica che l'utente ha comunicato al sistema di preferire una pagina con tema scuro (testo chiaro su sfondo scuro).

Supporto della modalità Buio

Scoprire se la modalità Buio è supportata dal browser

Poiché la modalità Buio viene segnalata tramite una query multimediale, puoi facilmente verificare se il browser corrente supporta questa modalità controllando se la query multimediale prefers-color-scheme corrisponde. Nota che non includo alcun valore, ma controlli solo se la query supporti da sola corrisponde.

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

Al momento della stesura di questo articolo, prefers-color-scheme è supportato sia su computer che su dispositivi mobili (se disponibili) da Chrome e Edge a partire dalla versione 76, da Firefox a partire dalla versione 67 e da Safari a partire dalla versione 12.1 su macOS e dalla versione 13 su iOS. Per tutti gli altri browser, puoi consultare l'articolo Posso utilizzare le tabelle di assistenza.

Conoscere le preferenze di un utente al momento della richiesta

L'intestazione del suggerimento del client Sec-CH-Prefers-Color-Scheme consente ai siti di ottenere le preferenze della combinazione di colori dell'utente facoltativamente al momento della richiesta, consentendo ai server di incorporare il codice CSS corretto e quindi di evitare un tema cromatico errato.

Modalità Buio in pratica

Vediamo finalmente come funziona la modalità Buio nella pratica. Proprio come con Highlander, con la modalità Buio può esistere solo una: luce o Buio, ma mai entrambe. Perché lo menzioni? Perché questo fatto dovrebbe influire sulla strategia di caricamento. Non forzare gli utenti a scaricare CSS nel percorso di rendering critico per una modalità che non utilizzano al momento. Per ottimizzare la velocità di caricamento, ho quindi suddiviso il CSS per l'app di esempio che mostra i seguenti consigli pratici in tre parti per rimandare il CSS non critico:

  • style.css contenente regole generiche utilizzate universalmente sul sito.
  • dark.css che contiene solo le regole necessarie per la modalità Buio.
  • light.css che contiene solo le regole necessarie per la modalità Luce.

Strategia di caricamento

I due campi finali, light.css e dark.css, vengono caricati in modo condizionale con una query <link media>. Inizialmente, non tutti i browser supporteranno prefers-color-scheme (rilevabile utilizzando il pattern sopra), che gestisco in modo dinamico caricando il file light.css predefinito tramite un elemento <link rel="stylesheet"> inserito in modo condizionale in uno script in linea minuscolo (la modalità chiara è una scelta arbitraria, avrei potuto anche impostare la modalità scura come esperienza di riserva predefinita). Per evitare un lampo di contenuti senza stile, nascosto i contenuti della pagina fino al caricamento di light.css.

<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" />

Architettura del foglio di stile

Sfrutto al massimo le variabili CSS, in modo che il mio style.css generico sia, appunto, generico, e tutta la personalizzazione della modalità Luce o Buio avvenga negli altri due file dark.css e light.css. Di seguito puoi vedere un estratto degli stili effettivi, ma dovrebbe essere sufficiente per trasmettere l'idea generale. Dichiaro due variabili, -⁠-⁠color e -⁠-⁠background-color, che creano essenzialmente un tema di riferimento scuro su chiaro e chiaro su scuro.

/* 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);
}

Nel mio style.css, utilizzo queste variabili nella regola body { … }. Poiché sono definiti sulla pseudoclasse CSS :root, un selettore che in HTML rappresenta l'elemento <html> ed è identico al selettore html, tranne per il fatto che la sua specificità è superiore, vengono applicati in cascata, il che mi serve per dichiarare le variabili CSS globali.

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

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

Nell'esempio di codice riportato sopra, probabilmente avrai notato una proprietà color-scheme con il valore light dark separato da spazi.

In questo modo, il browser viene informato dei temi a colori supportati dalla mia app e può attivare varianti speciali dello stile foglio dell'agente utente, utile ad esempio per consentire al browser di visualizzare i campi dei moduli con uno sfondo scuro e un testo chiaro, regolare le barre di scorrimento o attivare un colore di evidenziazione basato sul tema. I dettagli esatti di color-scheme sono specificati in Livello 1 del modulo di aggiustamento dei colori CSS.

Tutto il resto è solo una questione di definizione delle variabili CSS per gli elementi importanti del mio sito. Organizzare semanticamente gli stili è molto utile quando si lavora con la modalità oscura. Ad esempio, anziché -⁠-⁠highlight-yellow, ti consigliamo di chiamare la variabile-⁠-⁠accent-color, poiché "giallo" potrebbe non essere giallo in modalità oscura o viceversa. Di seguito è riportato un esempio di altre variabili che utilizzo nel mio esempio.

/* 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);
}

Esempio completo

Nel seguente codice di incorporamento di Glitch, puoi vedere l'esempio completo che mette in pratica i concetti riportati sopra. Prova ad attivare e disattivare la modalità oscura nelle impostazioni del tuo sistema operativo e osserva la reazione della pagina.

Impatto del caricamento

Quando esamini questo esempio, puoi vedere perché carico dark.css e light.css tramite query sui media. Prova ad attivare/disattivare la modalità oscura e ricarica la pagina: i fogli di stile attualmente non corrispondenti vengono comunque caricati, ma con la priorità più bassa, in modo che non entrino mai in concorrenza con le risorse necessarie al sito in questo momento.

Diagramma di caricamento della rete che mostra come in modalità chiara il CSS della modalità Buio viene caricato con la priorità più bassa
Il sito in modalità chiara carica il CSS della modalità Buio con la priorità più bassa.
Diagramma di caricamento della rete che mostra come in modalità Buio il CSS della modalità Luce venga caricato con la priorità più bassa
Il sito in modalità Buio carica il CSS della modalità Luce con la priorità più bassa.
Diagramma del caricamento della rete che mostra come, nella modalità Luce predefinita, il CSS in modalità Buio venga caricato con la priorità più bassa
Il sito in modalità Luce predefinita su un browser che non supporta prefers-color-scheme carica il CSS della modalità Buio con la priorità più bassa.

Reazioni alle modifiche della modalità Buio

Come per qualsiasi altra modifica alle query supporti, le modifiche alla modalità Buio possono essere sottoscritte tramite JavaScript. Puoi utilizzarla, ad esempio, per cambiare dinamicamente il favicon di una pagina o il <meta name="theme-color"> che determina il colore della barra degli URL in Chrome. L'esempio completo riportato sopra mostra questo aspetto in azione. Per vedere le modifiche del colore del tema e della favicon, apri la demo in una scheda separata.

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

A partire da Chromium 93 e Safari 15, puoi regolare il colore in base a una query sui contenuti multimediali con l'attributo media dell'elemento di colore del tema meta. Verrà selezionata la prima corrispondenza. Ad esempio, potresti avere un colore per la modalità Luce e un altro per la modalità Buio. Al momento della stesura di questo documento, non puoi definirle nel manifest. Consulta il bug GitHub 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" />

Debug e test della modalità Buio

Emulazione di prefers-color-scheme in DevTools

Cambiare la combinazione di colori dell'intero sistema operativo può diventare molto fastidioso, pertanto ora gli strumenti per gli sviluppatori di Chrome ti consentono di emulare la combinazione di colori preferita dall'utente in modo che influisca solo sulla scheda attualmente visibile. Apri il menu dei comandi, inizia a digitare Rendering, esegui il comando Show Rendering e poi modifica l'opzione Emula la funzionalità dei contenuti multimediali CSS prefers-color-scheme.

Uno screenshot dell&#39;opzione &quot;Emula la funzionalità dei contenuti multimediali CSS prefers-color-scheme&quot; che si trova nella scheda Rendering di Chrome DevTools

Screenshot di prefers-color-scheme con Puppeteer

Puppeteer è una libreria Node.js che fornisce un'API di alto livello per controllare Chrome o Chromium tramite il protocollo DevTools. Con dark-mode-screenshot, forniamo un script Puppeteer che ti consente di creare screenshot delle tue pagine sia in modalità Buio che Luce. Puoi eseguire questo script una tantum oppure inserirlo nella suite di test di integrazione continua (CI).

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

Best practice per la modalità Buio

Evita il bianco puro

Un piccolo dettaglio che avrai notato è che non utilizzo il bianco puro. Invece, per evitare sfumature e sbordature sui contenuti scuri circostanti, scelgo un bianco leggermente più scuro. Qualcosa come rgb(250, 250, 250) funziona bene.

Ricromare e scurire le immagini fotografiche

Se confronti i due screenshot riportati di seguito, noterai che non solo il tema principale è cambiato da scuro in luce a luce su scuro, ma anche che l'immagine hero ha un aspetto leggermente diverso. La mia ricerca sugli utenti ha dimostrato che la maggior parte delle persone intervistate preferisce immagini leggermente meno brillanti e vivaci quando è attiva la modalità oscura. La chiamo ricolorazione.

L&#39;immagine hero è leggermente più scura in modalità Buio.
L'immagine hero è leggermente più scura in modalità Buio.
Immagine hero normale in modalità Luce.
Immagine hero normale in modalità chiara.

La ricolorazione può essere ottenuta tramite un filtro CSS sulle mie immagini. Utilizzo un selettore CSS che corrisponde a tutte le immagini che non hanno .svg nell'URL, l'idea è di poter assegnare alle immagini vettoriali (icone) un trattamento di ricolorazione diverso rispetto alle mie immagini (foto). Scopri di più nel prossimo paragrafo. Tieni presente che utilizzo di nuovo una variabile CSS, in modo da poter modificare in modo flessibile il filtro in un secondo momento.

Poiché la ricolorazione è necessaria solo in modalità Buio, ovvero quando dark.css è attivo, non sono presenti regole corrispondenti in light.css.

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

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

Personalizzazione dell'intensità della ricolorazione della modalità Buio con JavaScript

Non tutti sono uguali e le persone hanno esigenze diverse per quanto riguarda la modalità oscura. Se mantengo il metodo di ricolorazione descritto sopra, posso facilmente impostare l'intensità in scala di grigi come preferenza utente che posso modificare tramite JavaScript, e impostando un valore di 0%, posso anche disattivare completamente la ricolorazione. Tieni presente che document.documentElement fornisce un riferimento all'elemento radice del documento, ovvero lo stesso elemento a cui posso fare riferimento con la pseudo-classe CSS :root.

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

Invertire icone e grafica vettoriale

Per la grafica vettoriale, che nel mio caso sono usate come icone a cui faccio riferimento tramite gli elementi <img>, uso un metodo di ricolorazione diverso. Sebbene le ricerche abbiano dimostrato che le persone non amano l'inversione per le foto, questa funziona molto bene per la maggior parte delle icone. Anche in questo caso utilizzo le variabili CSS per determinare l'importo dell'inversione nello stato normale e in quello :hover.

Le icone vengono invertite in modalità Buio.
Le icone sono invertite in modalità Buio.
Icone normali in modalità Luce.
Icone normali in modalità Luce.

Nota come ancora una volta invertire le icone solo in dark.css ma non in light.css e come :hover aumenta l'intensità dell'inversione nei due casi per far apparire l'icona leggermente più scura o leggermente più luminosa, a seconda della modalità selezionata dall'utente.

/* 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);
}

Utilizza currentColor per gli SVG in linea

Per le immagini SVG incorporate, anziché utilizzare i filtri di inversione, puoi sfruttare la parola chiave CSS currentColor che rappresenta il valore della proprietà color di un elemento. In questo modo puoi utilizzare il valore color nelle proprietà che non lo ricevono per impostazione predefinita. Se currentColor viene utilizzato come valore degli attributi SVG fill o stroke, viene invece preso il valore ereditato della proprietà color. Ancora meglio: funziona anche per <svg><use href="…"></svg>, quindi puoi avere risorse separate e currentColor verrà comunque applicato nel contesto. Tieni presente che questa opzione funziona solo per gli SVG in linea o <use href="…">, ma non per gli SVG a cui viene fatto riferimento come src di un'immagine o in qualche modo tramite CSS. Come puoi vedere, consulta la demo di seguito.

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

Transizioni fluide tra le modalità

Il passaggio dalla modalità Buio alla modalità Luce o viceversa può essere reso più fluido grazie al fatto che sia color sia background-color sono proprietà CSS animabili. Per creare l'animazione, è sufficiente dichiarare due transition per le due proprietà. L'esempio seguente illustra l'idea generale. Puoi sperimentarla dal vivo nella demo.

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);
}

Direzione artistica con modalità Buio

Sebbene per motivi di rendimento del caricamento in generale consigliamo di utilizzare esclusivamente prefers-color-scheme nell'attributo media degli elementi <link> (anziché in linea negli stili), esistono situazioni in cui potresti voler utilizzare prefers-color-scheme direttamente in linea nel codice HTML. La direzione artistica è una situazione del genere. Sul web, la direzione artistica si occupa dell'aspetto visivo complessivo di una pagina e del modo in cui comunica visivamente, stimola gli umori, mette a confronto le funzionalità e si rivolge psicologicamente a un pubblico di destinazione.

Con la modalità Buio, è compito del designer decidere quale sia l'immagine migliore per una determinata modalità e se la ricolorazione delle immagini non sia sufficientemente buona. Se utilizzato con l'elemento <picture>, il <source> dell'immagine da mostrare può essere reso dipendente dall'attributo media. Nell'esempio seguente, mostro l'emisfero occidentale per la modalità Buio e l'emisfero orientale per la modalità Luce o, se non viene specificata alcuna preferenza, viene utilizzato l'emisfero orientale in tutti gli altri casi. Questo è ovviamente solo a scopo illustrativo. Attiva o disattiva la modalità Buio sul dispositivo per vedere la differenza.

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

Modalità Buio, ma con la possibilità di disattivarla

Come indicato nella precedente sezione Perché la modalità Buio, la modalità Buio è una scelta estetica per la maggior parte degli utenti. Di conseguenza, alcuni utenti potrebbero preferire avere l'interfaccia utente del sistema operativo in modalità Buio, ma preferiscono comunque visualizzare le pagine web nel modo in cui sono abituati a vederle. Un ottimo modello è inizialmente rispettare l'indicatore inviato dal browser tramiteprefers-color-scheme, ma poi, facoltativamente, consentire agli utenti di ignorare l'impostazione a livello di sistema.

Elemento personalizzato <dark-mode-toggle>

Puoi ovviamente creare il codice autonomamente, ma puoi anche utilizzare un elemento personalizzato (componente web) predefinito che ho creato appositamente per questo scopo. Si chiama <dark-mode-toggle> e aggiunge alla pagina un pulsante di attivazione/disattivazione (modalità Buio: on/off) o un selettore di temi (tema: chiaro/scuro) che puoi personalizzare completamente. La demo di seguito mostra l'elemento in azione (e io l'ho anche 🤫 inserito silenziosamente in tutti gli altri esempi sopra).

<dark-mode-toggle
  legend="Theme Switcher"
  appearance="switch"
  dark="Dark"
  light="Light"
  remember="Remember this"
></dark-mode-toggle>
attiva/disattiva modalità Buio in modalità Luce.
<dark-mode-toggle> in modalità Luce.
dark-mode-toggle in modalità Luce.
<dark-mode-toggle> in modalità Buio.

Prova a fare clic o toccare i controlli della modalità Buio nell'angolo in alto a destra nella demo in basso. Se selezioni la casella di controllo nel terzo e nel quarto controllo, scopri come la selezione della modalità viene memorizzata anche quando ricarichi la pagina. Ciò consente ai visitatori di mantenere il sistema operativo in modalità Buio, ma di godersi il sito in modalità Luce o viceversa.

Conclusioni

Lavorare con la modalità Buio e supportarla è divertente e apre nuove strade di progettazione. Per alcuni visitatori può fare la differenza tra non essere in grado di gestire il tuo sito e essere un utente soddisfatto. Esistono alcuni problemi e sono necessari test accurati, ma la modalità oscura è sicuramente un'ottima opportunità per dimostrare di tenere a tutti i tuoi utenti. Le best practice menzionate in questo post e gli elementi di assistenza come l'elemento personalizzato <dark-mode-toggle> dovrebbero darti la certezza di poter creare un'esperienza in modalità Buio straordinaria. Fammi sapere su Twitter cosa crei e se questo post ti è stato utile o anche suggerimenti per migliorarlo. Grazie per l'attenzione. 🌒

Risorse per la query multimediale prefers-color-scheme:

Risorse per il meta tag color-scheme e la proprietà CSS:

Link alla modalità Buio generali:

Articoli di ricerca di base per questo post:

Ringraziamenti

La funzionalità dei contenuti multimediali prefers-color-scheme, la proprietà CSS color-scheme e il metatag correlato sono stati implementati da 👏 Rune Lillesveen. Rune è anche co-editor delle specifiche CSS Color Enrollment Module Level 1. Ringraziamo Lukasz Zbylut, Rowan Merewood, Chirag Desai e Rob Dodson per le loro recensioni approfondite su questo articolo. La strategia di caricamento è nata dalla mente di Jake Archibald. Emilio Cobos Álvarez mi ha indicato il metodo di rilevamento prefers-color-scheme corretto. Il suggerimento con gli SVG e currentColor a cui si fa riferimento proviene da Timothy Hatcher. Infine, ringrazio i numerosi partecipanti anonimi dei vari studi sugli utenti che hanno contribuito a definire i consigli riportati in questo articolo. Immagine hero di Nathan Anderson.