CSS color-mix()

Andrea Rossi
Adam Argyle

La funzione CSS color-mix() consente di mescolare i colori, in qualsiasi spazio colore supportato, direttamente dal tuo CSS.

Supporto dei browser

  • 111
  • 111
  • 113
  • 16.2

Fonte

Prima del giorno color-mix(), per scurire, schiarire o desaturare un colore, gli sviluppatori utilizzavano i preprocessori CSS o calc() sui canali di colore.

Prima con SCSS
.color-mixing-with-sass {
  /* Sass: equally mix red with white */
  --red-white-mix: color.mix(red, white);
}

Sass ha fatto un ottimo lavoro per rimanere al passo con le specifiche CSS dei colori. Tuttavia, non esisteva un modo reale per mescolare i colori in CSS. Per avvicinarti devi calcolare i valori dei colori parziali. Di seguito è riportato un esempio ridotto di come il CSS potrebbe simulare la combinazione di oggi:

Prima con HSL
.color-mixing-with-vanilla-css-before {
  --lightness: 50%;
  --red: hsl(0 50% var(--lightness));

  /* add "white" to red
     by adding 25% to the lightness channel
  */
  --lightred: hsl(0 50% calc(var(--lightness) + 25%);
}

color-mix() offre la possibilità di combinare i colori in CSS. Gli sviluppatori possono scegliere lo spazio colore in cui combinare e quanto deve essere predominante ogni colore.

Dopo
.color-mixing-after {
  /* equally mix red with white */
  --red-white-mix: color-mix(in oklab, red, white);

  /* equally mix red with white in srgb */
  --red-white-mix-srgb: color-mix(in srgb, red, white);
}

È quello che vogliamo. Flessibilità, potenza e API complete. Amala.

Combinazione di colori in CSS

CSS esiste in diversi spazi e gamma di colori e, per questo motivo, non è facoltativo specificare lo spazio colore per la combinazione. Inoltre, spazi colore diversi possono cambiare drasticamente i risultati di una combinazione, quindi conoscere gli effetti di uno spazio colore ti aiuterà a ottenere i risultati che cerchi.

Per un'introduzione interattiva, prova questo strumento color-mix(): - Esplora gli effetti di ogni spazio colore. - Esplora gli effetti dell'interpolazione delle tonalità quando combini in uno spazio colore cilindrico (lch, oklch, hsl e hwb). - Cambia i colori mescolati facendo clic su una delle due caselle colore in alto. - Usa il cursore per modificare il rapporto di miscelazione. - Generazione di color-mix() codice CSS disponibile in basso.

Combinazione dei vari spazi colore

Lo spazio colore predefinito per la combinazione (e i gradienti) è oklab. Fornisce risultati coerenti. Puoi specificare anche spazi colore alternativi, per personalizzare il mix in base alle tue esigenze.

Prendiamo ad esempio black e white. Lo spazio cromatico in cui si mescolano non farà una grande differenza, giusto? Sbagliato.

color-mix(in srgb, black, white);
color-mix(in srgb-linear, black, white);
color-mix(in lch, black, white);
color-mix(in oklch, black, white);
color-mix(in lab, black, white);
color-mix(in oklab, black, white);
color-mix(in xyz, black, white);
7 spazi colore (silizza, linear-sgsuite, lch, oklch, lab, oklab, xyz) mostrano ciascuno i loro risultati della miscelazione di bianco e nero. Vengono mostrate circa 5 diverse tonalità, a dimostrazione del fatto che ogni spazio colore si mescolerà anche con un grigio in modo diverso.
Prova la demo

Ha un grande effetto!

Prendiamo ad esempio blue e white per un altro esempio. L'ho scelto perché è un caso in cui la forma di uno spazio colore può influire sui risultati. In questo caso, la maggior parte degli spazi colore diventa viola durante il passaggio dal bianco al blu. Mostra anche come oklab sia uno spazio colore così affidabile per la miscelazione che la maggior parte delle persone si aspetta di combinare il bianco e il blu (non viola).

color-mix(in srgb, blue, white);
color-mix(in srgb-linear, blue, white);
color-mix(in lch, blue, white);
color-mix(in oklch, blue, white);
color-mix(in lab, blue, white);
color-mix(in oklab, blue, white);
color-mix(in xyz, blue, white);
7 spazi colore (silizza, linear-sgsuite, lch, oklch, lab, oklab, xyz) con risultati diversi. Molti sono rosa o viola, altri ancora blu.
Prova la demo

L'apprendimento degli effetti di uno spazio colore con color-mix() è un'ottima conoscenza anche per creare gradienti. La sintassi del colore 4 consente inoltre ai gradienti di specificare lo spazio colore, dove un gradiente mostra il mix su un'area dello spazio.

.black-to-white-gradient-in-each-space {
  --srgb: linear-gradient(to right in srgb, black, white);
  --srgb-linear: linear-gradient(to right in srgb-linear, black, white);
  --lab: linear-gradient(to right in lab, black, white);
  --oklab: linear-gradient(to right in oklab, black, white);
  --lch: linear-gradient(to right in lch, black, white);
  --oklch: linear-gradient(to right in oklch, black, white);
  --hsl: linear-gradient(to right in hsl, black, white);
  --hwb: linear-gradient(to right in hwb, black, white);
  --xyz: linear-gradient(to right in xyz, black, white);
  --xyz-d50: linear-gradient(to right in xyz-d50, black, white);
  --xzy-d65: linear-gradient(to right in xyz-d65, black, white);
}
Gradienti da nero a bianco in diversi spazi colore.
Prova la demo

Se ti stai chiedendo quale spazio colore è "il migliore", non c'è nessuno. Ecco perché ci sono così tante opzioni! Inoltre, non ci sarebbero nemmeno nuovi spazi colore (vedi oklch e oklab), se uno fosse "il migliore". Ogni spazio colore può avere un momento unico per risplendere ed essere la scelta giusta.

Ad esempio, se vuoi un risultato mix vivace, utilizza hsl o hwb. Nella demo seguente, due colori vivaci (magenta e lime) vengono mescolati tra loro e hsl e hwb producono entrambi un risultato vivace, mentre sgsuite e oklab producono colori insaturi.

La combinazione risulta come descritto nel paragrafo precedente.
Prova la demo

Se vuoi coerenza e finezza, utilizza oklab. Nella demo seguente, che mescola blu e nero, hsl e hwb producono colori eccessivamente brillanti e con variazioni di tonalità, mentre con sting{4/} e oklab si ottiene un blu più scuro.

La combinazione risulta come descritto nel paragrafo precedente.
Prova la demo

Trascorri cinque minuti nel color-mix() parco giochi, provando spazi e colori diversi e inizierai a farti un'idea dei vantaggi di ogni spazio. Inoltre, sono previste ulteriori indicazioni sugli spazi colore man mano che tutti ci adattiamo al loro potenziale nelle nostre interfacce utente.

Regolazione del metodo di interpolazione delle tonalità

Se hai scelto di combinare uno spazio colore cilindrico, ovvero qualsiasi spazio colore con un canale di tonalità h che accetta un angolo, puoi specificare se l'interpolazione deve essere shorter, longer, decreasing e increasing. Se vuoi saperne di più, parlerai bene in questa Guida ai colori per HD.

Ecco lo stesso esempio di mix dal blu al bianco, ma questa volta è solo negli spazi cilindrici con metodi di interpolazione delle tonalità diversi.

La combinazione risulta come descritto nel paragrafo precedente.
Prova la demo

Ecco un altro codepen che ho creato per visualizzare l'interpolazione delle tonalità, ma specifico per i gradienti. Credo che questo ti aiuterà a capire in che modo ogni spazio colore produce il proprio risultato misto quando viene specificata l'interpolazione delle tonalità, fai uno studio.

Combinazione con varie sintassi dei colori

Finora abbiamo utilizzato principalmente colori denominati CSS, come blue e white. La combinazione dei colori CSS è pronta per mescolare i colori di due spazi colore diversi. Questo è un altro motivo per cui è fondamentale specificare lo spazio colore per la combinazione, poiché imposta lo spazio comune per i casi in cui i due colori non si trovano nello stesso spazio.

color-mix(in oklch, hsl(200deg 50% 50%), color(display-p3 .5 0 .5));

Nell'esempio precedente, hsl e display-p3 verranno convertiti in oklch e poi misti. Piuttosto flessibile e flessibile.

Regolare i rapporti di miscelazione

Non è molto probabile che ogni volta che si mescolano parti uguali di ogni colore, come è stato mostrato finora la maggior parte degli esempi. Buone notizie, esiste una sintassi per articolare quanto di ogni colore dovrebbe essere visualizzato nel mix risultante.

Per iniziare questo argomento, ecco un esempio di mix che sono tutti equivalenti (e dalle specifiche):

.ratios-syntax-examples {
  /* omit the percentage for equal mixes */
  color: color-mix(in lch, purple, plum);
  color: color-mix(in lch, plum, purple);

  /* percentage can go on either side of the color */
  color: color-mix(in lch, purple 50%, plum 50%);
  color: color-mix(in lch, 50% purple, 50% plum);

  /* percentage on just one color? other color gets the remainder */
  color: color-mix(in lch, purple 50%, plum);
  color: color-mix(in lch, purple, plum 50%);

  /* percentages > 100% are equally clamped */
  color: color-mix(in lch, purple 80%, plum 80%);
  /* above mix is clamped to this */
  color: color-mix(in lch, purple 50%, plum 50%);
}

Trovo questi esempi per capire bene i casi limite. Il primo insieme di esempi mostra come il 50% non è obbligatorio, ma può essere specificato facoltativamente. L'ultimo esempio mostra un caso interessante per cui quando i rapporti superano il 100% se sommati, vengono ugualmente bloccati al 100% totale.

Tieni presente anche che se un solo colore specifica un rapporto, si presume che l'altro sia il restante 100%. Ecco qualche altro esempio per illustrare questo comportamento.

color-mix(in lch, purple 40%, plum) /* plum assigned 60% */
color-mix(in lch, purple, 60% plum) /* purple assigned 40% */
color-mix(in lch, purple 40%, plum 60%) /* no auto assignments */

Questi esempi illustrano due regole: 1. Quando i rapporti superano il 100%, vengono fissati e distribuiti equamente. 1. Quando viene fornita un'unica proporzione, l'altro colore viene impostato su 100 meno quel rapporto.

L'ultima regola è leggermente meno ovvia; cosa succede se vengono specificate le percentuali per entrambi i colori e la loro somma non arriva al 100%?

color-mix(in lch, purple 20%, plum 20%)

Questa combinazione di color-mix() genera trasparenza e 40%. Se la somma dei rapporti non raggiunge il 100%, il mix risultante non è opaco. Nessuno dei due colori sarà completamente miscelato.

Nidificazione di color-mix() in corso...

Come tutti i CSS, la nidificazione viene gestita bene e come previsto; le funzioni interne verranno risolte per prime e restituiranno i valori al contesto principale.

color-mix(in lch, purple 40%, color-mix(plum, white))

Puoi nidificare tutte le volte che vuoi per ottenere i risultati auspicati.

Creazione di una combinazione di colori chiari e scuri

Creiamo combinazioni di colori con color-mix().

Una combinazione di colori di base

Nel seguente CSS, vengono creati un tema chiaro e uno scuro in base a un colore esadecimale del brand. Il tema chiaro crea due colori di testo blu scuro e un colore della superficie di sfondo bianco molto chiaro. In una query supporti con preferenza scura, alle proprietà personalizzate vengono assegnati nuovi colori, in modo che lo sfondo sia scuro e i colori del testo siano chiari.

:root {
  /* a base brand color */
  --brand: #0af;

  /* very dark brand blue */
  --text1: color-mix(in oklab, var(--brand) 25%, black);
  --text2: color-mix(in oklab, var(--brand) 40%, black);

  /* very bright brand white */
  --surface1: color-mix(in oklab, var(--brand) 5%, white);
}

@media (prefers-color-scheme: dark) {
  :root {
    --text1: color-mix(in oklab, var(--brand) 15%, white);
    --text2: color-mix(in oklab, var(--brand) 40%, white);
    --surface1: color-mix(in oklab, var(--brand) 5%, black);
  }
}

Tutto questo si ottiene mescolando il bianco o il nero nel colore di un brand.

Combinazione di colori intermedia

Puoi fare un ulteriore passo avanti aggiungendo altri temi oltre ai temi chiaro e scuro. Nella demo seguente, le modifiche al gruppo di pulsanti di opzione aggiornano un attributo del tag HTML [color-scheme="auto"], che consente quindi ai selettori di applicare un tema a colori in modo condizionale.

Questa demo intermedia mostra anche una tecnica per la scelta dei temi dei colori in cui tutti i colori del tema sono elencati in :root. In questo modo, puoi vederli tutti insieme e modificarli facilmente. Successivamente, nel foglio di stile, puoi utilizzare le variabili man mano che vengono definite. In questo modo puoi evitare di cercare le manipolazioni dei colori nel foglio di stile, poiché sono tutte contenute nel blocco :root iniziale.

Casi d'uso più interessanti

Ana Tudor ha un'ottima demo con alcuni casi d'uso per lo studio:

Debug di color-mix() con DevTools

Chrome DevTools supporta perfettamente color-mix(). Riconosce ed evidenzia la sintassi, crea un'anteprima del mix accanto allo stile nel riquadro Stili e consente di selezionare colori alternativi.

Nei DevTools sarà simile a questo:

Uno screenshot di Chrome DevTools che controlla la sintassi dei color-mix.

Buon lavoro!