我有两张图片,其中一张是叠加在第一张图片上的小图标。我的图标有一个白色背景,所以当图标放在另一个图像上时,我们会得到这样的效果,即在图像上出现一个白色方块。理想情况下,我不想在我的其他图像之上显示这个白色背景。是否有一个 CSS 属性可以应用于我的图标以使其白色背景透明?
5 回答
实际上有一种方法,虽然目前只在 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 行的函数。并在 div(或伪元素)中使用生成的 rgba 颜色来覆盖图像。opacitator
由于没有可靠的方法来使用 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`);
}
您可以为您的图像制作一个容器。然后对于容器的css:
overflow:hidden; height: (depends on your image, then make it a smaller px); width:100%;
希望能帮助到你。:)