我有两张图片,其中一张是小图标,另一张是底图。我的图标有白色背景,当将其放置在底图上时,会出现一个白色方块覆盖在底图上的效果。理想情况下,我不想在另一张图片上显示这个白色背景。有没有CSS属性可以应用于我的图标,使它的白色背景变为透明的?
实际上,目前只有Chrome、Firefox和Safari支持,但是有一种方法。如果背景颜色是白色,你可以添加CSS属性:
mix-blend-mode: multiply;
您可以在这里阅读更多相关信息:https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode
mix-blend-mode
可以在某些浏览器上使用,但我们发现它会在Chrome浏览器中导致性能问题,我不知道为什么。
我的团队中的一位设计师提出了这个天才的技巧,它创建了一个图层,该图层基本透明,但是当它铺在白色背景上时,它的颜色将与周围背景的颜色相匹配。
找到这个“神奇”的颜色的方法是通过计算每个颜色轴的变暗程度来确定删除的不透明度量。 公式为
255 - ( 255 - x ) / opacity
。问题在于:如果不透明度设置得太低,则公式会给出负数(无法使用)。 如果不透明度太高,则您将在图像的非白色部分获得一些上色。
最初,我们使用电子表格进行计算,并通过手动试错找到那个Goldilox颜色。
一旦我们开始使用Sass,我意识到这可以通过二进制搜索完成。 所以我创建了一个Sass函数来为我们完成这项工作。
请查看此代码片段在SassMeister中。在Sass代码的第56行中,将您的背景颜色传递到opacitator
函数中,并在一个div(或伪元素)中使用生成的rgba颜色来覆盖图像。
我还创建了一个CodePen实例。
由于CSS没有可靠的方法来删除背景,所以分享一下使用JS进行操作的代码片段:
public async removeImageBackground(image) {
const backgroundColor = { red: 255, green: 255, blue: 255 };
const threshold = 10;
const imageElement = new Image();
imageElement.src = image;
await new Promise(function(resolve) { imageElement.addEventListener('load', resolve); });
var canvas = document.createElement('canvas');
canvas.width = imageElement.naturalWidth;
canvas.height = imageElement.naturalHeight;
var ctx = canvas.getContext('2d');
ctx.drawImage(imageElement, 0, 0);
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
for (var i = 0; i < imageData.data.length; i += 4) {
const red = imageData.data[i];
const green = imageData.data[i + 1];
const blue = imageData.data[i + 2];
if (Math.abs(red - backgroundColor.red) < threshold &&
Math.abs(green - backgroundColor.green) < threshold &&
Math.abs(blue - backgroundColor.blue) < threshold) {
imageData.data[i + 3] = 0;
}
}
ctx.putImageData(imageData, 0, 0);
return canvas.toDataURL(`image/png`);
}
overflow:hidden; height: (depends on your image, then make it a smaller px); width:100%;