color-mix()

Baseline 2023

Newly 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 funktionale Notation color-mix() nimmt zwei <color>-Werte und gibt das Ergebnis ihrer Mischung in einem gegebenen Farbraum mit einer gegebenen Menge zurück.

Syntax

css
/* 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

Funktionale Notation: color-mix(<color-interpolation-method>, <color>[<percentage>], <color>[<percentage>])

<color-interpolation-method>

Gibt an, welche Interpolationsmethode verwendet werden soll, um die Farben zu mischen. Sie besteht aus dem Schlüsselwort in gefolgt von einem Farbraum-Namen. Die folgenden drei Typen sind verfügbar:

Hinweis: Wenn Browser @color-profile unterstützen, können benutzerdefinierte Farbräume unterstützt werden. Derzeit muss der Farbraum einer der im formalen Syntax aufgelisteten zugänglichen Farbräume sein.

<color>

Ein <color>-Wert zum Mischen.

<percentage> Optional

Ein <percentage>-Wert zwischen 0% und 100%, der die Menge der entsprechenden zu mischenden Farbe angibt.

Die zwei Farbprozentsätze (wir nennen sie p1 und p2) werden wie folgt normalisiert:

  • Wenn sowohl p1 als auch p2 weggelassen werden, dann p1 = p2 = 50%.
  • Wenn p1 weggelassen wird, dann p1 = 100% - p2.
  • Wenn p2 weggelassen wird, dann p2 = 100% - p1.
  • Wenn p1 = p2 = 0%, ist die Funktion ungültig.
  • Wenn p1 + p2 ≠ 100%, dann p1' = p1 / (p1 + p2) und p2' = p2 / (p1 + p2), wobei p1' und p2' die Normalisierungsergebnisse sind.
    • Wenn p1 + p2 < 100%, dann wird ein Alphamultiplikator von p1 + p2 auf die resultierende Farbe angewendet. Dies ist ähnlich wie das Mischen von transparent, mit dem Prozentsatz pt = 100% - p1 - p2.

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-Mischer

Das folgende Live-Demo mischt zwei Farben, color-one und color-two, mithilfe der Funktion color-mix(). Die Ausgangsfarben werden außen dargestellt, 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 Farbe im Mix mit den Schiebereglern ändern und den Farbraum im Dropdown-Menü auswählen.

Mischen zweier Farben

Dieses Beispiel zeigt 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ß wird in der Ausgabefarbe sein.

HTML

html
<ul>
  <li>0%</li>
  <li>25%</li>
  <li>50%</li>
  <li>75%</li>
  <li>100%</li>
  <li></li>
</ul>

CSS

Die Funktion color-mix() wird verwendet, um zunehmende Prozentsätze von Blau bis zu 100% hinzuzufügen. Das 6. <li> enthält keinen Prozentsatz für eine der beiden Farben.

css
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%, auch wenn die vom Entwickler festgelegten Werte nicht insgesamt 100% ergeben. In diesem Beispiel, da nur einer Farbe ein Prozentsatz zugeordnet ist, erhält die andere Farbe implizit einen Prozentsatzwert, damit die kombinierte Gesamtsumme 100% ergibt. Im letzten <li>, wo keiner der Farben ein Prozentsatz zugewiesen ist, nehmen beide standardmäßig 50% an.

Hinzufügen von Transparenz

Dieses Beispiel zeigt, wie die Funktion color-mix() verwendet wird, um einer Farbe Transparenz hinzuzufügen, indem jede Farbe mit transparent gemischt wird.

HTML

html
<ul>
  <li>0%</li>
  <li>25%</li>
  <li>50%</li>
  <li>75%</li>
  <li>100%</li>
  <li></li>
</ul>

CSS

Die Funktion color-mix() wird verwendet, um zunehmende Prozentsätze von red hinzuzufügen, das mit einer benutzerdefinierten Eigenschaft namens --base deklariert und im :root definiert wird. Das 6. <li> enthält keinen Prozentsatz und erzeugt eine Ausgabefarbe, die halb so opak wie die --base-Farbe ist. Wir fügen einen gestreiften Hintergrund auf dem <ul> hinzu, um die Transparenz sichtbar zu machen.

css
: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, selbst wenn die Farbe bereits nicht opak ist (mit einem Alpha-Kanal-Wert < 1). Allerdings kann color-mix() nicht verwendet werden, um eine halbtransparente Farbe vollständig opak zu machen. Dafür verwenden Sie eine relative Color mit einer CSS-Farbfunktion. Relative Farben können den Wert eines jeden Farbkanals ändern, einschließlich der Erhöhung eines Alpha-Kanal einer Farbe, um die Farbe vollständig opak zu machen.

Verwenden der Farbton-Interpolation in color-mix()

Dieses Beispiel zeigt die verfügbaren Farbton-Interpolationsmethoden für die Funktion color-mix(). Bei Verwendung der Farbton-Interpolation liegt der resultierende Farbton zwischen den Farbtonwerten der beiden gemischten Farben. Der Wert wird sich unterscheiden, je nachdem welche Route um den Farbkreis genommen wird.

Für weitere Informationen siehe <hue-interpolation-method>.

CSS

Die shorter hue Interpolationsmethode nimmt die kürzere Route um den Farbkreis, während die longer hue Interpolationsmethode die längere Route nimmt. Bei increasing hue beginnt die Route mit zunehmenden Werten. Bei decreasing hue verringert sich der Wert. Wir mischen zwei <named-color>-Werte, um eine Serie von lch() Zwischentönen zu erzeugen, die sich je nach Route um den Farbkreis unterscheiden. Die gemischten Farben umfassen red, blue, und yellow mit LCH-Farbtonwerten von ungefähr 41deg, 301deg und 100deg.

Um redundanten Code zu reduzieren, haben wir CSS benutzerdefinierte Eigenschaften für beide Farben und für die Interpolationsmethode verwendet und unterschiedliche Werte auf jedem <ul> eingestellt.

css
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 Zuwächse oder Verringerungen zwischen den Farben immer gleich oder größer sein als bei der Verwendung von shorter hue. Verwenden Sie increasing hue oder decreasing hue, wenn die Richtung der Farbtonwertänderung wichtiger als die Länge zwischen den Werten ist.

Spezifikationen

Specification
CSS Color Module Level 5
# color-mix

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch