Verwendung von Filtereffekten

Haben Sie schon einmal über ein schwarz-weißes oder sepiafarbenes Bild geschwebt und das farbenfrohe Bild erschien sofort? Sind Sie jemals auf ein Hintergrundbild gestoßen, das einen leicht unscharfen Abschnitt hat, der den darüber liegenden Text besser lesbar macht? In der Vergangenheit erforderten diese Manipulationen Bildbearbeitungssoftware, Zeit und zusätzliche HTTP-Anfragen.

Vorteile der Verwendung von CSS-Filtereffekten

Das Filtereffekte Modul in CSS bietet Eigenschaften und Funktionen, mit denen Sie die oben beschriebenen visuellen Effekte anwenden können, ohne Photoshop zu verwenden oder zusätzliche HTTP-Anfragen zu senden. Die einzige erforderliche Software ist der Browser des Benutzers. Darüber hinaus sind CSS-Filtereffekte im Gegensatz zu voreingestellten Bildeffekten reaktionsfähig und animierbar.

Das CSS-Filtereffekte-Modul stellt die Eigenschaften filter und backdrop-filter bereit, die Sie verwenden können, um das Rendering von Text, Bildern, Hintergründen und Rahmen oder jedes Elements, auf das Sie diese Eigenschaften anwenden, zu beeinflussen. Dieses Modul definiert auch den Datentyp <filter-function>, mit dem Sie grafische Effekte wie Unschärfe oder Farbanpassung hinzufügen können. Mit den Filterfunktionen können Sie nicht nur das Erscheinungsbild eines Elements verändern, sondern auch auf einen SVG-Filter verweisen, indem Sie einen von Ihnen erstellten Filter verwenden.

Eigenschaften der Filtereffekte

Die folgenden zwei Filtereigenschaften des CSS-Filtereffekte-Moduls ermöglichen es Ihnen, null, einen oder mehrere grafische Effekte auf ein Element anzuwenden:

  • Mit der filter Eigenschaft können Sie Filtereffekte wie Unschärfe, Schlagschatten und Sepia auf ein Element anwenden, bevor das Element gerendert wird. Die Filtereffekte werden direkt auf das Element angewendet, einschließlich des Inhalts, der Ränder und der Auffüllung des Elements.

  • Mit der backdrop-filter Eigenschaft können Sie grafische Effekte auf den Bereich hinter einem Element (dem „Hintergrund“ des Elements) anwenden. Die backdrop-filter-Eigenschaft wird häufig verwendet, um den Vordergrundinhalt besser lesbar zu machen, insbesondere wenn der größere Bereich, auf dem sich der Inhalt befindet, ansonsten nicht genügend Kontrast für den Inhalt bietet. Die Filtereffekte werden nur auf den Hintergrund des Elements angewendet, nicht auf den Inhalt des Elements.

Die filter- und backdrop-filter-Eigenschaften akzeptieren eine durch Leerzeichen getrennte Liste von Filtern, die in der angegebenen Reihenfolge angewendet werden.

Filterfunktionen

Das CSS-Filtereffekte-Modul bietet 10 <filter-function>-Funktionen sowie die Möglichkeit, eine nahezu endlose Reihe von Effekten mithilfe von SVG-Filtern zu definieren, die über einen url()-Verweis angewendet werden.

Die folgende Tabelle listet die 10 Filterfunktionen auf, zusammen mit ihren Werttypen, dem minimal gültigen Wert, falls zutreffend, dem größten Wert, der einen Effekt erzeugt, und dem Anfangswert, der für die Interpolation verwendet wird.

Filterfunktion Parameter-Typ Mindestwert Max-Effekt Interpolationswert Standardwert (kein Effekt)
blur() <length> 0 0 blur(0)
brightness() <number> oder <percentage> 0 1 brightness(1) oder brightness(100%)
contrast() <length> 0 1 contrast(1) oder contrast(100%)
drop-shadow() <shadow> 0 0 0 currentcolor drop-shadow(0 0 0 currentcolor)
grayscale() <number> oder <percentage> 0 100% 0 grayscale(0) oder grayscale(0%)
hue-rotate() <angle> 0 hue-rotate(0deg)
invert() <number> oder <percentage> 0 100% 0 invert(0) oder invert(0%)
opacity() <number> oder <percentage> 0 100% 1 opacity(1) oder opacity(100%)
saturate() <number> oder <percentage> 0 100% 1 saturate(100%)
sepia() <number> oder <percentage> 0 100% 0 sepia(0%)

Der erlaubte Mindestwert ist für Filterfunktionen angegeben, die einen Mindestwert haben. Wenn ein Wert unterhalb des Mindestwerts für eine beliebige Filterfunktion angegeben wird, wird die gesamte Eigenschaftsdeklaration ungültig, nicht nur die fehlerhafte Filterfunktion in der durch Komma getrennten Liste.

Der maximale Effektwert kann überschritten werden. Wenn ein Wert größer als der angegebene Maximalwert enthalten ist, ist dies gültig, erhöht jedoch nicht den Effekt über den angegebenen Maximalwert hinaus. Mit anderen Worten, der Effekt auf das Element wird gleich aussehen wie bei Einstellung des maximalen Effektwerts. Zum Beispiel erzeugt sepia(400%) im Sepia-Beispiel den gleichen Effekt wie sepia(100%), dem Maximalwert.

Der Standardwert ist ein Wert, der keinen Effekt erzeugt. Obwohl diese Werte keinen Effekt erzeugen, bieten sie die anfänglichen Interpolationswerte und ein Beispiel dafür, wie der Wert gesetzt werden kann. Diese Standardwerte geben eine Messlatte zwischen dem erlaubten Mindestwert und dem maximalen Effektwert an.

Anwenden von Filtereffekten

Die filter und backdrop-filter Eigenschaften akzeptieren eine Filterfunktionsliste, die eine oder mehrere <filter-function>s, das Standard-Schlüsselwort none oder einen SVG-Filter als url() Wert enthalten kann.

Anwenden des Sepia-Filtereffekts

Wenn Sie über das folgende Sepia-Bild schweben, wird das farbenfrohe Bild sofort angezeigt.

Das Bild wird auf Sepia eingestellt, indem der Wert der filter Eigenschaft als sepia() Filterfunktion angegeben wird. Der Filter wird bei :hover und :focus entfernt, indem filter: none gesetzt wird.

html
<img tabindex="0" alt="Four trans-people, circa 1912" src="activists.jpg" />
css
img {
  filter: sepia(100%);
}
img:hover,
img:focus {
  filter: none;
}

Im <img> Element ist tabindex auf 0 gesetzt, um den Fokus zu ermöglichen, ohne die Tab-Reihenfolge für Tastaturnutzer zu verändern, da <img> kein interaktives Element ist.

Anwenden von Filtereffekten auf andere Elemente

Während sie im Allgemeinen auf Bilder angewendet werden, können die filter- und backdrop-filter-Eigenschaften auf jedes Element oder Pseudo-Element angewendet werden.

In diesem Beispiel wird ein Glüheffekt hinzugefügt, indem ein drop-shadow() Filter mit einem 3px Unschärfe und 0 Versatz verwendet wird.

css
h1 {
  color: midnightblue;
  filter: drop-shadow(0 0 3px magenta);
}

Anwenden mehrerer Filter

Während das Sepia filter-Beispiel nur eine einzelne Filterfunktion enthielt, können Sie mehrere Filter einstellen. Die filter und backdrop-filter Eigenschaften akzeptieren eine durch Leerzeichen getrennte Liste von Filtern, die in der angegebenen Reihenfolge angewendet werden.

Dieses Beispiel wendet zwei Filter — hue-rotate() und blur() — über die backdrop-filter Eigenschaft an. Der Hintergrund, der Bereich hinter dem <p> Element, hat eine Farbverschiebung und eine Unschärfe appliziert.

css
.container {
  background: url(image.jpg) no-repeat left / contain goldenrod;
}
p {
  backdrop-filter: hue-rotate(240deg) blur(5px);
  background-color: rgb(255 255 255 / 10%);
  text-shadow: 2px 2px black;
}

Anwenden wiederholter Filter

Da Filter in der Reihenfolge angewendet werden, können Sie Filterfunktionen mehrmals verwenden. In diesem Beispiel wurde der drop-shadow() Filter vier Mal angewandt, jedes Mal mit einem anderen <shadow> Wert.

html
<img src="mandala.svg" alt="Colorful mandala" role="img" />
<img src="mandala.svg" alt="Plain mandala" role="img" />
css
img {
  filter: drop-shadow(2px 2px 0 hsl(300deg 100% 50%))
    drop-shadow(-2px -2px 0 hsl(210deg 100% 50%))
    drop-shadow(2px 2px 0 hsl(120deg 100% 50%))
    drop-shadow(-2px -2px 0 hsl(30deg 100% 50%));
}
img + img {
  filter: none;
}

Im ersten Mandala-Beispiel werden vier Schlagschatten auf eine liniengezeichnete SVG angewendet. Die gleiche SVG, bei der der Filter mit filter: none entfernt wird, ist zum Vergleich enthalten.

Spezifizierung der Filterfunktionsreihenfolge

Beim Erstellen von Filtereffekten wird der filter oder backdrop-filter Eigenschaft eine durch Leerzeichen getrennte Liste von Filtern bereitgestellt. Diese Filtereffekte werden in der Reihenfolge angewendet, in der sie erscheinen.

In diesem Beispiel werden sowohl ein magenta Schlagschatten als auch eine 180deg Farbrotation auf die Überschrift der ersten Ebene angewendet. Das Beispiel zeigt den Effekt, wenn diese Filter in unterschiedlichen Reihenfolgen angewendet werden.

css
h1 {
  color: midnightblue;
}
#hueFirst {
  filter: hue-rotate(180deg) drop-shadow(3px 3px magenta);
}
#shadowFirst {
  filter: drop-shadow(3px 3px magenta) hue-rotate(180deg);
}

Die gleichen Filter werden auf beide Textzeilen angewendet, jedoch in unterschiedlicher Reihenfolge. In der ersten Zeile wird der Farbton des Textes verändert, bevor der Schatten angewendet wird, sodass der Schatten magenta ist. In der zweiten Zeile wird der Schlagschatten auf den dunkelblauen Text hinzugefügt, und dann wird der Farbton sowohl des Textes als auch des Schattens verändert.

Auf die dritte Zeile wird kein Filtereffekt angewendet, um den ursprünglichen Effekt im Vergleich zu zeigen. Daher bleibt die dritte Zeile midnightblue oder #191970. Der hue-rotate(180deg) Filter verändert den Text in den ersten beiden Zeilen zu #252500.

Hinweis: Der hexadezimale rgb-Farbwert #191970 entspricht hsl(240deg 63,5% 26,9%), während #252500 hsl(60deg 100% 7,3%) ist. Die Farbrotation findet im sRGB-Farbraum statt, weshalb der Farbton wie erwartet geändert wurde, während die Werte für Sättigung und Helligkeit nicht beibehalten werden.

Verwendung von SVG-Filtern

Neben den 10 definierten <filter-function>s unterstützt die CSS-Filtereffekte url(), wobei der Parameter ein SVG-Filter ist, der in eine interne oder externe SVG-Datei eingebettet sein kann.

Ein einziges SVG kann verwendet werden, um mehrere Filter zu definieren, von denen jeder eine id hat:

html
<svg role="none">
  <defs>
    <filter id="blur1">
      <feGaussianBlur stdDeviation="1" edgeMode="duplicate" />
    </filter>
    <filter id="blur3">
      <feGaussianBlur stdDeviation="3" edgeMode="duplicate" />
    </filter>
    <filter id="hue-rotate90">
      <feColorMatrix type="hueRotate" values="90" />
    </filter>
  </defs>
</svg>

Die id des Filters wird in der url() sowohl für Inline- als auch externe SVGs referenziert:

css
filter: url(#blur3);
filter: url("https://example.com/svg/filters.svg#blur3");

Unscharf machen eines Bildes

Ähnlich wie die blur() Filterfunktion einen Gaußschen Weichzeichner auf die Elemente anwendet, auf die sie angewendet wird, kann das SVG <feGaussianBlur> Filterelement auch verwendet werden, um Inhalte unscharf zu machen.

In beiden Fällen gibt der Unschärferadius, der in CSS als <length> und in SVG als pixelläquivalenter <number> angegeben wird, den Wert der Standardabweichung zur Gaußschen Funktion an. Mit anderen Worten, er definiert die Anzahl von Pixeln auf dem Bildschirm, die ineinander übergehen; ein größerer Wert erzeugt mehr Unschärfe.

Das <filter>'s stdDeviation Attribut akzeptiert bis zu zwei Werte, die die Erstellung komplexerer Unschärfewerte ermöglichen. Um eine gleichwertige Unschärfe zu erzeugen, fügen wir einen Wert für stdDeviation ein:

html
<svg role="img" aria-label="Flag">
  <filter id="blur">
    <feGaussianBlur stdDeviation="3.5" edgeMode="duplicate" />
  </filter>
  <image
    xlink:href="https://mdn.github.io/shared-assets/images/examples/progress-pride-flag.jpg"
    filter="url(#blur)" />
</svg>

Der SVG url() Filterwert kann als Wert des SVG <image> Elements' filter Attributs oder als Teil des Werts der CSS filter und backdrop-filter Eigenschaften enthalten sein.

css
.filter {
  filter: blur(3.5px);
}
.svgFilter {
  filter: url(#blur);
}

Siehe auch