I had never heard of the backdrop-filter
property until yesterday, but after a couple of hours messing around with it I’m positive that it’s nothing more than magic. This is because it adds filters (like changing the hue, contrast or blur) of the background of an element without changing the text or other elements inside.
Take this example where I’ve replicated the iOS notification style: see how the background of each of these boxes are blurred but the text isn’t?
That’s only a single line of CSS to create that faded background effect, just like this:
.notification {
backdrop-filter: blur(3px);
}
Now it’s worth noting that browser support for this CSS property isn’t particularly well supported just yet (see below). But we’ve been trying to do this sort of filtering stuff for a really long time and so it’s great to see that progress is being made here. Chris wrote about the “frosted-glass” technique in 2014 and way back then you had to use a bunch of weird hacks and extra images to replicate the effect. Now we can write a lot less code to get the same effect!
We also get to pick from a lot more filters than just that frosted glass style. The following demo showcases all of the backdrop-filter
values and how they change the background:
Each of these boxes are just separate divs where I’ve applied a different backdrop-filter
to each. And that’s it! I sort of can’t believe how simple this is, actually.
Of course you can chain them together like so:
.element {
backdrop-filter: blur(5px) contrast(.8);
}
And this could make all sorts of elaborate and complex designs, especially if you start combining them together with animations.
But wait, why do we even need this property? Well, after reading up a little it seems that the go-to default example is a modal of some description. That’s what Guillermo Esteves was experimenting with back in 2015:
See the Pen PwRPZa by Guillermo Esteves (@gesteves) on CodePen.
I reckon we can do something much weirder and more beautiful if we put our minds to it.
A note about browser support
The backdrop-filter
property is not well supported at the time of this writing. And even in Safari where it is supported, you’ll still need to prefix it. There’s no support for Firefox at all. But, really, do websites need to look exactly the same in every browser?
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 |
---|---|---|---|---|
76 | 103 | No | 17 | 9* |
Mobile / Tablet
Android Chrome | Android Firefox | Android | iOS Safari |
---|---|---|---|
123 | 124 | 123 | 9.0-9.2* |
Yes! I became aware of this awhile back. thankfully available in Chrome behind the experimental HTML feature flag, so I can play around with it.
Awesome feature, hopefully it gets more support so we can actually use it.
Anyone who wants this feature to be implemented can help by starring this issue on chromium bugs sites:
https://bugs.chromium.org/p/chromium/issues/detail?id=497522
They said that they focus first on the most starred issues, so it would help to get into on chrome faster.
It’s cool, but the same effects can be mimicked with one wrapper element and the CSS filter pripprop, which has much better browser support
Same here! I use this feature a lot as a progressive enhancement along with @supports
Polyfill: https://github.com/AhsanE/backdrop-polyfill-chrome
As with many of these effects, they’ll probably be out of style about the time we get wide browser support. By then something sexy and technologically unattainable will come along.
Thanks for sharing! I’m trying to incorporate backdrop-filter in my codepen. I tried to reference your codepen but it looks like the filters are not being applied there. Do you know why that would be? I’m a newbie, so it’s not obvious to me.