by zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=8187

本文可全文转载,个人网站无需授权,只要保留原作者、出处以及文中链接即可,任何网站均可摘要聚合,商用请联系授权。

一、开始,关于图标变色,引言

上周写了篇文章,利用filter:hue-rotate色调旋转滤镜改变按钮颜色进行复制,后来我就一想,利用滤镜岂不是可以很方便改变小图标的颜色,这样,SVG图标作为背景图使用也没有任何问题了。

其实以前写过一篇文章——“PNG格式小图标的CSS任意颜色赋色技术”,用的是drop-shadow,优点是可以任意颜色,不足就是有些小啰嗦。

所以,我要研究下,有没有使用简单的的赋色技术;以及研究下有没有滤镜以外的其它技术可以修改小图标颜色!

结果,还真发现了不少好玩的东西。

二、图标变成黑色或白色的技巧

先从简单的说起。

有下面这个图标:

如果要变成纯黑色,或者纯白色,则可以这样:

/* 图标变黑色 */

.black {

filter: brightness(0);

}

/* 图标变白色 */

.white {

filter: brightness(100);

}

也就是使用亮度滤镜,要想变成黑色,很简单,设置亮度为0即可,保证黑如焦炭;如果想要变成白色,则亮度设成很大很大的值就好了,例如100,保证白如奶昔。

实现后的效果如下截图:

三、图标变色为任意指定颜色

黑白色确实简单,但实际开发时候,往往是黑色图标变成彩色,那可该怎么办呢?

可以实现!

CSS3 filter滤镜有调整色调的hue-rotate,有调整饱和度的saturate滤镜,有调整亮度的brightness滤镜,有调整对比对的contrast滤镜等,把这些滤镜进行组合,进行色值变换,总会得到我们希望的颜色的。

关键如何变呢?

嘿嘿!我花了2晚上时间学习、探索与研究,终于弄出了一个任意色值通过filter滤镜进行转换的在线工具。

使用和转换示意如下GIF:

第一个输入框输入原始的图标颜色,下面输入框输入图片目标颜色,点击“转换”按钮,对应的filter CSS代码就生成了。

注意注意注意

由于部分滤镜渲染并非是线性的,因此最终转化后的颜色并非100%完全一致,可能会出现误差。

请不要担心,再次点击“转换”按钮,尝试其他的滤镜组合①,找到最精确的那个filter代码。

举例说明

例如,原始色是:#000000,目标色非web安全色,是#f4615c。

填入到工具对应输入框,点击“转换”按钮,结果如下:

可以看到色值误差较大,请不要担心,再多点几次“转换”按钮,尽量找到误差值在2以内的色值,如下GIF示意:

虽然最终色值会有偏差(越远离安全色出现偏差概率越大),但对于用户而言,根本没有影响,华为手机边缘蓝光不也照样使用。对于设计师,也完全不要担心,放心使用,他们是根本无法区分屏幕上#f5615c和设计稿中#f4615c和的差别的。即使是全球几个罕见4色视觉人也无法区分,毕竟是不同设备的显示器。

同一色值可以有多种滤镜组合呈现的,例如黑色转白色,可以亮度滤镜,也可以直接反相滤镜。每次点击工具页的“转换”按钮,都会会尝试一种匹配。其底层是不同视觉系数的计算值的相互组合,类似计算灰度有下面两种算法:

W3C方法(工作草案): L = (red * 0.299 + green * 0.587 + blue * 0.114) / 255

三、使用滤镜让图标变彩色实战

还是这个图标:

下面要变成#f4615c色值图标。

原始值是#2486ff,目标值是#f4615c,借助工具,得到如下CSS:

filter: invert(52%) sepia(82%) saturate(2494%) hue-rotate(327deg) brightness(104%) contrast(92%);

结果如下截图:

四、CSS遮罩实现任意颜色图标

这个是相比上面的滤镜更好的实现方法,性能要比滤镜好,色值定义也更简单。

一例胜千图

还是这个图标:

下面要变成#f4615c色值图标。

如下HTML和CSS代码就好了:

.colorful {

display: inline-block;

width: 32px; height: 32px;

background-color: #f4615c;

-webkit-mask: url(./xin.svg) no-repeat;

mask: url(./xin.svg) no-repeat;

-webkit-mask-size: 100% 100%;

mask-size: 100% 100%;

}

CSS3 mask默认是基于透明度实现遮罩效果的。也就是实色区域显示,透明区域隐藏。因此,我们只需要把目标图标颜色#f4615c作为背景色,然后原始图标(无论什么颜色都可以)作为遮罩图片,效果就出来了。

效果如下截图:

CSS mask学习

CSS3遮罩非常好用,熟练掌握事半功倍,其知识点很多,包含的属性值也很多,有兴趣可以参考我之前的文章:“CSS遮罩CSS3 mask/masks详细介绍”,非常系统的介绍了相关知识点。

五、新增:借助background-blend-mode混合模式

本方法有2个限制,首先原图片必须是纯黑色的,如果是彩色的,颜色会混淆在一起;其次非图形部分必须是白色,不能是透明,因为透明会被当做黑色处理。

换成下面这个黑色白底图标:

下面要变成#f4615c色值图标。

如下HTML和CSS代码就好了:

.colorful {

display: inline-block;

width: 32px; height: 32px;

background-image: url(./xin.png), linear-gradient(#f4615c, #f4615c);

background-blend-mode: lighten;

background-size: 100%;

}

混合模式lighten可以让任意颜色和黑色混合的时候,保留原始色彩。由于我们图标黑色白底,和任意渐变图片混合,都会在黑色图形区域留下渐变图形的颜色。于是,效果达成!

效果如下截图:

六、最后,关于转换工具,结语

正文部分结束,下面可以安心地东扯西扯了。

filter色值转换工具我一开始想得比较天真,颜色值不是可以HSB表示嘛(web中是HSL,PS中是HSB,两者有差别,),不正好对应filter的色调,饱和度和亮度滤镜嘛,我想计算出前后颜色的HSB值,再一比较,设置在filter上,色值不就转换好了。

一番实践下来发现,设计偏差还相当明显,根本不能拿出来用。因为S和B可以大于100%,且没有上限,具体如何渲染并不是一种线性的关系,只通过简单线性计算是很难实现准确的转换的,需要对矩阵比较了解。于是我自己又尝试去研究feColorMatrix的算法,发现自己的积累还不够,数学不是很强,图形领域也未深入,无法驾驭。

后来,在stackoverflow上找到纯filter滤镜转换黑色为其它颜色的问题,其中提供了一些解决方案。

还是得站在巨人的肩膀上,对原算法进行了一些优化,包括支持任意颜色filter转换,原算法是仅黑色;优化了误差的算法,原算法有较大问题,有时候明明视觉差异明显,却显示误差很小;增加了滤镜转换之后的渲染颜色的输出。就这样一个纯filter变色的在线小工具诞生了。

虽然这个filter变色工具很有技术含量,但是,并不表示使用filter是最好的图标变色方法。如果条件允许(有HTML操作权限),我建议优先使用mask遮罩实现任意图标的变色,兼容性更好,性能更好,颜色100%精准,可以在移动端项目中使用,如果对于一些杂牌Android不在意的话。

如果我们的图标是用的或者标签直连的,则此时,使用filter变色要更合适。

没有无用的技术,只是适用场景宽窄有别而已!

SVG图标和PNG图标

如果是SVG图标,更好的变色处理是SVG Sprites技术,直接fill或color属性控制颜色,兼容性直达IE9。

如果是PNG图标,则多半就要考虑使用本文提供的方法了。

好,扯完了。

感谢阅读,欢迎纠错!欢迎交流!

本文为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。

本文地址:https://www.zhangxinxu.com/wordpress/?p=8187

(本篇完)

html点击后变色6,纯CSS实现任意格式图标变色的研究相关推荐

  1. css信号强度显示,纯css实现wifi信号图标及强弱/链接/加密状态

    分享一段自己写的纯css实现的wifi连接的各种状态代码,希望能帮助到一些学习的朋友.默认图标大小为20px,已经通过transform放大,具体的可以见详细代码及预览. 运行代码 纯css实现wif ...

  2. html三角形小图标,纯css实现全兼容三角形图标

    在当前流行的的网站上,我们经常会看到一些小三角形的下拉提示(微博顶部的下拉菜单),简单的方式可以使用一张图片代替,但是随着前端技术的发展,以及开发者对于前端性能的"吹毛求疵",越来 ...

  3. css 图标点击变色,纯CSS实现小图标变色的一些研究

    by zhangxinxu from www.zhangxinxu.com/wordpress/?- 本文可全文转载,个人网站无需授权,只要保留原作者.出处以及文中链接即可,任何网站均可摘要聚合,商用 ...

  4. 纯CSS菜单样式,及其Shadow DOM,Json接口 实现

    先声明,要看懂这篇博客要求你具备少量基础CSS知识, 当然如果你只是要用的话就随便了,不用了解任何知识 先放一张效果图         Part 1:纯CSS菜单样式 先放样式代码 1 <sty ...

  5. 纯css实现鼠标悬浮、点击更改元素背景

    一.使用方案 css伪类 active:元素被点击时变色,点击后颜色消失 focus:元素被点击后变色,点击后颜色不消失 hover:鼠标悬浮时变色,移除后颜色消失 二.代码 template部分代码 ...

  6. 纯CSS实现圆角阴影的折角效果

    纯CSS实现圆角阴影的折角效果  2016-10-04 13:14   网页设计   标签:css   1637    2 把元素的一角处理类似折角的形状,再配上或多或少的修饰,这种效果已经成为一种非 ...

  7. 如何用纯 CSS 实现优惠券效果

    ​ 背景 本文来自CODE.FUN  ,讲述如何用纯 CSS 实现优惠券效果的实践案例,分享给大家. 优惠券视觉效果 上面是优惠券的视觉效果,本文分享如何使用纯 CSS 实现它的主要框架,希望对大家有 ...

  8. 用纯css模拟下雪的效果

    下雪效果只是一类效果的名称,可以是红包雨等一些自由落体的运动效果,本文就是用纯css模拟下雪的效果,更多效果大家可以自行发挥. 1.前言 由于公司产品的活动,需要模拟类似下雪的效果.浏览器实现动画无非 ...

  9. 如何使用纯 CSS 制作四子连珠游戏

    序言:你是否想过单纯使用 CSS 也可以制作一款游戏?甚至可以双人对决!这是一篇非常有趣的文章,作者详细讲解了使用纯 CSS 制作四子连珠游戏的思路以及使用奇淫巧技解决困难问题的方法.因为案例本身比较 ...

最新文章

  1. 神经网络模拟逻辑推理-演绎推理
  2. Gateway网关-路由断言工厂
  3. api 定位 微信小程序 精度_聊聊微信小程序内置地图定位的精确性
  4. java 控制台输入字符串_Java控制台输入字符串及字符串比较
  5. ajax返回list前台遍历_List、set集合接口分析
  6. 《PHP、MySQL和Apache入门经典(第5版)》一2.7 基本安全规则
  7. windows 2003 server安装iis6,附下载文件
  8. Teechart 的用法详解:在VC6.0 跟Visual Studio 2005及之后版本的区别
  9. 用计算机解决对长江水源治理的问题,科学调控长江水资源的思考
  10. 重启打印机(打印机任务无法取消时)
  11. css背景颜色设置后没生效
  12. Linux基础教程: 4、用户组和用户的创建
  13. 【分享】ArcGIS实现分子分母等标注实用技巧
  14. 车型识别API调用对比
  15. AngularJS动态加载Controller
  16. docker学习笔记---基础入门
  17. conda,anaconda,miniconda的区别
  18. JAVA面试题(选择题)
  19. 用一条sql语句判断两个日期是否处于同一月份!
  20. BUUCTF:被劫持的神秘礼物

热门文章

  1. Java生成证书用HTTPS进行访问
  2. Hilt 介绍 | MAD Skills
  3. Nasm汇编GDB调试
  4. c语言编程 猴子吃桃子,C语言实现猴子吃桃问题(循环、递归两种方法)
  5. oracle sysdate设置
  6. 解决mac系统下无法手动设置ip的问题
  7. php实现seo伪原创,同义词替换
  8. 开放申请 | 2022腾讯AI Lab犀牛鸟专项研究计划
  9. Activity生命周期管理
  10. 基于JPA实现的动态查询工具类