In some browsers, including Chrome stable, you can do this:
h3 {
-webkit-filter: grayscale(1);
filter: grayscale(1);
}
And wouldn’t you know it, the h1 will be rendered completely in grayscale. Everything old is new again.
Anyway — does anyone know of any way to feature-detect for this?
I need to be able to apply other styles if the filter
won’t work.
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.
There are two very important recommendations to keep in mind when using feature detection: Always test for standards first because browsers often support the newer standard as well as the legacy workaround.
The idea behind feature detection is that you can run a test to determine whether a feature is supported in the current browser, and then conditionally run code to provide an acceptable experience both in browsers that do support the feature, and browsers that don't.
Filter functions include blur, brightness, contrast, drop-shadow, grayscale, hue-rotate, invert, opacity, sepia and saturate.
So called UPDATED answer:
As the OP mentioned a good point I'm updating the answer but this does not have anything related or in contradict with my previous answer, this is simply a browser detection.
Alan H. mentioned that IE, prior to its 10th. version, supports filter
css property but not in the way we all know about it (CSS3 filter
I meant).
So If we want to feature detect CSS3 filter
s only, we should go ahead and use a little browser-detection. As I mentioned in my comments.
Using documentMode
property, and combining it with our simple feature-detect we can exclude so called false positives in IE.
function css3FilterFeatureDetect(enableWebkit) {
//As I mentioned in my comments, the only render engine which truly supports
//CSS3 filter is webkit. so here we fill webkit detection arg with its default
if(enableWebkit === undefined) {
enableWebkit = false;
}
//creating an element dynamically
el = document.createElement('div');
//adding filter-blur property to it
el.style.cssText = (enableWebkit?'-webkit-':'') + 'filter: blur(2px)';
//checking whether the style is computed or ignored
//And this is not because I don't understand the !! operator
//This is because !! is so obscure for learning purposes! :D
test1 = (el.style.length != 0);
//checking for false positives of IE
//I prefer Modernizr's smart method of browser detection
test2 = (
document.documentMode === undefined //non-IE browsers, including ancient IEs
|| document.documentMode > 9 //IE compatibility moe
);
//combining test results
return test1 && test2;
}
Original Modernizr source
if(document.body.style.webkitFilter !== undefined)
or
if(document.body.style.filter !== undefined)
Extra information:
For just a simple feature detection use my codes above. For a list of supported functions, take a look at here:
For a live demonstration of filter
s in Chrome, take a look at here:
And 2 more resources for you:
As I'm writing this answer, you must use webkit
vendor prefix to make it to work.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With