简单的CSS梯度检测

时间:2012-06-01 15:50:29

标签: javascript jquery

所以我需要检测用户的浏览器是否支持CSS渐变,就是这样。我会使用Modernizr,但即使只包括渐变检测,与仅仅自己做它相比也会浪费。

据我了解,这将是如何解决的;

  1. 创建未添加到DOM的元素
  2. 使用所有供应商前缀
  3. background-image设置为linear-gradient
  4. 阅读background-image并检查gradient,看看它是否仍在那里
  5. 我无法弄清楚Modernizr的来源,他们在这方面的核心是什么?所以我可以自己做。 http://modernizr.com/download/#-cssgradients-prefixes

2 个答案:

答案 0 :(得分:10)

只是添加我使用的确切代码,以供参考。这是:

var mElem = document.createElement('modern'),
    mStyle = mElem.style;

mStyle.backgroundImage = "linear-gradient(left top, #9f9, white)";
mStyle.backgroundImage = "-o-linear-gradient(left top, #9f9, white)";
mStyle.backgroundImage = "-moz-linear-gradient(left top, #9f9, white)";
mStyle.backgroundImage = "-webkit-linear-gradient(left top, #9f9, white)";
mStyle.backgroundImage = "-ms-linear-gradient(left top, #9f9, white)";
mStyle.backgroundImage = "-webkit-gradient(linear, left top, right bottom, from(#9f9), to(white))";

if (mStyle.backgroundImage.indexOf("gradient") == -1) alert("Gradients are not available. Get a better browser and try again.");

它与Modernizr的实现完全相同,但我只是手工写出各种渐变,而不是自动完成。对于如此小的特征检测,没有必要自动完成。

答案 1 :(得分:4)

他们的测试非常基础,您可以将其提取出来:

    function supports_gradients() {
    /**
     * For CSS Gradients syntax, please see:
     * webkit.org/blog/175/introducing-css-gradients/
     * developer.mozilla.org/en/CSS/-moz-linear-gradient
     * developer.mozilla.org/en/CSS/-moz-radial-gradient
     * dev.w3.org/csswg/css3-images/#gradients-
     */

    var str1 = 'background-image:',
        str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));',
        str3 = 'linear-gradient(left top,#9f9, white);';

    setCss(
         // legacy webkit syntax (FIXME: remove when syntax not in use anymore)
          (str1 + '-webkit- '.split(' ').join(str2 + str1)
         // standard syntax             // trailing 'background-image:'
          + prefixes.join(str3 + str1)).slice(0, -str1.length)
    );

    return contains(mStyle.backgroundImage, 'gradient');
};

要实现这一点,除非你拥有自己的这些方法版本(例如,来自jQuery),否则你还必须提取contains()setCss()