Heute beschäftigen wir uns wieder mit einer Technologie, die ähnlich
wie
CSS Gradients
eher unbekannt ist und dementsprechend kaum eingesetzt wird. Die
Rede ist von CSS3 Filter-Effekten. Mit der
filter
-Eigenschaft lassen sich nämlich Bilder fast wie
in
Photoshop
oder anderen Bildbearbeitungsprogrammen manipulieren.
Zuerst werde ich einen kurzen Überblick über die Möglichkeiten mit CSS Filtern geben und anschließend schauen wir uns die einzelnen Effekte nach der Reihe an. Zuletzt werfen wir dann noch einen Blick auf den Browser-Support und beschäftigen uns mit möglichen Anwendungsfällen von CSS3 Filtern.
CSS3 Filter: Effekte wie in Photoshop
Wie schon in der Einleitung erwähnt, handelt es sich bei den CSS3
Filtern um die CSS-Eigenschaft filter
. Diese erlaubt
uns, eine Reihe von Effekten, wie z.B. Unschärfe oder
Farbverschiebungen, auf ein beliebiges Element anzuwenden, sodass
ein Bild beispielsweise unscharf dargestellt wird. Wichtig zu wissen
ist dabei, dass das Element noch vor der finalen Darstellung im
Browser dem Filter entsprechend manipuliert wird. Der Endnutzer
merkt von dem CSS Filter also praktisch gar nichts, schließlich
könnte das Bild genauso vorher mit
Photoshop
bearbeitet worden sein.
Ein üblicher Anwendungsfall für CSS Filter ist die Manipulierung der
Darstellungsweise eines Bildes, Hintergrundes oder Rahmens. Für das
alles existieren verschiedene Funktionen, die zahlreiche
vordefinierte Effekte ermöglichen. Wem das nicht ausreicht, der kann
sich auch seinen eigenen Filter zusammenbasteln. Dies ist möglich,
da die filter
-Eigenschaft auch den Verweis auf einen
Filter, der mit den sogenannten
SVG Filter Elements
erstellt wurde, erlaubt.
In 99.9% der Fälle sollte man dies aber eigentlich nicht benötigen, schließlich sind die vordefinierten Filter-Funktionen schon relativ umfangreich einsetzbar.
Syntax
Bevor wir uns den verschiedenen Funktionen widmen, müssen wir aber
erstmal einen kurzen Blick auf die Syntax der
filter
-Eigenschaft werfen:
filter: <filter-function> [<filter-function>]* | none
Der Standardwert ist logischerweise none
und sagt
einfach aus, dass kein Filter auf das Element angewendet werden
soll. Möchte man nun einen Filter angeben, erfolgt dies im üblichen
Stil von CSS-Funktionen, wie es z.B. auch bei der Eigenschaft
transform
zum Einsatz kommt. Des Weiteren ist es
möglich, mehrere Filter gleichzeitig auf ein Element anzuwenden.
Dazu trennt man die Funktionen einfach mit einem Leerzeichen. Auch
dies ist nichts Besonderes und sollte jedem bekannt sein, der sich
mit CSS ein wenig auskennt. Mehr dazu aber auch noch zu einem
späteren Zeitpunkt, wenn wir die verschiedenen CSS Filter anwenden.
CSS Filter-Funktionen
Folgende Filter-Funktionen stehen in CSS zur Verfügung:
- blur()
- brightness()
- contrast()
- drop-shadow()
- grayscale()
- hue-rotate()
- invert()
- opacity()
- saturate()
- sepia()
- url() - für Verweis auf SVG-Filter
- custom() - kommt bald
Um nun die CSS filter
-Eigenschaft einzusetzen, gibt man
die jeweilige Funktion mit dem benötigten Parameter in Klammern an.
Sollte der übergebene Wert nicht dem standardisierten Format
entsprechen, gibt die Funktion none
zurück, was dazu
führt, dass wiederum keinerlei Filter angewendet wird. Ansonsten
kann man noch allgemein sagen, dass alle Filter-Funktionen, wenn sie
denn Prozentwerte erwarten, genauso mit den passenden Dezimalzahlen
nutzbar sind. Statt 30%
könnte also z.B. auch
0.3
angegeben werden.
Nun, gut. Lasst uns mit den einzelnen Filter-Funktionen beginnen.
blur()
Die erste Filter-Funktion, die wir uns anschauen, ist
blur()
und ermöglicht es uns, einen sogenannten
Gaußschen Weichzeichner
auf das Element anzuwenden, sprich das Element unscharf oder
verwaschen darzustellen, also Pixel zu verwischen.
Syntax
filter: blur(<length>)
Als einziger Parameter wird eine normale CSS-Längeneinheit übergeben. Prozentwerte sind nicht zulässig. Die Längeneinheit gibt dabei an, wie viele Pixel miteinander vermischt werden, weshalb ein größerer Wert selbstverständlich für eine stärkere Unschärfe sorgt.
Beispiel
Folgendes Beispiel erzeugt einen schon gar nicht mal so schwachen
blur
-Effekt:
.blur {
filter: blur(5px);
}
brightness()
Mit der Filter-Funktion brightness()
lässt sich ein
Element heller oder dunkler darstellen. Anders gesagt:
brightness()
ermöglicht die Anpassung der Helligkeit.
Syntax
filter: brightness([ <number> | <percentage> ])
Als Parameter wird ein Prozentwert übergeben, welcher, wie zuvor
schon mal erwähnt, auch als Dezimalzahl angegeben werden kann. Der
Parameter beeinflusst anschließend die Helligkeit des Elements,
wobei 0
bzw. 0%
komplett schwarz ist und
1
oder 100%
der Ursprungswert ist. Möchte
man die Helligkeit im Vergleich zum Ausgangszustand also erhöhen,
werden Werte größer als 100%
benötigt.
Beispiel
.brightness {
filter: brightness(2);
}
contrast()
Die Filter-Funktion contrast()
manipuliert den Kontrast
eines Elements.
Syntax
filter: contrast([ <number> | <percentage> ])
Der Kontrast wird in Prozent angegeben. 100%
ergibt,
wie zuvor, keine Änderung. Ein Wert niedriger als
100%
reduziert den Kontrast, während ein Wert über
100%
für einen höheren Kontrast sorgt.
Achtung: Sowohl
CSS-Tricks
als auch das
MDN
scheinen hierbei einen kleinen Fehler eingebaut zu haben: Diese
schreiben nämlich, dass Werte größer als
100%
Ergebnisse mit weniger Kontrast erzeugen. Das
stimmt nach meinen Informationen so nicht.
Beispiel
.contrast {
filter: contrast(2.5);
}
drop-shadow()
Auch ein Schlagschatten lässt sich mit der CSS
filter
-Eigenschaft und der Funktion
drop-shadow()
erzeugen. Diese ähnelt der Eigenschaft
box-shadow
sehr, hat allerdings den Vorteil, dass
manche Browser für CSS Filter
Hardwarebeschleunigung
unterstützen und ggf. einsetzen, sodass diese Funktion manchmal ein
wenig schneller als box-shadow
ist.
Syntax
filter: drop-shadow(<shadow>)
Die Funktion erwartet einen Parameter des Typs
<shadow>
, wobei das Keyword
inset
nicht erlaubt ist. Für die Syntax kann man sich
gut an der Eigenschaft box-shadow
orientieren, da diese
die gleiche Syntax besitzt.
Beispiel
Da die Filter-Funktion drop-shadow()
der
box-shadow
-Eigenschaft so ähnelt, lässt sich erstmal
auch kein Unterschied erkennen. Es wird schlicht und ergreifend der
übliche Schlagschatten erstellt, den man auch schon so kennt:
.drop-shadow {
filter: drop-shadow(0px 3px 6px rgba(0,0,0,0.3));
}
Abgesehen von den potenziellen Performance-Vorteilen gibt es also
keinen Grund, die Funktion statt box-shadow
zu nutzen,
richtig? Na ja, nicht ganz. Der drop-shadow()
-Filter
hat noch ein Ass im Ärmel.
Der Schlagschatten passt sich an die Form eines Bildes an. Das kann dann z.B. so aussehen:
See the Pen Drop shadow for Logo with CSS Filter by JR Cologne (@jr-cologne) on CodePen.
Mit box-shadow
würde es hingegen folgendermaßen
aussehen:
See the Pen Box shadow does not adapt to shape of image by JR Cologne (@jr-cologne) on CodePen.
grayscale()
Die grayscale()
-Filter-Funktion stellt das Element in
Graustufen dar, wodurch sich beispielsweise perfekt ein
schwarz-weißes Bild erzeugen lässt.
Syntax
filter: grayscale([ <number> | <percentage> ])
Die Syntax verhält sich wieder genauso, wie bei den meisten Filtern.
Durch einen Prozentwert wird angegeben, wie grau das Element
praktisch wird.
0%
entspricht dem Ausgangszustand und
100%
erzeugt ein komplett graues Ergebnis. Ein Wert
über 100%
ist nicht vorgesehen.
Beispiel
Ein Bild, das komplett in schwarz-weiß dargestellt wird:
.grayscale {
filter: grayscale(1);
}
hue-rotate()
Mit hue-rotate()
lässt sich eine Rotation des Farbtons
auf ein Element anwenden. Dabei werden die Farben eines Elements
anhand einer Gradzahl um den Farbkreis gedreht, sodass sich die
Farben je nach Winkel stark ändern.
Syntax
filter: hue-rotate(<angle>)
Wie schon angedeutet, erwartet die Funktion
hue-rotate()
eine Gradzahl, um die die Farben am
Farbkreis verschoben werden sollen. 0deg
steht dabei
für keine Veränderung, während 360deg
den Maximalwert
darstellt.
Beispiel
.hue-rotate {
filter: hue-rotate(80deg);
}
invert()
Die CSS Filter-Funktion invert()
sorgt dafür, dass die
Ursprungsfarben eines Elements invertiert, also umgedreht werden.
Stellt man sich das Farbrad vor, würde also die entgegengesetzte
Farbe genutzt werden.
Syntax
filter: invert([ <number> | <percentage> ])
Wie so häufig können wir mithilfe eines Prozentwertes wieder
angeben, wie ausgeprägt der Effekt angewendet wird.
0%
belässt alles beim Alten, 100%
dreht
die Farben vollständig um.
Beispiel
.invert {
filter: invert(1);
}
opacity()
Der opacity()
-Filter funktioniert exakt wie die
gleichnamige CSS-Eigenschaft opacity
und fügt einem
Element Transparenz hinzu. Der Unterschied ist, genau wie bei
drop-shadow()
und box-shadow
, dass der
Filter in manchen Fällen performanter ist, da dieser
hardwarebeschleunigt
wird, während die normale CSS-Eigenschaft diesen Vorteil nicht
vorweisen kann. Ansonsten besteht keinerlei Unterschied.
Syntax
filter: opacity([ <number> | <percentage> ])
Die Syntax stimmt mit einer kleinen Ausnahme mit der
opacity
-Eigenschaft überein: Die
opacity
-Eigenschaft erlaubt nur Dezimalzahlen, während
die CSS-Filter-Funktion auch Prozentwerte zulässt.
0%
sorgt für ein vollständig transparentes Element,
wohingegen 100%
für keinerlei Transparenz steht, was
natürlich auch der Ausgangszustand ist.
Beispiel
.opacity {
filter: opacity(0.5);
}
saturate()
Die Filter-Funktion saturate()
ermöglicht die Sättigung
eines Elements anzupassen.
Syntax
filter: saturate([ <number> | <percentage> ])
Auch saturate()
erwartet einen Prozentwert. Dieser gibt
an, wie groß die Sättigung ist. Werte unter
100%
verringern die Sättigung, Werte über
100%
sorgen für eine höhere Sättigung als vorher. Der
Ausgangswert ist 100%
und steht für die ursprüngliche
Sättigung des Elements.
Beispiel
.saturate {
filter: saturate(4);
}
sepia()
Der sepia()
-Filter wandelt die Farben des Elements in
Sepiafarben um. Mit diesem Filter lässt sich dementsprechend die
berühmte Sepia-Färbung anwenden.
Syntax
filter: sepia([ <number> | <percentage> ])
Dreimal dürft ihr raten! Genau, die sepia()
-Funktion
erfordert einen Prozentwert, der die Stärke des Sepia-Effekts
repräsentiert. 0%
sorgt für keinerlei Veränderung und
100%
entspricht einer voll ausgeprägten Sepia-Färbung.
Beispiel
.sepia {
filter: sepia(1);
}
url()
Die url()
-Funktion ermöglicht den Verweis auf einen
Filter, der mit den sogenannten
SVG Filter Elements
erstellt wurde.
Syntax
filter: url(<url>)
Die Funktion erfordert die Angabe einer XML-Datei, welche einen SVG-Filter definiert, der dann auf das Element angewendet wird. Es kann auch ein Anker zu einem bestimmten Element hinterlegt werden.
Beispiel
.svg-filter {
filter: url(resources.svg#c1);
}
Hinweis: Da ich selber nichts davon verstehe, habe ich diese Funktion nur der Vollständigkeit halber aufgeführt. Wie das genau funktioniert, müsst ihr euch dementsprechend leider selber erarbeiten.
Mehrere Filter gleichzeitig anwenden: CSS-Filter-Funktionen kombinieren
Wie bereits zu Beginn mal erwähnt, können die Filter-Funktionen
beliebig kombiniert werden, um den gewünschten Effekt zu erzielen.
Dies ist möglich, indem die Funktionen separiert durch ein
Leerzeichen der filter
-Eigenschaft zugewiesen werden.
Hier ist ein Beispiel, welches den Kontrast des Elements vergrößert und gleichzeitig die Farben um 180 Grad verschiebt:
.hue-rotate-contrast {
filter: hue-rotate(180deg) contrast(1.8);
}
CSS Filter animieren
Ja, du liest richtig. CSS Filter lassen sich animieren, was uns die Türen für einige lustige Dinge öffnet.
Die Animationen sind ganz normal mit Transitions bzw. Keyframe-Animationen umsetzbar. Dies ist eine simple Animation der Graustufen eines Elements:
.grayscale {
animation: animateGrayscale 3s linear infinite alternate;
}
@keyframes animateGrayscale {
from {
filter: none;
}
to {
filter: grayscale(1);
}
}
Mögliche Anwendungsfälle für CSS3 Filter
Nachdem wir uns nun die ganze Theorie angeeignet haben, stellt sich vor allen Dingen eine Frage: Was kann man nun damit anfangen?
Diese Frage ist meiner Meinung nach relativ leicht beantwortet: CSS Filter eignen sich hervorragend für jegliche Formen von Bildeffekten. Möchte man beispielsweise ein Hintergrundbild einer Website ein wenig auffälliger gestalten, aber nicht auf ein Video zurückgreifen, bieten sich CSS Filter an, um beispielsweise die Farben des Hintergrunds zu variieren.
Besonders gut kann dies dann auch mit Illustrationen aussehen.
Ebenfalls interessant sind Filter-Effekte als Hover-Effekt eines Bildes. So könnte sich z.B. die Farbe eines Bildes, das sich anklicken lässt, ändern, wenn man mit der Maus über das Bild fährt.
Um diese Ideen ein wenig zu veranschaulichen, habe ich einfach mal einen Pen erstellt, der die verschiedenen Möglichkeiten zum Einsatz von CSS3 Filtern ein wenig veranschaulicht. Seht selbst:
See the Pen Playing around with CSS3 Filters by JR Cologne (@jr-cologne) on CodePen.
Browser-Kompatibilität
Kommen wir nun zum immer wieder unschönen Thema Browser-Kompatibilität. Dieser sieht nämlich laut caniuse.com bei CSS Filtern auch nicht sonderlich überzeugend aus.
Auch wenn Chrome, Firefox, Safari und Opera durchweg einen guten Support anbieten, sieht das auf Mobilgeräten oder bei den Browsern von Microsoft schon deutlich schlechter aus.
Der Internet Explorer, der in den meisten Webprojekten zumindest
noch in Version 11 unterstützt werden sollte, kann überhaupt nicht
mit CSS Filter-Effekten werben, da er sie einfach nicht unterstützt.
Besser sieht es dann schon mit dem Edge aus: Dieser unterstützt CSS
Filter mit Ausnahme der url()
-Filter-Funktion, die
sowieso so gut wie keiner braucht.
Wenn es darum geht, aufgrund des Performance-Vorteils, die
Filter-Funktionen opacity()
und
drop-shadow()
den Eigenschaften
opacity
bzw. box-/text-shadow
gegenüber
vorzuziehen, kann ich nur eindeutig davon abraten. Das ergibt auch
wegen der schlechteren Unterstützung der Browser keinen Sinn.
Fazit: Man kann sich noch nicht komplett auf die Unterstützung von CSS Filtern in allen gängigen Browsern verlassen, allerdings bedeutet dies nicht, dass CSS Filter noch nicht eingesetzt werden sollten.
In den meisten Fällen handelt es sich schließlich um keine kritischen Features, die einem Benutzer mit einem Browser ohne den Support von CSS Filter-Effekten einen erheblichen Nachteil verschaffen würden.
Fazit
Abschließend kann man sagen, dass CSS3 Filter in einigen Fällen unterschätzt werden und ruhig mehr eingesetzt werden könnten. Auch wenn der Browser-Support noch nicht ideal ist, kann man CSS Filter-Effekte ohne größere Bedenken verwenden.
Wer also das nächste Mal nach einem netten Hover-Effekt sucht oder ein Hintergrundbild hat, das noch ein wenig aufgepeppt werden soll, kann den Einsatz von CSS Filtern durchaus in Erwägung ziehen.