CSS Filters are a powerful tool that authors can use to achieve varying visual effects (sort of like Photoshop filters for the browser). The CSS filter
property provides access to effects like blur or color shifting on an element’s rendering before the element is displayed. Filters are commonly used to adjust the rendering of an image, a background, or a border.
The syntax is:
.filter-me {
filter: blur(3px);
filter: grayscale(1);
filter: saturate(2.2);
filter: none; /* remove existing filter */
}
There are a number of functions to use for the value:
blur()
brightness()
contrast()
drop-shadow()
grayscale()
hue-rotate()
invert()
opacity()
saturate()
sepia()
url()
– for applying SVG filterscustom()
– “coming soon”
Multiple functions can be used, space separated.
.do-more-things {
filter: blur(20px) grayscale(20%);
}
Filter Functions
To use the CSS filter property, you specify a value for one of the following functions listed above. If the value is invalid, the function returns “none.” Except where noted, the functions that take a value expressed with a percent sign (as in 34%) also accept the value expressed as decimal (as in 0.34).
Here’s a demo that lets you play with individual filters a bit:
grayscale()
filter: grayscale(20%)
/* same as... */
filter: grayscale(0.2);
Converts the input image to grayscale. The value of “amount” defines the proportion of the conversion. A value of 100% is completely grayscale. A value of 0% leaves the input unchanged. Values between 0% and 100% are linear multipliers on the effect. If the “amount” parameter is missing, a value of 100% is used. Negative values are not allowed.
sepia()
filter: sepia(0.8);
/* same as... */
filter: sepia(80%);
Converts the input image to sepia. The value of “amount” defines the proportion of the conversion. A value of 100% is completely sepia. A value of 0 leaves the input unchanged. Values between 0% and 100% are linear multipliers on the effect. If the “amount” parameter is missing, a value of 100% is used. Negative values are not allowed.
saturate()
filter: saturate(2);
/* same as... */
filter: saturate(200%);
Saturates the input image. The value of “amount” defines the proportion of the conversion. A value of 0% is completely un-saturated. A value of 100% leaves the input unchanged. Other values are linear multipliers on the effect. Values over 100% are allowed, providing super-saturated results. If the “amount” parameter is missing, a value of 100% is used. Negative values are not allowed.
hue-rotate()
filter: hue-rotate(180deg);
/* same as... */
filter: hue-rotate(0.5turn);
Applies a hue rotation on the input image. The value of “angle” defines the number of degrees around the color circle the input samples will be adjusted. A value of 0deg leaves the input unchanged. If the “angle” parameter is missing, a value of 0deg
is used. The maximum value is 360deg
.
invert()
filter: invert(100%);
Inverts the samples in the input image. The value of “amount” defines the proportion of the conversion. A value of 100% is completely inverted. A value of 0% leaves the input unchanged. Values between 0% and 100% are linear multipliers on the effect. If the “amount” parameter is missing, a value of 100% is used. Negative values are not allowed.
opacity()
filter: opacity(0.5);
/* same as... */
filter: opacity(50%);
Applies transparency to the samples in the input image. The value of “amount” defines the proportion of the conversion. A value of 0% is completely transparent. A value of 100% leaves the input unchanged. Values between 0% and 100% are linear multipliers on the effect. This is equivalent to multiplying the input image samples by amount. If the “amount” parameter is missing, a value of 100% is used. This function is similar to the more established opacity property; the difference is that with filters, some browsers provide hardware acceleration for better performance. Negative values are not allowed.
brightness()
filter: brightness(0.5);
/* same as... */
filter: brightness(50%);
Applies a linear multiplier to input image, making it appear more or less bright. A value of 0% will create an image that is completely black. A value of 100% leaves the input unchanged. Other values are linear multipliers on the effect. Values of an amount over 100% are allowed, providing brighter results. If the “amount” parameter is missing, a value of 100% is used.
contrast()
filter: contrast(4);
/* same as... */
filter: contrast(400%);
Adjusts the contrast of the input. A value of 0% will create an image that is completely black. A value of 100% leaves the input unchanged. Values over the amount over 100% are allowed, providing results with less contrast. If the “amount” parameter is missing, a value of 100% is used.
blur()
filter: blur(5px);
filter: blur(1rem);
Applies a Gaussian blur to the input image. The value of ‘radius’ defines the value of the standard deviation to the Gaussian function, or how many pixels on the screen blend into each other, so a larger value will create more blur. If no parameter is provided, then a value 0 is used. The parameter is specified as a CSS length, but does not accept percentage values.
drop-shadow()
filter: drop-shadow(2px 2px 5px rgb(0 0 0 / 0.5));
filter: drop-shadow(4px 4px red); /* no blur */
Applies a drop shadow effect to the input image. A drop shadow is effectively a blurred, offset version of the input image’s alpha mask drawn in a particular color, composited below the image. The function accepts a parameter of type (defined in CSS3 Backgrounds), with the exception that the ‘inset’ keyword is not allowed.
This function is similar to the more established box-shadow property; the difference is that with filters, some browsers provide hardware acceleration for better performance.
Drop-shadow also mimics the intended objects outline naturally unlike box-shadow
that treats only the box as its path.
Just like with text-shadow, there is no ‘spread’ parameter to create a solid shadow larger than the object.
url()
filter: url()
The url()
function takes the location of an XML file that specifies an SVG filter, and may include an anchor to a specific filter element. Here’s a tutorial that works as a nice intro to SVG filters with a fun demo.
Animating Filters
Since Filters are animatable it can open the doors for a whole bunch of fun.
Notes
You may combine any number of functions to manipulate the rendering, but order still matters (i.e., using grayscale()
after sepia()
will result in completely gray output).
A computed value of other than “none” results in the creation of a stacking context the same way that CSS opacity does. The filter property has no effect on the geometry of the target element’s box model, even though filters can cause painting outside of an element’s border box. Any parts of the target element are affected by filter functions. This includes any content, background, borders, text decoration, outline and visible scrolling mechanism of the element to which the filter is applied, and those of its descendants. Filters can also be applied to inline content, such as individual text spans.
The specification also introduces a filter(image-URL, filter-functions)
wrapper function for an image. It would allow you to filter any image at the time you use it within CSS. For example, you could blur a background image without blurring the text. This filter function is not yet supported in browsers. In the meantime, you can apply both the background and the filter to a pseudo-element to create a similar effect.
The IE proprietary filter stuff
Also used the filter
property, like:
.half-opacity {
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
filter: alpha(opacity=50);
}
Mostly used for opacity when you needed to support IE 8 and down.
More Information
- W3C Filter Effects Specification
- Bennett Feely’s Filters Gallery
- MDN Docs
- CSS Filters polyfill
- Understanding CSS Filter Effects
Browser Support
This browser support data is from Caniuse, which has more detail. A number indicates that browser supports the feature at that version and up.
Desktop
Chrome | Firefox | IE | Edge | Safari |
---|---|---|---|---|
18* | 35 | No | 79 | 6* |
Mobile / Tablet
Android Chrome | Android Firefox | Android | iOS Safari |
---|---|---|---|
123 | 124 | 4.4* | 6.0-6.1* |
I am so amazed with the work of you people.
I live in India and i had just started my web designing carrier so there are many things which i don’t know and I always need help on that and every time i search for a thins which i don’t know i found it on this website.
Thanks Thanks Thanks for your great work.
This website is doing amazing thing for all the people who cant afford to get costly online education and lave lack of tome and resources mainly i don’t have time,money, and mostly resources too but with the help of services like this i am approaching to goog web Designer carrier.
If your website need any help i am there to support you
My mail id [email protected]
Facebook striker.a.a.a
Keep up your Amazing work
:)
yepp, its a great-great website.
The animation is NOT working at all on Firefox 46.0.1.
Any ideas?
Cheers…
Hey, you just have to change code from -webkit- to without that (or add new lines without -webkit-). Like that:
And then it will work on Mozilla. Chris just write the code only for Chrome and Safari.
Thanks for the tutorial.
I noticed that the table said that firefox isn’t supported.
I’ve come across this:”-webkit-filter: blur(20px);”. Wouldn’t the effect then work in firefox?
-webkit-
only affects Chrome, Opera (15+) and Safari. You can do filter stuff in Firefox with svg though.It’s now supported under Firefox without vendor prefixes. :)
-webkit only affect with Chrome,Safari Etc. Browser
if you are going to use it with firefox , you may try -ms-filter:
Actually, you need to use -moz for firefox. -ms is for Microsoft Internet Explorer
Hi, using this article and the explication in spanish for @kseso i made this demo: http://codepen.io/g3kdigital/pen/cxCvu i show how to change the color of the tag using only css and filters, but only working in -webkit- for now. Cheers.
Very nice use case.
that is one stunning example of filters.
Found that you wrote:
Where is one of:
Checked source code, you got wrapped around it.
Anyways just saying :D
for firefox you just have to change -webkit with -moz
example :
-moz-filter:grayscale(1);-webkit-filter:grayscale(1);
For your Reference (CMIIW) css prefixs:
-khtml- (Konqueror, really old Safari)
-moz- (Firefox)
-o- (Opera)
-ms- (Internet Explorer)
-webkit- (Safari, Chrome)
Firefox prefix -moz- does not work. You must use
demo
Interestingly it works in the new Firefox Developers Edition (so hopefully full support is on it’s way – caniuse suggests v35 will have full support without a vendor prefix).
I just put:
” filter: opacity(.2); ”
Without “-webkit-filter: opacity(.2);”
Works fine in Firefox Developer Edition “36.0a2 (2014-12-10)”.
Thanks for nice tutorial, its crisp :D
Awesome :D!!! thanks
Minor Correction:
You haven’t included “saturate” within the list mentioned right at the top.
Thanks. Fixed.
Thanks for the helpful tips. My client wants sepia tone over the photos of their homepage, nice to know I can let the css convert the images on the fly.
Wow!!! So good to see it working on my favourite browser: Mozilla Firefox!!! I’m seeing it on FF Dev Edition, it’s great to have it here too!
:) :) :)
Awesome with a capital “A”!!!!
Hey christ , i dont know if is just mu issue or internet coneccion but the codepen embeed examples are not displaying or when they do is just half. Maybe you want to take a look
Cheers and btw great article
I recently had to make blue colored png icons white on hover.
I used the following to achieve this and thought someone else mind find it useful.
Thanks Justin – just what I needed.
If it’s an svg icon loaded in, or with some PNGs you could also do:
filter: contrast(0) brightness(200%);
Glad it worked for you.
Justin! You have saved me tons of work… Although I did go through hell to find your little snippet ;-)
Thank you thank you thank you.
My pleasure!
Let me know if you come across any cross-browser issues with that hack.
Thank you so much for this! It was exactly what I was looking for. I’ve been trying to find a way to fade my background-image to a black without having to put my image in the tag in the HTML for hours. I was about to give up and go to sleep when I came across this. Now I probably won’t be sleeping because I’m too excited!
Thank you for the tutorial.
I was under the impression that vendor prefixes are not needed to use filters in CSS. It does not seem to be so as when I use just
filter: blur(5px);
for an image the image is unchanged but when I use
-webkit-filter: blur(5px);
Therefore is it correct to assume that vendor prefixes are still needed?
Thanks in advance.
But, i find this css does not valid in css validator. Is there any solution can help to make this to be validated properly?
Your example images path/URL/src is missing. :)
Noticed that as well. When you click the the ‘Edit on Codepen’ link it works. Weird.
The image has hotlinking protection for some domains, it seems.
css only animation start button: http://codepen.io/anon/pen/JGYqgq
how do I apply the filter on the bgImage but not effect the text on top ?
The only way of doing this would be to seperate the text and background container and then put the text absolute on top of that container:
cool stuff..
There is a filter which makes my picture sharper?
Thanks!
Is it possible to apply filter to only a selection? e.g, invert black pixels to white, etc. I really need help on this asap please.
Hi, I’ve playing with this filters… weird thing is when I was trying to make images white, only the ones on tittle were affected. Not sure why…
My code:
Hello I want background as a filter blur and whatever text on up it need to normal.
Please any one suggest me solution.
Hi
I just stumbled upon one bug.
If you use filter on the parent element of a fixed positioned element.
Your Position fixed won’t work.
URL with ID based filter not working in Firefox, any solution for it?
For example, check your link: https://codepen.io/grayghostvisuals/pen/noItd in firefox browser.
Any idea when filter: custom() feature will be supported by browsers?
Till then is there any way to use svg to apply custom shaders?