两行 CSS 代码实现图片任意颜色赋色技术

如何通过纯 CSS 技术实现任意图片的任意颜色赋色技术呢?

使用 background-blend-mode: lighten 实现任意图片颜色赋色技术

假设我们有这样一张图片,JPG、PNG、GIF 都可以,但是有一个前提要求,就是黑色纯色,背景白色:

利用 background-blend-mode ,我们可以在图片下叠加多一层其他颜色,通过 background-blend-mode: lighten 这个混合模式实现改变图片主体颜色黑色为其它颜色的目的。

简单的 CSS 代码示意如下:

.pic {
    width: 200px;
    height: 200px;
    background-image: url($img);
    background-size: cover;
}

.pic1 {
    background-image: url($img), linear-gradient(#f00, #f00);
    background-blend-mode: lighten;
    background-size: cover;
}

注意,上面 CSS 这一句是关键 background-image: url($img), linear-gradient(#f00, #f00); ,这里我叠加了一层渐变层 linear-gradient(#f00, #f00) ,实现了一个纯红色背景,而不是直接使用 #f00 实现红色背景。

使用 background-blend-mode: lighten 实现主色改为渐变色

这个方法更厉害的地方在于,不单单可以将纯×××片由一种颜色改为另一种颜色,而且可以将图片内的黑色部分由单色,改为渐变颜色!

简单的 CSS 代码如下:

.pic {
    background-image: url($img), linear-gradient(#f00, #00f);
    background-blend-mode: lighten;
    background-size: cover;
}

可以得到这样的效果:

OK,看到这里,大家伙肯定会有疑问了,这是怎么实现的呢?

这里就有必要解释一下 lighten 这个混合模式了。变亮,变亮模式与变暗模式产生的效果相反:

1.用黑色合成图像时无作用,用白色时则仍为白色
2.黑色比任何颜色都要暗,所以黑色会被任何色替换掉。反之,如果素材的底色是黑色,主色是白色。那就应该用变暗(darken)的混合模式

```
html

原图

红色

灰色

渐变色

```
```
css
$img: ‘https://user-images.githubusercontent.com/8554143/34239266-232bdfc0-e641-11e7-8792-408782aaa78e.png‘;
.pic {
width: 200px;
height: 200px;
margin: 50px;
text-align: center;
font-size: 42px;
line-height: 420px;
float: left;
background-image: url($img);
background-size: cover;
}
.pic1 {
background-image: url($img), linear-gradient(#f00, #f00);
background-blend-mode: lighten;
background-size: cover;
}
.pic2 {
background-image: url($img), linear-gradient(#333, #333);
background-blend-mode: lighten;
background-size: cover;
}
.pic3 {
background-image: url($img), linear-gradient(#f00, #00f);
background-blend-mode: lighten;
background-size: cover;
}
```
**局限性尝试 -- 使用透明底×××片**
上述方法要求了图片本身内容为纯色黑色,底色为白色。那么如果像 PNG 图片一样,只存在主色,而底色是透明的,是否能够同样实现效果呢?
假设我们有一张这样的 PNG 图片(灰色主色,透明底色):
![image](http://upload-images.jianshu.io/upload_images/13133049-0e593397cc32b305.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
按照上面的方式实现一遍,结果如下:
![image](http://upload-images.jianshu.io/upload_images/13133049-4f705a92dc83f8a5?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
很遗憾,当底色是透明的时候,会被混合模式混合上叠加层的颜色,无法使用。所有,这个技术也就存在了一个使用前提:
图片的底色为白色,主色为黑色
当然主色也可以是其他颜色,只是这个时候叠加需要考虑颜色的融合,没有使用黑色直观。
**background-blend-mode 实现图片任意颜色赋色技术总结**
综上,我们确实只需要两行代码就可以实现白色底色黑色主×××片的任意颜色赋色技术。
```
{
background-image: url($img), linear-gradient(#f00, #00f);
background-blend-mode: lighten;
}
```
其中,background-image 的第二值就是你希望赋值给的渐变色(当然,渐变色可以生成纯色)。
我们同时给一个标签设置了背景图片和渐变色,然后利用了 background-blend-mode:lighten 这个关键属性,达到了类似 PS 里的混合模式效果。
看起来 background-blend-mode 名为混合模式,但似乎表现上更像是 PS 当中的一种的剪切蒙板,混合模式是修改图片本身,蒙版跟遮罩都是在图片上一层通过叠加其他层对图像进行调整。
那么由此方法本身可以想到,一些能对图形进行色彩调整的 CSS 属性是否也能达到同样的功能呢?诸如:
- [ ] filter 滤镜
- [ ] mask-image
- [ ] mask-clip
感兴趣的读者可以自行尝试,在接下来的文章我也会继续进行探讨。
黑色纯色,背景白色可能局限了这个技巧的使用场景,但是在很多白色底色的页面中,这个方法还是可以很好的发挥作用,许多 ICON 图片不再需要两个或者更多个颜色的版本!
**background-blend-mode 兼容性**
相较于 mix-blend-mode,background-blend-mode 的兼容性会更好一点。所以本文所介绍的技术在移动端是存在用武之地的:
![image](http://upload-images.jianshu.io/upload_images/13133049-ef4ab2f4b6fb171f?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
最后
自己是一个五年的前端工程师
![](https://s1.51cto.com/images/blog/201901/17/2bd7323f745841751a2898fdffbceb62.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
点击:[加入](http://u6.gg/ek2NA)

原文地址:http://blog.51cto.com/14138686/2343975

时间: 2024-10-13 07:38:11

两行 CSS 代码实现图片任意颜色赋色技术的相关文章

《转》PNG格式小图标的CSS任意颜色赋色技术

转自张鑫旭的PNG格式小图标的CSS任意颜色赋色技术 一.眼见为实 CSS可以修改图片的颜色,没错,可以,眼见为实!您可以狠狠地点击这里:png小图标CSS赋色demo 上面的不是很黑的是原始图标,是个PNG图片,下面这个是可以赋色的: 下面,我们随意选择一个颜色,例如紫色,然后: 是不是感觉很厉害!以后设计师就不需要在提供几套颜色的图片了. SVG, icon fonts等技术似乎也不是那么耀眼了. 二.原理其实很简单 原理其实很简单,使用了CSS3滤镜filter中的drop-shadow,

PNG格式小图标的CSS任意颜色赋色技术

一.眼见为实 CSS可以修改图片的颜色,没错,可以,眼见为实!您可以狠狠地点击这里:png小图标CSS赋色demo 上面的不是很黑的是原始图标,是个PNG图片,下面这个是可以赋色的: 下面,我们随意选择一个颜色,例如紫色,然后: 是不是感觉很厉害!以后设计师就不需要在提供几套颜色的图片了. SVG, icon fonts等技术似乎也不是那么耀眼了. 二.原理其实很简单 原理其实很简单,使用了CSS3滤镜filter中的drop-shadow,drop-shadow滤镜可以给元素或图片非透明区域添

如何利用CSS代码使图片和文字在同一行显示且对齐

对于初学css的新手朋友来说,经常会遇到这样一个问题,当文字和图片出现在同一行或者同一个div里面的时候,在浏览器中运行出来的显示效果往往是在不同的行,那么,我们怎么才能利用CSS代码使图片和文字在同一行显示且对齐呢? 对于这种现象,方法有3种: 1.通过添加css的“vertical-align:middle;”: 2.如果图片是背景图片,可以在css中设置背景图片,然后设置文字的padding属性: 3.把文字和图片分别放入不同的div中. 经过多次的测试,上面三种方法都可以让图片和文字在同

页面定制CSS代码-博客侧边栏公告-页首Html代码-页脚Html代码

设置代码前说明:首先你得选用博客皮肤darkgreentrip,否则会出错 页面定制CSS代码: 说明:标注颜色位置可自行修改,第12行设置主页底层图片,可自行修改 #home { margin: 0 auto; width: 80%;/*原始65*/ min-width: 980px;/*页面顶部的宽度*/ background-color: rgba(245, 245, 245, 0.7); padding: 30px; margin-top: 50px; margin-bottom: 50

css代码添加背景图片常用代码

css代码添加背景图片常用代码 1 背景颜色 { font-size: 16px; content: ""; display: block; width: 700px; height: 0px; margin: 20px 0px;"> 2 背景图片 {background-image: url(url)|none} 3 背景重复 {background-repeat:inherit|no-repeat|repeat|repeat-x|repeat-y} 4 背景固定 {

CSS设置背景图片代码

CSS设置背景图片代码:设置背景图片并不难,但是有时候会忘记url的格式怎么写,之所以写这篇文章,就是让忘记者查询到,寄希望提供一定的帮助.代码如下: background-image:url(mytest/demo/small.jpg) 相关阅读:1.background属性可以参阅background属性用法详解一章节. 2.background-image可以参阅CSS的background-image属性一章节. 原文地址是:http://www.softwhy.com/forum.ph

页面定制CSS代码初探:页面变宽 文本自动换行 图片按比缩放

一.初识博客 初写博客,先在设置里选了个喜欢的模板 第一眼就爱上了呢!那极简的风格,我喜欢!!但是,应用后,却发现... 纳尼!模板上右侧那张漂亮的图片呢?!我的怎么什么都没有.没有图片好难看啊,瞬间无爱了,设置里找了下,->博客侧边栏公告 <-,在这里,放了张宽200px的图,好看多了马上,还是有图才不会那么单调~ 二.认识CSS 过了几天,打算写篇博,发现了一个重大的问题,怎么默认的宽度这么窄?那我放图片怎么办,而且,2边留那么多空白不浪费吗,留个5%就够了吧.于是乎,开始了2天的全折腾.

哀悼改变全站颜色为灰色CSS代码收藏

<style type="text/css">   *{       filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);        -webkit-filter: grayscale(100%);       -moz-filter: grayscale(100%);       -ms-filter: grayscale(100%);       -o-filter: grayscale(

css基础教程:对css代码精简

在进行web前端项目开发(http://www.maiziedu.com/course/web/)时,会对css代码进行精简,减少代码冗余,提高网页加载速度,也比较方便后期的维护,下面一起看看对css代码精简的方法: 使用简写属性及默认值 .header { margin-top: 10px; margin-right: 20px; margin-bottom: 30px; margin-left: 40px; } /* 可以使用简写属性 margin */ .header { margin: