color-mix()
Baseline 2023Newly available
Since May 2023, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.
Die color-mix()
Funktionsnotation nimmt zwei <color>
Werte und gibt das Ergebnis der Mischung dieser Werte in einem gegebenen Farbraum in einer bestimmten Menge zurück.
Die Wahl des richtigen Farbraums ist entscheidend für das gewünschte Ergebnis. Unterschiedliche Farbräume können, abhängig vom Anwendungsfall der Interpolation, geeigneter sein.
- Wenn das Ergebnis des physikalischen Mischens zweier farbiger Lichter gewünscht ist, ist der CIE XYZ oder srgb-linear Farbraum geeignet, da sie linear in der Lichtintensität sind.
- Wenn Farben gleichmäßig verteilt dargestellt werden sollen (wie in einem Verlauf), ist der Oklab Farbraum (und der ältere Lab) geeignet, da sie so entworfen wurden, dass sie wahrnehmungsgleichmäßig sind.
- Wenn es darum geht, ein Ausgrauen bei der Farbmischung zu vermeiden, d.h. den Farbton während des Übergangs zu maximieren, funktionieren Oklch (und der ältere LCH) gut.
- Verwenden Sie sRGB nur, wenn die Verhaltensweise eines bestimmten Geräts oder einer bestimmten Software, die sRGB verwendet, angepasst werden muss. Der sRGB Farbraum ist weder linear im Licht noch wahrnehmungsgleichmäßig und erzeugt schlechtere Ergebnisse, wie z.B. übermäßig dunkle oder gräuliche Mischungen.
Syntax
/* color-mix(in <polar-color-space>, <color>, <color> <percentage>) */
color-mix(in hsl, hsl(200 50 80), coral 80%)
/* color-mix(in <polar-color-space> <hue-interpolation-method>, <color>, <color>) */
color-mix(in lch longer hue, hsl(200deg 50% 80%), coral)
/* color-mix(in <rectangular-color-space>, <color>, <color>) */
color-mix(in srgb, plum, #f00)
/* color-mix(in <rectangular-color-space>, <color> <percentage>, <color> <percentage> */
color-mix(in lab, plum 60%, #f00 50%)
/* color-mix(in <custom-color-space>, <color>, <color>) */
color-mix(in --swop5c, red, blue)
Werte
Funktionsnotation: color-mix(<color-interpolation-method>, <color>[<percentage>], <color>[<percentage>])
<color-interpolation-method>
-
Gibt an, welche Interpolationsmethode zum Mischen der Farben verwendet werden soll. Sie besteht aus dem Schlüsselwort
in
, gefolgt vom Namen eines Farbraums. Die folgenden drei Typen sind verfügbar:<rectangular-color-space>
: `srgb`, `srgb-linear`, `display-p3`, `a98-rgb`, `prophoto-rgb`, `rec2020`, `lab`, `oklab`, `xyz`, `xyz-d50`, und `xyz-d65`.<polar-color-space>
:hsl
,hwb
,lch
, undoklch
.- benutzerdefinierter Farbraum:
<dashed-ident>
, der auf ein benutzerdefiniertes @color profile verweist
Hinweis: Wenn Browser
@color-profile
unterstützen, können benutzerdefinierte Farbräume unterstützt werden. Derzeit muss der Farbraum einer der verfügbaren Farbräume sein, die unter formal_syntax aufgelistet sind. <color>
-
Ein
<color>
Wert zum Mischen. <percentage>
Optional-
Ein
<percentage>
Wert zwischen0%
und100%
, der die Menge der entsprechenden zu mischenden Farbe angibt.Die beiden Farbprozentsätze (wir bezeichnen sie als
p1
undp2
) werden wie folgt normalisiert:- Wenn sowohl
p1
als auchp2
weggelassen werden, dann giltp1 = p2 = 50%
. - Wenn
p1
weggelassen wird, dann giltp1 = 100% - p2
. - Wenn
p2
weggelassen wird, dann giltp2 = 100% - p1
. - Wenn
p1 = p2 = 0%
ist, ist die Funktion ungültig. - Wenn
p1 + p2 ≠ 100%
ist, dann giltp1' = p1 / (p1 + p2)
undp2' = p2 / (p1 + p2)
, wobeip1'
undp2'
die Normalisierungsergebnisse sind.- Wenn
p1 + p2 < 100%
ist, wird dem resultierenden Farbton ein Alphamultiplikator vonp1 + p2
zugewendet. Dies ist ähnlich wie das Mischen mittransparent
, mit einem Prozentsatzpt = 100% - p1 - p2
.
- Wenn
- Wenn sowohl
Formale Syntax
<color-mix()> =
color-mix( <color-interpolation-method> , [ <color> && <percentage [0,100]>? ]#{2} )
<color-interpolation-method> =
in [ <rectangular-color-space> | <polar-color-space> <hue-interpolation-method>? ]
<rectangular-color-space> =
srgb |
srgb-linear |
display-p3 |
a98-rgb |
prophoto-rgb |
rec2020 |
lab |
oklab |
xyz |
xyz-d50 |
xyz-d65
<polar-color-space> =
hsl |
hwb |
lch |
oklch
<hue-interpolation-method> =
[ shorter | longer | increasing | decreasing ] hue
Beispiele
Farb-Mixer
Das folgende Live-Demo mischt zwei Farben, color-one
und color-two
, unter Verwendung der color-mix()
Funktion. Die Ausgangsfarben werden außen angezeigt, und die gemischte Farbe wird in der Mitte angezeigt. Sie können die Farben ändern, indem Sie darauf klicken und eine neue Farbe mit dem resultierenden Farbwähler auswählen. Sie können auch den Prozentsatz jeder in die Mischung einbezogenen Farbe mit Schiebereglern ändern und den Farbraum über das Dropdown-Menü ändern.
Mischen zweier Farben
Dieses Beispiel demonstriert das Mischen zweier Farben, Blau #a71e14
in unterschiedlichen Prozentsätzen und Weiß ohne angegebenen Prozentsatz. Je höher der Prozentsatz von #a71e14
gemischt wird, desto mehr Blau und weniger Weiß zeigt die Ausgabefarbe.
HTML
<ul>
<li>0%</li>
<li>25%</li>
<li>50%</li>
<li>75%</li>
<li>100%</li>
<li></li>
</ul>
CSS
Die color-mix()
Funktion wird verwendet, um zunehmende Prozentsätze von Blau hinzuzufügen, bis zu 100%. Das 6. <li>
enthält keinen Prozentsatz für eine der Farben.
li:nth-child(1) {
background-color: color-mix(in oklab, #a71e14 0%, white);
}
li:nth-child(2) {
background-color: color-mix(in oklab, #a71e14 25%, white);
}
li:nth-child(3) {
background-color: color-mix(in oklab, #a71e14 50%, white);
}
li:nth-child(4) {
background-color: color-mix(in oklab, #a71e14 75%, white);
}
li:nth-child(5) {
background-color: color-mix(in oklab, #a71e14 100%, white);
}
li:nth-child(6) {
background-color: color-mix(in oklab, #a71e14, white);
}
Ergebnis
Der Gesamtwert beider Farben in einer color-mix()
Funktion beträgt 100%, selbst wenn die vom Entwickler festgelegten Werte insgesamt nicht 100% betragen. In diesem Beispiel, da nur einer Farbe ein Prozentsatz zugewiesen wurde, erhält die andere Farbe implizit einen Prozentsatzwert, so dass die Gesamtsumme 100% ergibt. Im letzten <li>
, wo keiner der Farben ein Prozentsatz zugewiesen ist, erhalten beide standardmäßig 50%.
Transparenz hinzufügen
Dieses Beispiel demonstriert die Verwendung der color-mix()
Funktion, um einer Farbe Transparenz hinzuzufügen, indem jede Farbe mit transparent
gemischt wird.
HTML
<ul>
<li>0%</li>
<li>25%</li>
<li>50%</li>
<li>75%</li>
<li>100%</li>
<li></li>
</ul>
CSS
Die color-mix()
Funktion wird verwendet, um zunehmende Prozentsätze von red
hinzuzufügen, das mit einer benutzerdefinierten Eigenschaft namens --base
deklariert wird, die in :root
definiert ist. Das 6. <li>
enthält keinen Prozentsatz, was zu einer Ausgabefarbe führt, die halb so deckend ist wie die --base
Farbe. Wir fügen einen gestreiften Hintergrund auf das <ul>
hinzu, um die Transparenz sichtbar zu machen.
:root {
--base: red;
}
ul {
background: repeating-linear-gradient(
45deg,
chocolate 0px 2px,
white 2px 12px
);
}
li:nth-child(1) {
background-color: color-mix(in srgb, var(--base) 0%, transparent);
}
li:nth-child(2) {
background-color: color-mix(in srgb, var(--base) 25%, transparent);
}
li:nth-child(3) {
background-color: color-mix(in srgb, var(--base) 50%, transparent);
}
li:nth-child(4) {
background-color: color-mix(in srgb, var(--base) 75%, transparent);
}
li:nth-child(5) {
background-color: color-mix(in srgb, var(--base) 100%, transparent);
}
li:nth-child(6) {
background-color: color-mix(in srgb, var(--base), transparent);
}
Ergebnis
Auf diese Weise kann die Funktion color-mix()
verwendet werden, um jeder Farbe Transparenz hinzuzufügen, auch wenn die Farbe bereits nicht deckend ist (mit einem Alphakanalwert < 1). Jedoch kann color-mix()
nicht verwendet werden, um eine halbtransparente Farbe vollständig deckend zu machen. Verwenden Sie hierzu eine relative Farbe mit einer CSS Farbfunktion. Relative Farben können den Wert jedes Farbkanals ändern, einschließlich der Erhöhung des Alphakanals einer Farbe, um die Farbe vollständig deckend zu machen.
Verwendung der Farbtoninterpolation in color-mix()
Dieses Beispiel demonstriert die verfügbaren Farbtoninterpolationsmethoden der color-mix()
Funktion. Bei der Verwendung der Farbton Interpolation liegt der resultierende Farbton zwischen den Farbtonwerten der zwei gemischten Farben. Der Wert wird je nach Weg um das Farbrad unterschiedlich sein.
Für weitere Informationen siehe <hue-interpolation-method>
.
CSS
Die shorter hue
Interpolationsmethode nimmt den kürzeren Weg um das Farbrad, während die longer hue
Interpolationsmethode den längeren Weg nimmt. Mit increasing hue
beginnt der Weg mit zunehmenden Werten. Mit decreasing hue
verringert sich der Wert. Wir mischen zwei <named-color>
Werte, um eine Reihe von lch()
Zwischenfarben zu erzeugen, die sich basierend auf dem gewählten Weg um das Farbrad unterscheiden. Die gemischten Farben umfassen rot
, blau
und gelb
mit LCH Farbtonwerten von ungefähr 41deg, 301deg und 100deg.
Um Code Redundanzen zu reduzieren, haben wir CSS benutzerdefinierte Eigenschaften für beide Farben und für die Interpolationsmethode verwendet, wobei unterschiedliche Werte auf jedes <ul>
gesetzt wurden.
ul:nth-of-type(1) {
--distance: longer; /* 52 degree hue increments */
--base: red;
--mixin: blue;
}
ul:nth-of-type(2) {
/* 20 degree hue decrements */
--distance: shorter;
--base: red;
--mixin: blue;
}
ul:nth-of-type(3) {
/* 40 degree hue increments */
--distance: increasing;
--base: yellow;
--mixin: blue;
}
ul:nth-of-type(4) {
/* 32 degree hue decrements */
--distance: decreasing;
--base: yellow;
--mixin: blue;
}
li:nth-child(1) {
background-color: color-mix(
in lch var(--distance) hue,
var(--base) 100%,
var(--mixin)
);
}
li:nth-child(2) {
background-color: color-mix(
in lch var(--distance) hue,
var(--base) 80%,
var(--mixin)
);
}
li:nth-child(3) {
background-color: color-mix(
in lch var(--distance) hue,
var(--base) 60%,
var(--mixin)
);
}
li:nth-child(4) {
background-color: color-mix(
in lch var(--distance) hue,
var(--base) 40%,
var(--mixin)
);
}
li:nth-child(5) {
background-color: color-mix(
in lch var(--distance) hue,
var(--base) 20%,
var(--mixin)
);
}
li:nth-child(6) {
background-color: color-mix(
in lch var(--distance) hue,
var(--base) 0%,
var(--mixin)
);
}
Ergebnis
Mit longer hue
werden die In- oder Dekremente zwischen den Farben immer gleich oder größer sein als bei Verwendung von shorter hue
. Verwenden Sie increasing hue
oder decreasing hue
wenn die Richtung der Änderung des Farbtonwertes wichtiger ist als die Länge zwischen den Werten.
Spezifikationen
Specification |
---|
CSS Color Module Level 5 # color-mix |