如何检测CSS过滤器?

时间:2012-06-15 08:34:54

标签: css browser-feature-detection

在某些浏览器中,包括Chrome稳定版,您可以这样做:

h3 {
  -webkit-filter: grayscale(1);
  filter: grayscale(1);
}

你不知道吗,h1将完全以灰度渲染。 Everything old is new again

无论如何 - 有没有人知道有任何特征检测方法吗?

如果过滤器不起作用,我需要能够应用其他样式。

3 个答案:

答案 0 :(得分:19)

所谓的 更新 回答:

由于OP提到了一个很好的观点,我更新了答案,但这与我以前的答案没有任何关联或相反,这只是一个浏览器检测。

Alan H.提到IE,在它的第10个之前。版本,支持filter css属性,但不是我们都知道的方式(CSS3 filter我的意思)。

因此,如果我们只想要检测CSS3 filter的功能,我们应该继续使用一些浏览器检测。正如我在my comments中提到的那样。

使用documentMode属性,并将其与我们的简单功能检测相结合,我们可以在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)

if(document.body.style.filter !== undefined)

额外信息:

对于简单的特征检测,请使用上面的代码。有关支持的函数列表,请查看此处:

要在Chrome中对filter进行现场演示,请点击此处:

还有2个资源供您使用:

在撰写此答案时,您必须使用webkit供应商前缀才能使其生效。

答案 1 :(得分:2)

以@Sepehr的答案为基础,但对其进行现代化并删除多余的行:

var supportsFilters = (function() {
  var filterEl = document.createElement('div');
  filterEl.style.cssText = 'filter:blur(2px)';
  return filterEl.style.length != 0 && (document.documentMode === undefined || document.documentMode > 9);
})();

答案 2 :(得分:0)

您现在可以使用CSS的内置@support来有条件地应用样式。请注意,browser support for @support is good but not perfect。这是一篇很好的文章,它通过几个示例解释了它是如何工作的:https://iamsteve.me/blog/entry/feature-detection-with-css

例如,您可以执行以下操作(see it live):

@supports (filter: grayscale(1)) or (-webkit-filter: grayscale(1)) {
  h3 {
    -webkit-filter: grayscale(1);
    filter: grayscale(1);
  }
}

@supports not (filter: grayscale(1)) and not not (-webkit-filter: grayscale(1)) {
  h3 {
    color: #808080;
  }
}