【问题标题】:Grayscale image with CSS on Safari 5.xSafari 5.x 上带有 CSS 的灰度图像
【发布时间】:2012-09-23 00:59:17
【问题描述】:

我正在尝试在页面上显示一些图像,它们应该以灰度显示,但鼠标悬停时它们会平滑过渡到彩色。我让它在 IE、Chrome 和 Firefox 上运行良好,但它在 Safari 5.x 上无法运行。问题出在 Safari for Mac Safari for Windows。这是我到目前为止的代码:

filter: url('desaturate.svg#greyscale'); 
filter: gray;
-webkit-filter: grayscale(1);

第一行加载一个外部 .svg 过滤器(我没有将它与 url("data:... 规则内联,因为我想避免 a bug in old versions of Firefox)。

第二行是针对 IE 的,似乎和filter:progid:DXImageTransform.Microsoft.BasicImage(grayScale=1); 一样好用。

关于 webkit 的最后一行应该可以在 Safari 6 及更高版本以及 Chrome 上运行。

是否有任何 CSS 规则可以在 Safari 5.x 上显示灰度图像?或者,如果这是不可能的,有人可以推荐一个 javascript 解决方案,最好是一个可以处理灰度动画的解决方案? 我想避免使用灰度图像的服务器端黑客攻击,因为这会弄乱我的 HTML,然后我必须进行一些讨厌的浏览器检测以有条件地提供 HTML。

谢谢

编辑:

由于这已被证明是一个“值得注意的问题”,请不要继续在此处发布更多仅适用于 Safari 6 及更高版本的答案,或者在数据 url 中包含 .svg 文件的答案。在我编写 OP 时,支持某些版本的 Safari 和 Firefox 对我来说很重要,这些版本在今天被认为是非常过时的,但这是我最初的问题。 p>

我很清楚,对于现代浏览器,灰度过滤只需几行 CSS 代码即可轻松完成,但图形设计师使用的是 Safari 5.x,而客户端使用的是 Firefox 3.x 在我做这个项目的时候。对我有用的解决方案是 Giona 建议的,即使用 Modernizr 测试 css 过滤,如果不支持回退到 javascript。

如果我今天做同样的事情,我会告诉他们去更新他们的浏览器!

【问题讨论】:

    标签: css safari grayscale


    【解决方案1】:

    正如您在 caniuse.com 上看到的那样,目前很少有浏览器支持 CSS3 过滤器。

    如果你在 Google 上搜索“javascript grayscale plugin”,会有很多 JavaScript/jQuery 后备。 以下是一些:

    但我对他们没有经验,所以我不能建议你哪个是最好的。

    我很久以前尝试过jQuery Black And White,它给我带来了很多相对/绝对定位图像的问题,所以最好避免它。


    将此Modernizr build 包含到您的页面中,您可以通过Javascript 定位不支持过滤器的浏览器:

    if(!Modernizr.css_filters){
        /* javascript fallback here */
    }
    

    或 CSS:

    .no-css_filters .element {
        /* css fallback here */
    }
    

    哦,别忘了dowebsitesneedtolookexactlythesameineverybrowser?

    【讨论】:

    • 嘿,谢谢您的链接。稍后我会看看它们,看看哪个对我有用,我会在这里报告。 Hoverizr 看起来很有希望。另外,我喜欢为此使用 Modernizr 的想法,所以也谢谢你。至于你的最后一点,我同意,但试着告诉我的客户和图形设计师。 叹息
    • 嘿嘿,我知道,客户和 Photoshop 狂人无法理解。 Modernizr 是网页设计师最有用的工具之一,您也可以轻松add custom tests!良好的编码@alexg
    • 我终于有时间做这个了。原来我使用的是 Grayscale.js。您的第二个和第三个链接是同一个项目,它有一些错误,它假设(源代码中的第 82 行)图像是 而我的是背景图像。此外,modernizr 构建的正确链接是 modernizr.com/download/…,因为您还需要 _prefixes 来测试 css 过滤器。根据caniuse.com/canvas,现在它应该可以在 Safari 3.1 及更高版本上运行。我没有让动画工作,但我认为它的方式很好。
    • 如果有人感兴趣,我用 Safari 5.0.3 for windows 来测试一下。
    • 旁注:由于跨域安全问题,jQuery GreyScale 插件在 Chrome 24 中不起作用。
    【解决方案2】:

    其实很简单:

    我尝试使用 javascript 后备,但它真的没有任何意义,而且在大图像上真的很慢。这更有意义。请注意,grayscale 有一个新语法,我必须从 LESS 手动编辑生成的缩小 CSS。

    这是我的混音:

    .filter (...) {
        -webkit-filter: @arguments;
        -moz-filter: @arguments;
        -ms-filter: @arguments;
        -o-filter: @arguments;
        filter: @arguments;
    }
    

    还有我的班级:

    .grayscale-hover, .home-image {
        filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale"); /* Firefox 10+, Firefox on Android see http://jsfiddle.net/KDtAX/487/*/
        .filter(grayscale(1) blur(1px));
        filter: gray; /* IE6-9 */
        -webkit-backface-visibility: hidden; /* Fix for transition flickering */
        &:hover {
            .filter(none);
            filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'1 0 0 0 0, 0 1 0 0 0, 0 0 1 0 0, 0 0 0 1 0\'/></filter></svg>#grayscale");
        }
    }
    

    在 IE 6+、Firefox、Chrome 中工作和测试。

    【讨论】:

    • 嘿,谢谢。 +1 表示彻底的工作,但它是否在 Safari 5.1 中工作,正如我在我的 OP 中询问的那样?我现在无法访问该浏览器。正如我在 OP 中提到的那样,使用 data: url 内联 svg 过滤器在某些旧版本的 FF(例如 4.0.1)中不起作用。
    【解决方案3】:

    是这样的:

    .grayscale {    
       filter: url(css/grayscale.svg#greyscale);    
       -webkit-filter: grayscale(1);    
       -moz-filter: grayscale(100%);    
       -ms-filter: grayscale(100%);    
       -o-filter: grayscale(100%);    
    } 
    

    您也需要下载 svg 文件。

    【讨论】:

    • 欢迎来到 Stack Overflow!感谢您发布您的答案!请务必仔细阅读FAQ on Self-Promotion。另请注意,每次链接到您自己的网站/产品时,都要求发布免责声明。我正在删除您的链接,以便没有人将此标记为垃圾邮件。
    【解决方案4】:

    这个对我很有用:


    img { float:left;
    filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\' filterRes=\'800\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale"); /* Firefox 10+ */
        filter: gray; /* IE6-9 */
        -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */
        -webkit-backface-visibility: hidden; /* Fix for transition flickering */
        -webkit-transition: all 1.5s ease;
           -moz-transition: all 1.5s ease;
            -ms-transition: all 1.5s ease;
             -o-transition: all 1.5s ease;
                transition: all 1.5s ease;
                z-index: 40 !important;
                 display:block;
    
     }
    
    img:hover { 
      filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\' filterRes=\'800\'><feColorMatrix type=\'matrix\' values=\'1 0 0 0 0, 0 1 0 0 0, 0 0 1 0 0, 0 0 0 1 0\'/></filter></svg>#grayscale");
        -webkit-filter: grayscale(0%);}
    

    然而,这些图像在 Safari 中看起来确实过度曝光(但它们是灰度的)。 Firefox 不支持转换。

    【讨论】:

      猜你喜欢
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      • 2013-04-26
      • 2021-04-11
      • 2017-11-25
      • 2013-04-30
      • 2011-11-08
      • 1970-01-01
      相关资源
      最近更新 更多