【发布时间】:2021-02-26 06:52:12
【问题描述】:
我在用作全局背景的页面上有一些内容。
我在上面使用position: absolute 放置了一个精灵(div 和background-image: url(...),通过修改background-position 来改变帧)。精灵是带有 alpha 通道的 PNG。
现在我正在尝试为该图像添加一些色调(绿色或蓝色或其他)。
我研究了类似的问题,显然唯一可能的解决方案是:
- 在精灵顶部创建一个
div,所需颜色为background-color,所需色调强度为opacity,原始精灵图像为mask-image(并设置mask-type: alpha)。虽然它应该在纸上工作,但实际上并没有——这个新的div只是不可见的:( - 使用
mix-blend-mode覆盖颜色div并指定类似multiply或overlay的内容。只要全局背景为黑色,它就会产生完美的效果。如果是其他东西 - 它会包含在计算中,并且覆盖层div也会对其进行修改,生成一个着色矩形而不是着色精灵... - 使用此处回答中所述的 SVG 过滤器:https://stackoverflow.com/a/30949302/306470。 我还没有尝试过这个,但是对于这项任务来说感觉不必要的复杂。我也担心这里的性能,如果屏幕上同时有多个着色精灵会减慢很多吗?如果有人对此有经验-请在此处发表评论:)
- 使用不可见的
canvas准备一个着色版本的精灵。听起来更复杂,缺点是必须花时间准备精灵的着色版本,但是一旦准备好就应该像原始精灵一样快吗?不过,实现应该相当复杂。纯 CSS 解决方案会好得多...
我错过了什么吗?还有其他选择吗?或者我应该选择#3 还是#4?
【问题讨论】:
-
尝试
filter: hue-rotate(Xdeg)更改X的值以满足您的要求 -
谢谢!我已经考虑过了,但它只适用于或多或少的单色调图像,我应该在应用过滤器之前知道该色调。
-
如果您的图像不是动态的,您可以为每个图像找到所需的色调旋转,将它们添加到对象中,然后使用 js 动态应用过滤器。但如果您有很多图像或图像是用户生成的,则可能不适用
-
图像不是用户生成的,但我可能会有很多图像,手动查找正确的色调并不是一个真正的选择。不过还是谢谢你的建议!
-
您可以使用 JS 获取图像的位置 getBoundingClientRect() 然后将覆盖元素的位置设置为具有更高 zindex 的绝对位置,然后使用 rect.top、rect.left您的图像设置将它们设置为叠加层,以便它们位于顶部。使用 this.width 和 this.height 获取图像的宽度和高度,并将覆盖元素设置为这些宽度和高度。将覆盖元素的 backgroundColor 设置为所需的 RGB,不透明度为 (0, 255, 0, 0.5) => 绿色覆盖或随机化 RGB,不透明度设置为 0.5,使其起到过滤器的作用。
标签: html css sprite transparency tint