FROM: http://www.zhangxinxu.com/wordpress/2016/06/png-icon-change-color-by-css/
CSS可以修改图片的颜色
.icon {
display: inline-block;
width: 20px; height: 20px;
overflow: hidden;
}
.icon-del {
background: url(delete.png) no-repeat center;
}
.icon > .icon {
position: relative;
left: -20px;
border-right: 20px solid transparent;
-webkit-filter: drop-shadow(20px 0);
filter: drop-shadow(20px 0);
}
<p><strong>原始图标strong>p>
<i class="icon icon-del">i>
<p><strong>可以变色的图标strong>p>
<i class="icon"><i class="icon icon-del">i>i>
上面的不是很黑的是原始图标,是个PNG图片,下面这个是可以赋色的:
是不是感觉很厉害!以后设计师就不需要在提供几套颜色的图片了。
SVG, icon fonts等技术似乎也不是那么耀眼了。
原理其实很简单,使用了CSS3滤镜filter
中的drop-shadow
,drop-shadow
滤镜可以给元素或图片非透明区域添加投影。
对于背景透明的png小图标而言,如果我们施加一个不带模糊的投影,不就等同于生成了另外一个颜色的小图标了吗?
然后,我们把原始图标隐藏在容器外面,投影图标在容器中间,不见给人感觉是赋色效果了?
比方说本文的demo,如果把icon父级的的overflow:hidden
去掉,原始的图标就暴露出来啦!
原理如上面,我一开始实现的时候,以为很简单,因为分分钟可以实现自己的想法,后来发现有些天真了,Chrome浏览器怎么都显示不出来;FireFox浏览器却可以!咦,究竟发生了什么。
在Chrome浏览器下,drop-shadow
有一个如下的呈现特性:
在Chrome浏览器下,如果一个元素的主体部分,无论以何种方式,只要在页面中不可见,其drop-shadow是不可见的;实体部分哪怕有1像素可见,则drop-shadow完全可见。
所以,我试过:
通通不行,实现遇到了巨大的阻碍。
后来,灵光一现,如果我实体部分也在可视区域内,但是是透明的,会怎样呢(反正不会有投影出来)?
于是,我就试了下曾经立下无数战功的透明边框,卧槽,又立功了,成了!
因此,下面这一个CSS声明是千万不能少的:
border-right: 20px solid transparent;
IE13+支持,Chrome和FireFox浏览器支持,移动端iOS支持,Android4.4+支持。也就是,基本上,移动端现在可以使用这种技术了。
既节约了流量,也让我们的开发更简单,维护更方便了。
box-shadow
, 第二个就是使用CSS3的
filter
阴影滤镜
drop-shadow
,那这两个阴影实现有什么具体的差异呢?
box-shadow
从IE9浏览器开始就支持了;
filter
中的drop-shadow
IE13才开始支持,移动端Android4.4才开始支持 filter
中的drop-shadow
语法如下:
filter: drop-shadow(x偏移, y偏移, 模糊大小, 色值);
例如:
filter:drop-shadow(5px 5px 10px black)
表示右下5像素偏移,10像素模糊的黑色阴影。眼见为实,看下面的图片示意(实时效果,请使用Chrome或手机浏览器查看):
但是,如果使用同样参数值的box-shadow
,例如:
box-shadow: 5px 5px 10px black;
会发现,box-shadow
的阴影距离更小,色值要更深:
box-shadow
支持inset
内阴影,如:
box-shadow: inset 5px 5px 10px black;
但是,drop-shadow
却没有。
box-shadow
有个超屌的特性,就是阴影可以任意累加,因此,理论上我们可以使用box-shadow
生成任意的图片,包括张含韵妹子年轻时候的写真,具体可参加“CSS3 box-shadow盒阴影图形生成技术”一文。
但是filter
中的drop-shadow
就只能抱歉了,我就是一锤子买卖。没钱也这么任性!
说到现在,体现的尽是drop-shadow
的不好,兼容性不够,内阴影不支持,多阴影也不支持;感觉就像是小蚯蚓,失恋了,工作也没了,存在的意义好像就成了白富美的谈资。
真的是这样吗?显然非也!所谓存在既有道理。
drop-shadow
有一个很厉害的特性,也就这一个特性,让其以后有足够的机会大放异彩!那就是,drop-shadow
才是真正意义上的投影,而box-shadow
只是盒阴影而已。
什么意思呢?
实践出真知,下面我们用CSS border
写一个虚线框,例如:
border: 10px dashed #beceeb;
结果长相如下:
然后,我们分别应用box-shadow
和drop-shadow
滤镜:
border: 10px dashed #beceeb; box-shadow: 5px 5px 10px black;
border: 10px dashed #beceeb; filter: drop-shadow(5px 5px 10px black);
结果:
怎么样?是不是本性暴露了!
box-shadow
顾名思意“盒阴影”,只是盒子的阴影;你想啊,这盒子中间明明是透明的,结果,阴影的时候,居然光线没有穿透;但是drop-shadow
就符合真实世界的投影,非透明的颜色,我就有投影;透明部分,光线穿过,没投影,而什么盒子不盒子的,跟我没有任何关系。
drop-shadow
不仅可以穿透代码构建的元素的透明部分,PNG图片的透明部分也是可以穿透的,如下图:
于是,曾经困扰我们的一些老大难的问题就有了很好的解决思路了!
我们实现带有箭头指向的浮层面板的时候,考虑到兼容性,三角基本上都是使用border
绘制的,没法box-shadow
,但是,矩形部分设计师希望是有阴影的,于是,就会出现下图所示的情况:
箭头没有阴影,蒙混过关。
后来,又捣腾了一个办法,就使用矩形进行45deg旋转,两个box-shadow
合体,但是,会存在阴影重叠的一部分,说穿了,还是效果不完美。
现在,有了drop-shadow
,阴影就真的变成了阴影了。
CSS代码:
.box {
margin: 40px; padding: 50px;
background-color: #fff;
position: relative;
font-size: 24px;
}
.cor {
position: absolute;
left: -40px;
widtd: 0; height: 0;
overflow: hidden;
border: 20px solid transparent;
border-right-color: #fff;
}
.box-shadow {
box-shadow: 5px 5px 10px black;
}
.drop-shadow {
filter: drop-shadow(5px 5px 10px black);
}
HTML代码:
box-shadow
filter: drop-shadow
低版本IE浏览器下,其实也有Shadow
滤镜,不过是IE的私有滤镜。如果想要实现兼容IE9+的投影效果,估计要借助SVG来实现了。