【问题标题】:Overlay non-transparent area of image with CSS用 CSS 覆盖图像的不透明区域
【发布时间】:2015-09-24 20:59:37
【问题描述】:

我对动态修改具有透明背景的图像感兴趣,并使用 CSS 来实现。

我真正需要的是创建一种轮廓,以便所有不透明的像素都应用颜色。在这种情况下,布莱克。

之前和之后应该是这样的:

请注意,两张图片都有透明背景。

有没有一种方法可以使用 CSS 来执行此操作?

如果没有,是否有一种简单的方法可以在客户端、网页上下文中生成轮廓并在两个图像之间切换?可以假设是现代浏览器。

非常感谢任何形式的帮助。

【问题讨论】:

  • 使用图像编辑器或某种编程语言。这不是 CSS 的工作。
  • 谢谢,尽管如上所述,这必须动态完成,因为我无法预测要使用的图像。如果这是一个单一的图像,我不会打扰。话虽如此,如果 CSS 的袖子里有一个技巧,我不会感到惊讶。
  • 这可以在 CSS 中完成,给我几分钟。
  • filter: grayscale(100%) contrast(0%) brightness(0%); 玩弄这个,但我猜它不能完全满足您的需求
  • @TinyGiant 这对于 css 来说是一项很棒的工作,它更加灵活:您可以为任何上传的图像处理此问题,而无需服务器图像处理开销,对于可能准备图像的内部网站,您不需要'不需要每个管理员都能使用 photo-shop

标签: image css image-manipulation


【解决方案1】:

使用 webkit 过滤器可以实现这样的效果:

img {
    -webkit-filter: grayscale(100%);
    -webkit-filter: contrast(0%);
    -webkit-filter: brightness(0%);
}

img:hover {
    -webkit-filter: grayscale(0%);
    -webkit-filter: contrast(100%);
    -webkit-filter: brightness(100%);
}

还有一个 jsfiddle 来演示:http://jsfiddle.net/7Ljcgj79/

请注意this method won't be support on all browsers。要支持 IE,您可以将其设置为 background-image 并在悬停时更改它。


使用两个图像以获得更好的浏览器兼容性

如果您愿意使用两张图片,只需在hover 上交换图片,您就可以通过更广泛的浏览器支持实现相同的效果。像这样的:

div {
    height: 400px;
    width: 400px;
    background-image: url('http://i.stack.imgur.com/Pmz7l.png');
    background-repeat: no-repeat;
}

div:hover {
    background-image: url('http://i.stack.imgur.com/gZw5u.png');
}

还有一个更新的小提琴:http://jsfiddle.net/7Ljcgj79/2/


支持所有颜色的改进示例

我已经有一段时间没有访问这个帖子了,我现在肯定看到它可以改进(我所要做的就是将亮度设置为 0%,没有其他必要,实际上没有任何效果)。不过,我想给出一个更新的答案,以回应评论。此解决方案需要更多工作,但支持所有颜色,而不仅仅是黑色!以下是重要的部分:

HTML

<svg>
    <filter id="monochrome" color-interpolation-filters="sRGB">
        <!-- change last value of first row to r/255 -->
        <!-- change last value of second row to g/255 -->
        <!-- change last value of third row to b/255 -->
        <feColorMatrix type="matrix" 
            values="0 0 0 0 0.6588 
                    0 0 0 0 0.4745 
                    0 0 0 0 0.1686 
                    0 0 0 1 0" />
    </filter>
</svg>

CSS

img {
    -webkit-filter: url(#monochrome);
    filter:  url(#monochrome);
}

img:hover {
    filter: none;
}

还有一个更新的小提琴:http://jsfiddle.net/7Ljcgj79/16/

这项技术利用了&lt;fecolormatrix&gt;,基本上是定义您自己的过滤器的高级功能。我在这里所做的是将所有颜色通道调低为零(前四列全为零),然后向它们添加我需要的常量值(即最后一列)。确保在您的 &lt;filter&gt; 标签中有 type="matrix" 并且在您的 &lt;fecolormatrix&gt; 中设置 color-interpolation-filters="sRGB" 否则它会以不同的方式解释您的矩阵。

如果您想了解更多信息,这些帖子非常有帮助:https://alistapart.com/article/finessing-fecolormatrixhttps://css-tricks.com/color-filters-can-turn-your-gray-skies-blue/

【讨论】:

  • 干得好,我知道这是过滤器,我只是没有使用它们来快速回答 - 你应该链接到一些浏览器支持的东西,我认为这在这个例子中很重要跨度>
  • 无需仅限于 webkit:jsfiddle.net/orvn/7Ljcgj79/1(但不兼容 IE)
  • 如果您只想支持互联网上一半的用户,这是一个很好的解决方案。
  • @pgruber 我目前正在做类似的事情,但我希望有一个彩色滤镜,例如#a8792b 知道如何获得所需的输出吗?任何帮助将不胜感激。 :)
  • @DylanAnlezark 嘿,伙计,绝对是更大的挑战!但我想我找到了答案,请查看更新!
【解决方案2】:

你需要做两件事:

  1. 确保图像始终是具有透明背景的 PNG
  2. 使用filter 属性。

HTML

<img src="http://www.iceni.com/blog/wp-content/uploads/2013/08/EBay_logo.png">

CSS

img{
    -webkit-filter: drop-shadow(20px 0px 2px rgb(0,0,0));
    filter: url(#drop-shadow);
    -ms-filter: "progid:DXImageTransform.Microsoft.Dropshadow(OffX=12, OffY=12, Color='#000')";
    filter: "progid:DXImageTransform.Microsoft.Dropshadow(OffX=12, OffY=12, Color='#000')";
}

这是一个JSFiddle

【讨论】:

  • 感谢您的评论!我在 Edge/IE 上失败了。
猜你喜欢
  • 1970-01-01
  • 2011-08-04
  • 2013-02-25
  • 2011-08-27
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
相关资源
最近更新 更多