Du kannst einen Filter auf ein ganzes Element ganz einfach mit der filter-Eigenschaft anwenden. Aber was, wenn du einen Filter *nur* auf den Hintergrund eines Elements anwenden möchtest? Das ist seltsamerweise knifflig.
Es gibt CSS-Eigenschaften, die spezifisch für Hintergründe sind, wie z. B. background-blend-mode — aber Überblendung und Filter sind nicht dasselbe. Dies scheint der Grund zu sein, warum wir backdrop-filter haben, aber nicht ganz. Dies wendet Filter an, während der Hintergrund mit dem interagiert, was sich *hinter* dem Element befindet.
Leider gibt es keinen background-filter. Was sollen wir tun?
Verwenden Sie ein Pseudoelement anstelle eines Hintergrunds
Wenn Sie den Inhalt des Elements in einen inneren Wrapper legen, können Sie diesen über einem Pseudoelement positionieren, das einfach als Hintergrund dient.
.module {
position: relative;
}
.module::before {
content: "";
position: absolute;
top: 0; left: 0;
width: 100%; height: 100%;
background-image: url(graphic-to-be-filtered.jpg);
filter: grayscale(100%);
}
.module-inside {
/* This will make it stack on top of the ::before */
position: relative;
}
Sehen Sie sich den Pen Apply Filter to Psuedo Element von Chris Coyier (@chriscoyier) auf CodePen an.
Sehen Sie, wie der "Hintergrund" dort mit grayscale gefiltert wird? Wir haben den Graustufenfilter dort aufgerufen und ihn nur auf das Pseudoelement angewendet, während der Rest des Inhalts ungefiltert blieb.
Es hängt davon ab, welche Art von Filterung Sie wünschen… möglicherweise können Sie es mit Überblendmodi vortäuschen
Ich stieß auf dieses Problem, als ich speziell versuchte, das Hintergrundbild eines Elements in Graustufen umzuwandeln. Da, wie wir bereits besprochen haben, keine spezielle Eigenschaft dafür existiert, dachte ich an background-blend-mode, insbesondere daran, wie es Überblendungsoptionen für Dinge wie Sättigung und Farbe gibt. Wenn ich reines Schwarz über die Grafik legen könnte, dann könnte ich sie überblenden — so wie ich es mit mehreren Hintergründen kann — und im Wesentlichen einen Graustufeneffekt vortäuschen.
Beachten Sie, dass Sie keine Volltonfarbe allein verwenden können, wenn Sie mit mehreren Hintergründen arbeiten (das wäre eine background-color, keine background-image), daher müssen wir dies auch mit einem linear-gradient ohne Übergang vortäuschen.
.module {
background-image:
linear-gradient(black, black),
url(image-to-be-fake-filters.jpg);
background-size: cover;
background-blend-mode: saturation;
}
Sehen Sie sich den Pen Apply Fake Filter with Blend Mode von Chris Coyier (@chriscoyier) auf CodePen an.
Dan Wilsons Erkundungen
Dan hat sich damit intensiv beschäftigt und einen experimentellen Pen erstellt, in dem drei Ebenen vorhanden sind
- Oberste Ebene: eine Vignette aus einem
radial-gradient - Mittlere Ebene: Volltonfarbe
- Untere Ebene: grafisches Bild
Sie können die Farben der oberen beiden Ebenen anpassen und jeder einzelnen unterschiedliche Überblendmodi zuweisen. Das war eine weitere Sache, die ich gelernt habe! So wie Sie durch Kommas trennen können, um mehrere Hintergründe zu erstellen (und ebenso mit background-size, background-position und ähnlichem, um diese Werte auf bestimmte Hintergründe anzuwenden), können Sie auch background-blend-mode durch Kommas trennen, um jeder Ebene unterschiedliche Überblendeffekte zuzuweisen.
Sehen Sie sich den Pen Multiple Backgrounds, Multiple Blend Modes von Dan Wilson (@danwilson) auf CodePen an.
Vielen Dank für Ihre wunderbar informativen Beiträge, ich wüsste nicht, was ich ohne Sie tun würde! Der Material Design „Mask“-Filter ist auch ziemlich raffiniert, schauen Sie ihn sich an: https://mdbootstrap.com/css/masks/
Es gibt eine
filter(<image>, <filter-function-list>)Funktion in der Spezifikation, die diesen und andere Anwendungsfälle abdecken sollte und es Ihnen ermöglichen würde, einen Filter direkt auf jedes Bild in CSS anzuwenden.Aber… kein Browser hat den Sprung gewagt, ihn als erster zu implementieren.
Kam hierher, um genau das zu sagen, aber natürlich war Amelia mir zuvorgekommen. :)
ABER! Safari unterstützt dies mit dem Präfix
-webkit-filter()seit Safari 9 (schrecklich fehlerhaft) und dann ungeprefixst ab 9.1/10 auf iOS, etwas weniger fehlerhaft, wenn ich mich recht erinnere.Ein weiterer Trick, der kein Pseudoelement verwendet, wäre die Verwendung eines SVG im Base64-Format mit feColorMatrix.
Das funktioniert für mich in CSS