isolation: isolate: Das Vermischen bei den Blendmodi genau steuern (CSS3)

will it blend?

Gute Nachricht: Firefox 36 unterstützt die Eigenschaft isolation bei den Blendmodi. Das habe ich zum Anlass genommen, meinen Artikel zu isolation: isolate vom Juni 2014 zu aktualisieren.

In den beiden bisherigen Teilen meiner Artikelserie habe ich schon die Eigenschaft background-blend-mode und mix-blend-mode vorgestellt. Jetzt fehlt noch die Eigenschaft isolation. Bei der Eigenschaft geht es um die Frage: Mit welchen Elternelementen finden Vermischungen statt, wenn man mix-blend-mode verwendet?

Dazu ein kleines Beispiel:

Wir haben ein div-Element mit einem Bild:

<body>
<div><img ..></div>
</body>

body erhält eine blaue Hintergrundfarbe:

body { background-color: blue; }

Das div-Element wird rot eingefärbt und außerdem in der Breite beschränkt:

div {
background-color: red;
width: 210px;
}

Das Bild ist damit größer als das div-Element und ragt darüber hinaus – das ist wichtig.

Nun wird festgelegt, dass sich das Bild mit den Hintergründen vermischen soll (funktioniert im Firefox ab 36, Safari ab 7.1 oder Chrome 35, wenn das Flag chrome://flags/#enable-experimental-web-platform-features gesetzt ist):

img {
mix-blend-mode: difference;
}

Womit vermischt sich jetzt das Bild? Mit beiden: Es steht halb auf dem roten Hintergrund des div-Elements und mischt sich mit diesem. Halb ragt es über das rote div heraus und mischt sich mit dem blauen Hintergrund von body.

mix-blend-mode: Bild mischt sich mit div und body

Man kann jetzt aber auch bestimmen, dass sich das Bild zwar mit dem div-Element, aber nicht mit dem dahinterliegenden body vermischen soll. Dafür müssen wir das div-Element zu einem eigenen Stapelkontext machen (stacking context). Dazu existieren mehrere Methoden.

Wenn wir für das div-Element eine opacity bestimmen, kreiert es einen eigenen Stapelkontext und damit vermischt sich das Bild nur mit dem div, aber nicht mit dem body-Hintergrund.

div {
opacity: .95;
}

mix-blend-mode verschachtelt: Bild vermischt sich mit div, aber nicht mit body

Eine andere Möglichkeit, einen Stapelkontext zu erstellen, besteht in der Positionierung und der Vergabe eines z-indexes:

div {
position: relative;
z-index: 2;
}

Das Ergebnis ist dasselbe wie bei der Verwendung von opacity: Das Bild vermischt sich zwar mit dem div-Element, aber nicht mit body.

Positionierung in Kombination mit z-index oder auch die Eigenschaft opacity setzen aber nicht nur einen neuen Stapelkontext, sondern haben auch andere Wirkungen. Das ist anders bei der neuen Eigenschaft isolation. Sie dient dazu, einen neuen Stapelkontext für das Blending zu aktivieren.

In der Spezifikation vom W3C sind drei neue Eigenschaften definiert: background-blend-mode, mix-blend-mode und als drittes eben isolation. isolation erlaubt zwei Werte: auto und isolate. auto ist der Standard und bedeutet, dass kein neuer Stapelkontext kreiert wird, isolate hingegen bewirkt, dass das Element einen neuen Stapelkontext kreiert und damit keine Vermischung mit weiteren Elternelementen stattfindet.

div {
isolation: isolate;
}

Das Ergebnis ist, dass ebenfalls keine Vermischung mit body erfolgt. Zu beachten ist, dass im Beispiel mix-blend-mode beim Bild, aber isolation beim übergeordneten Element angegeben ist.

isolation-Beispiel als externe Datei oder das isolation-Beispiel bei jSFiddle

Am Rande: Das Motto meiner kleinen Artikelserie „Will it blend“ passt natürlich am besten zum dritten Teil. Und wem „Will it blend“ nichts sagt, der findet unter diesem Ausdruck sehr schöne Videos bei Youtube, die beweisen, dass sich so gut wie alles im Mixer zerkleinern lässt …

Kommentare? Gerne :-)

HTML: Folgender HTML-Code kann verwendet werden: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>