Bennett Feely leistet gute Arbeit darin, die Herrlichkeit der CSS-Blend-Modi zu zeigen. Es gibt viele designorientierte Effekte, die wir von statischen Designs kennen (dank Photoshop), die wir im Web mit dynamischen Inhalten noch nicht so häufig sehen. Aber das wird sich ändern, da die CSS-Blend-Modi mehr Unterstützung erhalten. Ich möchte die verschiedenen Arten betrachten, dies zu tun, da es nicht ganz eindeutig ist.
CSS Mehrere Hintergrund-Blend-Modi
Sie können `background-image`s miteinander vermischen oder sie mit Hintergrundfarben mischen. Es ist so einfach wie
.blended {
background-image: url(face.jpg);
background-color: red;
background-blend-mode: multiply;
}
Siehe den Stift Hintergrund-Blending von Chris Coyier (@chriscoyier) auf CodePen.
Multiplizieren ist eine schöne und nützliche Option, aber es gibt auch: `screen`, `overlay`, `darken`, `lighten`, `color-dodge`, `color-burn`, `hard-light`, `soft-light`, `difference`, `exclusion`, `hue`, `saturation`, `color` und `luminosity`. Und auch `normal`, was es zurücksetzt.
Adobe (das an dem Standard für diese Dinge arbeitet)hat diesen Stift erstellt, um mit den verschiedenen Möglichkeiten hier zu spielen. Update: Sie haben diesen Stift entfernt, haben aber immer noch diese Erklärungsseite.
Ein einzelnes Element kann mehr als einen Hintergrund haben, übereinander gestapelt. Wie
.graphic-or-whatever {
background:
url(grid.png),
url(building.jpg)
}
Diese können auch einfach durch Hinzufügen von `background-blend-mode` gemischt werden.
Siehe den Stift Mehrere Hintergrund-Blending von Chris Coyier (@chriscoyier) auf CodePen.
Hier ist ein cooles und praktisches Beispiel von Bennett Feely
Siehe den Stift rxoAc von Bennett Feely (@bennettfeely) auf CodePen.
Hier ist ein weiteres, das geschickt ein Farbbild wiedergibt, das in Cyan / Magenta / Gelb / Schwarz (CMYK) getrennt ist. Sie wissen, dass dies der Funktionsweise des Offsetdrucks in der Druckerei entspricht, richtig? =)
Siehe den Stift CMY/CMYK-Farbdruck mit background-blend-mode von Bennett Feely (@bennettfeely) auf CodePen.
Beliebige HTML-Elemente Blend-Modi
Das Vermischen von Hintergründen ist ziemlich cool, aber persönlich bin ich davon weniger begeistert als vom Vermischen beliebiger HTML-Elemente. Zum Beispiel ein `
`-Titel über einem Hintergrund. Oder sogar Text über Text.
Das sah ich neulich am Flughafen und habe ein Foto gemacht, weil ich es schön fand und dachte, ich könnte herausfinden, wie man das im Web macht

Bei meinem ersten Versuch, es nachzubilden, habe ich Deckkraft verwendet. Aber Deckkraft trübt die Farben wirklich und lässt die überlappenden Stellen nicht die zusätzliche Dunkelheit aufweisen, die sie haben sollten. CJ Gammon hat mir gezeigt, dass es dafür eine Blend-Eigenschaft gibt: `mix-blend-mode`.
Um dies zu reproduzieren
<h1>hungry?</h1>
Dann in ``-Elemente mit Lettering.js aufteilen
$("h1").lettering();
Dann die Buchstaben mit negativem Buchstabenabstand zusammenschieben, `mix-blend-mode` einstellen und einfärben
h1 {
font-size: 7rem;
font-weight: 700;
letter-spacing: -1.25rem;
}
h1 span {
mix-blend-mode: multiply;
}
h1 span:nth-child(1) {
color: rgba(#AB1795, 0.75);
}
/* etc, on coloring */
Vergleichen
Siehe den Stift Überlappende Buchstaben von Chris Coyier (@chriscoyier) auf CodePen.
Wie ich bereits erwähnt habe, ist echter Webtext über einem Bild meiner Meinung nach ein ziemlich cooler Anwendungsfall
Siehe den Stift GxlBm von Chris Coyier (@chriscoyier) auf CodePen.
Canvas Blend-Modi
Die DOM-Blend-Modus-Sachen sind für mich am interessantesten, aber es sollte beachtet werden, dass `
Sie setzen ihn auf den Canvas-Kontext. Also so
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
ctx.globalCompositeOperation = 'multiply';
Dieser Wert kann einer der oben genannten sein. Hier ist eine einfache Demo
Siehe den Stift Canvas Blend-Modi von Chris Coyier (@chriscoyier) auf CodePen.
Und ein schickes Beispiel, bei dem man sehen kann, wie die Mischung der Demo Leben verleiht
Siehe den Stift sketch.js Demo von Justin Windle (@soulwire) auf CodePen.
SVG Blend-Modi
Wie Sie vielleicht vermuten, hat SVG seinen eigenen Mechanismus dafür. Eine Möglichkeit, dies zu tun, besteht darin, es innerhalb von `
<svg>
<defs>
<filter id="f1" x="0" y="0" width="1" height="1">
<feImage xlink:href="#p1" result="p1"/>
<feImage xlink:href="#p2" result="p2"/>
<feBlend mode="multiply" in="p1" in2="p2" />
</filter>
<path id="p1" d='M100 100 L200 100 L200 200 L100 200 Z' fill='#00FFFF'/>
<path id="p2" d='M150 150 L250 150 L250 250 L150 250 Z' fill='#CC3300'/>
</defs>
<rect width="100%" height="100%" filter="url(#f1)"/>
</svg>
Siehe den Stift Fnvdp von Chris Coyier (@chriscoyier) auf CodePen.
Die gute Nachricht ist, dass `mix-blend-mode` auch für Inline-SVG funktioniert. Wenn Sie also SVG auf diese Weise verwenden, können Sie die Formen selbst mit Klassen oder was auch immer ansprechen und ihnen den gewünschten Blend-Modus geben.
Hier ist ein Beispiel von Bennet, das genau das tut
Siehe den Stift KDkCj von Bennett Feely (@bennettfeely) auf CodePen.
Browser-Unterstützung
Für Canvas: Firefox 20+, Chrome 30+, Safari 6.1+, Opera 17+, iOS 7+, Android 4.4+. Die schlechteste Nachricht: Kein IE.
Für HTML/CSS: Firefox 30+, Chrome 35+, Safari 6.1 (anscheinend nicht 7?). Nicht ganz so gut unterstützt wie Canvas.
Im Moment müssen Sie für Chrome Canary ausführen, zu chrome://flags/ gehen und "experimentelle Webplattform-Funktionen" aktivieren.
Das ist eigentlich etwas komplizierter. Wenn Sie also wirklich tief eintauchen und sich über die Unterstützung informieren möchten, schauen Sie sich die Support-Matrix von Adobe an.
Progressive Enhancement
Das Schöne am Blending ist, dass es in erster Linie um designorientierte Effekte geht. Wenn diese nicht unterstützt werden, können Sie sicherstellen, dass das Fallback weiterhin lesbar ist (Progressive Enhancement!).
Hier ist ein aktueller Gedanke von Jeremy Keith
Es ist absolut möglich – nein, wünschenswert – Features zu nutzen, lange bevor sie in jedem Browser unterstützt werden. So bewegen wir das Web voran.
Eine Möglichkeit, die Unterstützung zu gewährleisten, ist also, das Design in einem Browser, der dies nicht unterstützt, zu betrachten. Wenn es immer noch lesbar/nutzbar ist, ist alles in Ordnung, keine weiteren Maßnahmen erforderlich.
Wenn das Ergebnis unleserlich/unbrauchbar ist, können Sie die Dinge so anpassen, dass sie es werden, oder einen Test durchführen, um die Unterstützung zu ermitteln und im Falle mangelnder Unterstützung etwas Spezifisches zu tun.
Um die Unterstützung zu testen, könnten Sie meiner Meinung nach nach der gewünschten Eigenschaft testen
var supportsMixBlendMode = window.getComputedStyle(document.body).mixBlendMode;
var supportsBackgroundBlendMode = window.getComputedStyle(document.body).backgroundBlendMode;
Wenn der zurückgegebene Wert "normal" ist (oder irgendetwas anderes als `undefined`), ist die Unterstützung vorhanden, sonst nicht. Dann wahrscheinlich eine Klasse zum ``-Element hinzufügen, damit Sie dies wissen und sie überall in Ihrem CSS verwenden können, um Dinge anzupassen, im Stil von Modernizr. Vielleicht werden sie in Zukunft auch einen Test dafür durchführen.
Es sei denn, es ist nicht so einfach, in welchem Fall lassen Sie es mich wissen.
Brauchen Sie mehr Ideen? Schauen Sie sich diese Sammlung an. Viel Spaß beim Mischen!
Ich bin mir nicht sicher, aber ich glaube, die Blend-Modi sind es, die Safari auf meinem iPhone 5s zum Absturz bringen. Hat sonst noch jemand das gleiche Problem?
Unglaublich. Ich frage mich, ob Adobe absichtlich versucht, seine Kernsoftware veraltet zu machen, indem es am Ende möglich ist, das gesamte Projekt ohne Bildbearbeitungsprogramm zu programmieren. Hmmm.
Sie sind schon eine ganze Weile ziemlich unverblümt darin, dass sie versuchen, Flash abzuschaffen, auch wenn sie es nicht offen zugegeben haben. Ich vermute, sie sehen es als Konkurrenz zu einigen ihrer neueren Webdesign-Software und ich wäre nicht überrascht, wenn sie auch etwas Neueres und Besseres für die Spieleentwicklung und Ähnliches entwickeln würden.
Sie denken also, Bildbearbeitungsprogramme werden obsolet, weil man dasselbe mit einem Texteditor machen kann? Nun, warum sollte man dann eine Digitalkamera benutzen, wenn man seine Urlaubserinnerungen einfach codieren kann?
Ich kann es kaum erwarten, diesen Artikel noch einmal zu lesen, sobald Chrome Stable 35 erreicht. In 33.0.1750.117 ist das obere Bild opak (was zu erwarten ist).
Wie ist die Leistung für jemanden, der Canary (oder ein ähnliches Firefox-Nightly) verwendet? Je nachdem, wie schnell oder langsam es ist, ist es vielleicht nicht wert, prerenderte Bilder dafür zu verwenden, zumindest noch nicht.
Das ist seltsam, ich habe dieselbe Chrome-Version auf OS X Mavericks und bei mir funktioniert es gut.
Covarr, hast du die experimentellen Funktionen in Chrome aktiviert? Bei mir funktioniert es in Chrome 33.0.1750.146 m unter Windows 7 einwandfrei.
Das ist ziemlich cool, ich denke definitiv, dass die Textüberlagerung die beste Verwendung sein könnte. Zumindest würde ich sie wahrscheinlich am häufigsten verwenden.
Für diejenigen unter uns, die keine Nightly-Build-Notizen verfolgen und vielleicht etwas hinterherhinken (ich arbeite, wie die meisten von uns, in letzter Zeit zu viele Stunden) bei einigen der letzten Support-Ankündigungen, wäre eine schnelle Art-Caniuse-Tabelle für diesen Artikel SUPER hilfreich. Ich stimme Covarr zu… ich freue mich darauf, diesen Artikel zu lesen, wenn er tatsächlich mit Browser-Releases übereinstimmt.
Ihre ursprüngliche Opacity-Version würde funktionieren, aber die verwendete Farbe ist 20 % heller (wenn die Opacity 80 % beträgt), sodass Sie nur eine Farbe verwenden müssen, die 20 % dunkler ist, damit Sie am Ende den ursprünglichen Farbton, aber bei 80 % erhalten.
Ich benutze dies bereits, kann aber ein paar Fehler feststellen. Im Internet Explorer 7 (ich weiß, frag nicht, lol) rollt das Bild beim Überfahren mit der Maus hoch und wieder runter! Hat jemand anderes dieses Problem? Ich habe auch eine Auflösung von 1280px X 968px.
IE7 ist das geringste Ihrer Probleme, wenn es um Blend-Modi geht. Sie funktionieren (derzeit) nicht in der stabilen Version von Chrome, und selbst in Chrome Canary müssen Sie einen experimentellen Modus aktivieren. Ich vermute, IE10 (vielleicht sogar 11?) unterstützt dies noch nicht….
Aber wenn es vollständig unterstützt wird, wird es fantastisch sein!
CSS Blending sieht ziemlich cool aus. Ich werde versuchen, Hintergrundbilder und Text zu mischen. Danke für das Teilen.
Die Unterstützung ist derzeit sehr gering, aber das bedeutet noch weniger Nutzung von Photoshop (was immer willkommen ist).
Ich begrüße immer alles, was mich davon befreit, von Photoshop zur Erstellung von Grafiken abhängig zu sein, besonders wenn der Inhalt der Website von einem Kunden oder Dritten ohne hauseigenes Grafikdesign verwaltet wird. Derzeit verwende ich eine Mischung aus Deckkraftüberlagerungen und Graustufenfiltern, um einige der Effekte zu emulieren.
Als nächstes für Adobe: CSS, das den von Photoshop missbrauchten Chromfilter nachbildet.
fantastisch chris
Carl, ja, das stimmt. Zumindest hier. Ich bin mir nicht so sicher, ob dieser Absturz nicht etwas auf der Ebene der Geräteeinstellungen ist.
Ich bin so ein Neuling, dass mein erster Eindruck dieser Website ist, ob sie tatsächlich von Menschen gebaut wurde. Chris, du machst das wunderbar, ich bin nur gut darin, Themes zu kaufen..
Ich habe jedoch Probleme mit meiner Website, bitte wie kann ich einen Rand um die Blog-Posts und die Seitenleisten-Widgets hinzufügen? Genau wie bei den Sahifa-Themes. Mein Theme läuft auf dem Genesis-Framework
Danke für das tolle Tutorial! Ich habe davon und von Maskierung auf der Smashing Magazine-Website gelesen. Sie haben nicht 'background-' enthalten und die Änderungen in Chrome nicht gesehen. Danke nochmals!
Wow, ich habe diesen Beitrag gelesen und liebe die Idee von Blend-Modi, ABER ich bin auf ein ziemlich großes, unerwartetes Problem gestoßen, und es hat eine Weile gedauert, bis ich es herausgefunden habe.
Das Aktivieren von Chromes "experimentellen Webplattform-Funktionen" hat tatsächlich dazu geführt, dass AdBlock und LastPass nicht richtig funktionierten – Teile davon wurden nicht angezeigt. Seltsame Verbindung, aber irgendwie löste sich das Problem, als ich diese "experimentellen Webplattform-Funktionen" wieder deaktivierte. Hoffentlich stößt niemand anderes auf dieses Problem!
In Chrome 35 musste ich immer noch experimentelle Webplattform-Funktionen aktivieren, damit viele der eingebetteten Pens richtig gerendert wurden. Das Adobe-Beispiel wird überhaupt nicht richtig gerendert, egal ob die Flags an oder aus sind, aber es funktioniert richtig, wenn es auf CodePen selbst betrachtet wird, was seltsam ist….
Das ist seltsam, alle Pens scheinen bei mir ohne Aktivierung von experimentellen Webplattform-Funktionen einwandfrei zu funktionieren. (Chrome 35 auf OS X)