CSS-Farbmischung()

Adam Argyle
Adam Argyle

Mit der CSS-Funktion color-mix() können Sie Farben in einem der unterstützten Farbräume direkt über den CSS-Code mischen.

Unterstützte Browser

  • 111
  • 111
  • 113
  • 16,2

Quelle

Vor dem color-mix() haben Entwickler CSS-Präprozessoren oder calc() für Farbkanäle verwendet, um eine Farbe abzudunkeln, aufzuhellen oder zu entsättigen.

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

Sass hat großartige Arbeit geleistet, um der CSS-Spezifikation für Farben einen Schritt voraus zu sein. Es gibt jedoch keine wirkliche Möglichkeit, Farben in CSS zu mischen. Dazu müssen Sie die partiellen Farbwerte berechnen. Hier ist ein reduziertes Beispiel dafür, wie CSS heute eine Kombination simulieren könnte:

Vorher bei 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%);
}

Mit color-mix() können Sie in CSS Farben mischen. Entwickelnde können auswählen, in welchen Farbraum sie mischen und wie dominant die einzelnen Farben sein sollen.

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

Das wollen wir. Flexibilität, Leistung und APIs mit vollem Funktionsumfang Lieblingsmusik

Farben in CSS mischen

CSS ist in einem mehreren Farbraum und Farbraum vorhanden. Daher ist es nicht optional, den Farbraum für den Misch festzulegen. Darüber hinaus können verschiedene Farbräume die Ergebnisse einer Mischung drastisch ändern. Wenn Sie also die Auswirkungen eines Farbraums kennen, können Sie die gewünschten Ergebnisse erzielen.

Eine interaktive Einführung bietet dieses color-mix()-Tool: – Sehen Sie sich die Auswirkungen jedes Farbraums an. – Untersuchen Sie die Auswirkungen der Farbinterpolation beim Mischen in einem zylindrischen Farbraum (lch, oklch, hsl und hwb). – Ändern Sie die zu mischenden Farben, indem Sie auf eines der beiden oberen Farbfelder klicken. - Verwenden Sie den Schieberegler, um das Mischverhältnis zu ändern. – Der CSS-Code von color-mix(), der unten verfügbar ist, wurde generiert.

Das Abmischen der verschiedenen Farbräume

Der Standardfarbraum für Mischungen und Farbverläufe ist oklab. Sie liefert konsistente Ergebnisse. Sie können auch alternative Farbräume angeben, um den Mix an Ihre Anforderungen anzupassen.

Sehen wir uns z. B. black und white an. Der Farbraum, den sie kombinieren, macht keinen großen Unterschied. Das stimmt nicht.

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 Farbbereiche (srgb, linear-srgb, lch, oklch, Lab, oklab, xyz) zeigen jeweils die Ergebnisse einer Kombination von Schwarz und Weiß. Es werden etwa fünf verschiedene Schattierungen gezeigt, was zeigt, dass sich jeder Farbraum in Grautönen unterschiedlich mischen kann.
Demo ansehen

Es hat einen großen Effekt!

Ein weiteres Beispiel sind blue und white. Ich habe mich für dieses Beispiel entschieden, weil sich die Form eines Farbraums auf die Ergebnisse auswirken kann. In diesem Fall werden die meisten Farbräume lila, während sie von Weiß nach Blau wechseln. Sie zeigt auch, dass oklab ein so zuverlässiger Farbraum zum Mischen ist. Damit kommen die meisten Menschen am ehesten von einer Mischung aus Weiß und Blau (kein Lila) erwartet.

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 Farbbereiche (srgb, linear-srgb, lch, oklch, Lab, oklab, xyz), von denen jeder unterschiedliche Ergebnisse hat. Viele sind rosa oder lila, aber nur wenige sind noch blau.
Demo ansehen

Auch zum Erstellen von Farbverläufen ist es hilfreich, mit color-mix() die Effekte eines Farbraums zu erlernen. Mit der Syntax für Farbe 4 kann bei Farbverläufen auch der Farbraum angegeben werden, wobei ein Farbverlauf die Mischung über einen Bereich des Raums anzeigt.

.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);
}
Schwarz-Weiß-Verläufe in verschiedenen Farbräumen.
Demo ansehen

Wenn Sie sich fragen, welcher Farbraum „der beste“ ist, gibt es hier keinen. Deshalb gibt es so viele Optionen! Außerdem werden keine neuen Farbräume erfunden (siehe oklch und oklab), wenn einer der „besten“ wäre. Jeder Farbraum kann einen einzigartigen Moment haben, um zu glänzen und die richtige Wahl zu sein.

Wenn Sie beispielsweise ein lebhaftes Mix-Ergebnis erhalten möchten, verwenden Sie „hsl“ oder „hwb“. In der folgenden Demo werden zwei kräftige Farben (Magenta und Hellgrün) miteinander gemischt. „HsL“ und „HWB“ erzeugen beide ein lebendiges Ergebnis, während „srgb“ und „oklab“ ungesättigte Farben erzeugen.

Die Mischungsergebnisse sind im vorherigen Abschnitt beschrieben.
Demo ansehen

Wenn Sie Konsistenz und Subtilität wünschen, verwenden Sie Oklab. In der folgenden Demo, in der Blau und Schwarz kombiniert werden, erzeugen HSL und HWB übermäßig leuchtende Farben und Farbveränderungen, während srgb und Oklab ein dunkleres Blau erzeugen.

Die Mischungsergebnisse sind im vorherigen Abschnitt beschrieben.
Demo ansehen

Probieren Sie den color-mix() Playground fünf Minuten lang aus und testen Sie verschiedene Farben und Bereiche. So bekommen Sie ein Gefühl für die Vorteile der einzelnen Bereiche. Außerdem wird es noch weitere Hinweise zu Farbräumen geben, wenn wir uns alle an das Potenzial unserer Benutzeroberflächen anpassen.

Methode zur Farbinterpolation anpassen

Wenn Sie sich für einen zylindrischen Farbraum entschieden haben, also praktisch jeden Farbraum mit einem h-Farbraum, der einen Winkel akzeptiert, können Sie angeben, ob die Interpolation auf shorter, longer, decreasing und increasing eingestellt wird. Weitere Informationen dazu findest du in diesem HD-Farbleitfaden.

Hier ist das gleiche Beispiel für eine Blau-Weiß-Mischung, dieses Mal jedoch nur in den zylindrischen Räumen mit unterschiedlichen Farbinterpolationsmethoden.

Die Mischungsergebnisse sind im vorherigen Abschnitt beschrieben.
Demo ansehen

Hier ist ein weiterer Codepen, den ich erstellt habe, um die Farbinterpolation zu visualisieren, insbesondere für Farbverläufe. Ich glaube, damit Sie besser verstehen, wie jeder Farbraum sein Mischergebnis erzielt, wenn die Farbinterpolation angegeben ist, sollten Sie eine Studie durchführen.

Mischung mit unterschiedlichen Farbsyntaxen

Bisher haben wir hauptsächlich Farben mit CSS-Namen wie blue und white gemischt. Mit der CSS-Farbmischung können Sie Farben aus zwei verschiedenen Farbräumen mischen. Dies ist ein weiterer Grund, warum es wichtig ist, den Farbraum für die Mischung anzugeben, da so der gemeinsame Raum für den Fall festgelegt wird, dass sich die beiden Farben nicht im selben Raum befinden.

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

Im vorherigen Beispiel werden hsl und display-p3 in oklch konvertiert und dann gemischt. Ziemlich cool und flexibel.

Anpassung der Mischverhältnisse

Es ist nicht sehr wahrscheinlich, dass Sie beim Mischen dieselben Teile jeder Farbe erhalten möchten, wie die meisten bisher Beispiele gezeigt haben. Gute Neuigkeiten: Es gibt eine Syntax, mit der festgelegt wird, wie viel von jeder Farbe im resultierenden Mix zu sehen sein soll.

Zu Beginn dieses Themas finden Sie hier ein Beispiel für Mixe, die alle äquivalent sind und der Spezifikation entsprechen:

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

Ich finde diese Beispiele, um die Grenzfälle gut zu verdeutlichen. Die ersten Beispiele zeigen, dass 50% nicht erforderlich sind, aber optional angegeben werden können. Das letzte Beispiel zeigt einen interessanten Fall, bei dem die Verhältnisse in der Summe 100% überschreiten und die Summe gleich 100 % beträgt.

Wenn nur eine Farbe ein Verhältnis angibt, wird von der anderen angenommen, dass es sich um den Rest von 100 % handelt. Hier einige weitere Beispiele, um dieses Verhalten zu veranschaulichen.

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

In diesen Beispielen werden zwei Regeln veranschaulicht: 1. Wenn die Verhältnisse 100 % überschreiten, werden sie eingeschränkt und gleichmäßig verteilt. 1. Wenn nur ein Verhältnis angegeben ist, wird die andere Farbe auf 100 abzüglich dieses Verhältnisses festgelegt.

Die letzte Regel ist etwas weniger offensichtlich. Was passiert, wenn Prozentsätze für beide Farben angegeben werden und die Summe nicht 100 % ergibt?

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

Diese Kombination von color-mix() ergibt Transparenz, 40% Transparenz. Wenn die Verhältnisse nicht 100 % ergeben, ist der resultierende Mix nicht undurchsichtig. Keine der Farben wird vollständig gemischt.

color-mix() wird verschachtelt

Wie bei allen CSS wird die Verschachtelung gut und erwartungsgemäß verarbeitet. Innere Funktionen werden zuerst aufgelöst und geben ihre Werte an den übergeordneten Kontext zurück.

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

Sie können so viel wie nötig einbauen, um das gewünschte Ergebnis zu erzielen.

Ein helles und dunkles Farbschema erstellen

Erstellen wir mit color-mix() ein Farbschema!

Ein grundlegendes Farbschema

Im folgenden CSS wird basierend auf dem Hex-Farbcode der Marke ein helles und ein dunkles Design erstellt. Durch das helle Design werden zwei dunkelblaue Textfarben und eine sehr helle weiße Hintergrundfarbe erstellt. Bei einer Medienabfrage mit dunklen Einstellungen werden den benutzerdefinierten Eigenschaften dann neue Farben zugewiesen, sodass der Hintergrund dunkel und die Textfarben hell sind.

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

Dazu wird Weiß oder Schwarz zu einer Markenfarbe gemischt.

Zwischenfarbschema

Sie können noch einen Schritt weiter gehen, indem Sie mehr als helle und dunkle Designs hinzufügen. In der folgenden Demo wird bei Änderungen an der Optionsfeldgruppe ein Attribut für das HTML-Tag [color-scheme="auto"] aktualisiert. Dadurch können Selektoren ein Farbschema bedingt anwenden.

Diese Zwischendemo zeigt auch ein Farbdesignverfahren, bei dem alle Designfarben in :root aufgeführt sind. So sind sie leicht zu sehen und bei Bedarf anzupassen. Später im Stylesheet können Sie die definierten Variablen verwenden. Dies erspart Ihnen die Suche nach Farbänderungen im Stylesheet, da diese alle im ersten :root-Block enthalten sind.

Interessantere Anwendungsfälle

Ana Tudor bietet eine gute Demo mit einigen Anwendungsfällen zum Lernen:

Fehler bei „color-mix()“ mit Entwicklertools beheben

color-mix() wird von den Chrome-Entwicklertools hervorragend unterstützt. Die Syntax wird erkannt und hervorgehoben, erstellt eine Vorschau des Mixes direkt neben dem Stil im Bereich „Stile“ und ermöglicht die Auswahl alternativer Farben.

In den Entwicklertools sieht dies in etwa so aus:

Screenshot der Chrome-Entwicklertools, in denen die Farbmix-Syntax geprüft wird

Viel Spaß beim Mixen!