7种方法改变PNG图标颜色

4,618 阅读3分钟

在处理网页或应用程序的图标时,我们有时需要动态或静态地更改图标的颜色。虽然PNG图标由于其具有透明性和高质量而广受欢迎,但它们不像SVG图标那样容易改变颜色。本文介绍 7 种改变PNG图标颜色的方法:

可以将这些方法重新组织为两大部分:兼容性方案CSS3新特性

使用CSS3新特性

1. 使用CSS的tint属性(实验性)

在一些支持该属性的浏览器中,你可以使用-webkit-mask-box-imagetint色值来给图标上色。这是一个实验性的CSS3特性。

.icon {
  -webkit-mask: url('path/to/icon.png') no-repeat;
  -webkit-mask-size: 100%;
  -webkit-mask-box-image: tint(#ff0000); /* 将图标颜色变为红色 */
}

2. 使用SVG作为轮廓并填充颜色(利用CSS3的mask属性)

对于简单的图标轮廓,可以使用SVG,并通过CSS3的mask属性应用PNG图标作为蒙版。这样可以通过改变SVG的颜色来改变图标颜色。

.icon {
  width: 100px;
  height: 100px;
  -webkit-mask-image: url('path/to/icon.png');
  mask-image: url('path/to/icon.png');
  background-color: red; /* 设置你需要的颜色 */
}

这种是我在工作中用的比较多的做法,比如说,现在要将下面的图标染成彩色的:

Calendar_Unselect.png

3. 使用CSS滤镜效果

CSS3引入了滤镜效果,虽然不能直接改变图标的颜色,但可以创建各种视觉效果,从而间接改变图标的外观。

.icon {
  filter: brightness(0) saturate(100%) invert(30%) sepia(100%) saturate(500%) hue-rotate(180deg);
}

请注意,这些分类是基于技术特性和浏览器支持情况。随着时间的推移,一些CSS3特性可能会变得更加广泛支持,从而迁移到兼容性方案类别中。

传统的兼容性方案

1. 使用多个PNG图标

对于需要支持多种颜色的图标,可以准备多个颜色的PNG图标版本,并使用CSS类来切换显示。

.icon-red {
  background-image: url('path/to/icon-red.png');
}

.icon-blue {
  background-image: url('path/to/icon-blue.png');
}

2. 使用CSS Sprites技术

CSS Sprites允许你通过改变背景位置来显示不同的图标部分,这对于有多个颜色版本的图标非常有效。

.icon {
  background: url('path/to/icons-sprite.png') no-repeat;
  width: 16px;
  height: 16px;
}

.icon-red {
  background-position: 0 0;
}

.icon-blue {
  background-position: -16px 0; /* 假设图标宽度为16px */
}

3. 使用JavaScript动态修改

JavaScript可以用于根据用户交互或其他条件动态地更改图标。

var iconElement = document.getElementById('iconElement');
iconElement.style.backgroundImage = 'url(path/to/icon-blue.png)';

4. 使用HTML5 Canvas

通过HTML5 Canvas API可以动态地绘制和着色PNG图标。

var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var img = new Image();
img.onload = function() {
  ctx.drawImage(img, 0, 0);
  ctx.globalCompositeOperation = 'source-atop';
  ctx.fillStyle = 'rgba(255, 0, 0, 1)'; // 纯红色
  ctx.fillRect(0, 0, canvas.width, canvas.height);
};
img.src = 'path/to/icon.png';

对于使用canvas的做法,我只能说这属于大杀器了,毕竟操作像素级别的改变可以解决绝大多数问题。不过由性能问题,但是性能问题可以在 web worker 中解决,所以这种做法虽然麻烦了一些但是可以作为兜底的方案。