您的位置:新葡亰496net > 新葡亰官网 > 新葡亰496net:PNG格式小图标的CSS任意颜色赋色技

新葡亰496net:PNG格式小图标的CSS任意颜色赋色技

发布时间:2019-08-24 13:35编辑:新葡亰官网浏览(122)

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

    2016/06/08 · CSS · 1 评论 · PNG

    原文出处: 张鑫旭(@张鑫旭)   

    本内容只要是对张鑫旭PNG格式小图标的CSS任意颜色赋色技术的这篇文章进行详细说明。

    CSS3 filter:drop-shadow滤镜与box-shadow区别应用

    2016/05/19 · CSS · box-shadow, drop-shadow

    原文出处: 张鑫旭(@张鑫旭 )   

    要使用标准的CSS3实现某元素的投影效果,有两个套路,第一个就是使用常见的box-shadow, 第二个就是使用CSS3的filter阴影滤镜drop-shadow,那这两个阴影实现有什么具体的差异呢?

    首先介绍一下,css3中有两个属性可设置投影,分别是:

    一、眼见为实

    CSS可以修改图片的颜色,没错,可以,眼见为实!您可以狠狠地点击这里:png小图标CSS赋色demo

    上面的不是很黑的是原始图标,是个PNG图片,下面这个是可以赋色的:

    新葡亰496net 1

    下面,我们随意选择一个颜色,例如紫色,然后:
    新葡亰496net 2

    新葡亰496net 3

    是不是感觉很厉害!以后设计师就不需要在提供几套颜色的图片了。

    SVG, icon fonts等技术似乎也不是那么耀眼了。

     

    一、兼容性不一

    CSS3 box-shadow从IE9浏览器开始就支持了,如下表示意:

    新葡亰496net 4

    filter中的drop-shadowIE13才开始支持,移动端Android4.4才开始支持,细想一下,其实离在移动端愉快使用就差一口气,明天的今天,大家说不定就在载歌载舞了:

    新葡亰496net 5

    box-shadow:x偏移, y偏移, 模糊大小, 色值;
    
    filter:drop-shadow(x偏移, y偏移, 模糊大小, 色值)
    

    二、原理其实很简单

    原理其实很简单,使用了CSS3滤镜filter中的drop-shadowdrop-shadow滤镜可以给元素或图片非透明区域添加投影。

    如果对drop-shadow不是很了解,建议先看看前些时间写的“CSS3 filter:drop-shadow滤镜与box-shadow区别应用”一文!

    对于背景透明的png小图标而言,如果我们施加一个不带模糊的投影,不就等同于生成了另外一个颜色的小图标了吗?

    然后,我们把原始图标隐藏在容器外面,投影图标在容器中间,不见给人感觉是赋色效果了?

    比方说本文的demo,如果把icon父级的的overflow:hidden去掉,原始的图标就暴露出来啦!

    新葡亰496net 6

    HTML:

    二、同样的参数值,表现效果有差异

    filter中的drop-shadow语法如下:

    filter: drop-shadow(x偏移, y偏移, 模糊大小, 色值);

    1
    filter: drop-shadow(x偏移, y偏移, 模糊大小, 色值);

    例如:

    filter:drop-shadow(5px 5px 10px black)

    1
    filter:drop-shadow(5px 5px 10px black)

    表示右下5像素偏移,10像素模糊的黑色阴影。眼见为实,看下面的图片示意(实时效果,请使用Chrome或手机浏览器查看):

    新葡亰496net 7

    但是,如果使用同样参数值的box-shadow,例如:

    box-shadow: 5px 5px 10px black;

    1
    box-shadow: 5px 5px 10px black;

    会发现,box-shadow的阴影距离更小,色值要更深:

    新葡亰496net 8

    二者有什么区别?

    三、实现的时候实际有难度

    原理如上面,我一开始实现的时候,以为很简单,因为分分钟可以实现自己的想法,后来发现有些天真了,Chrome浏览器怎么都显示不出来;FireFox浏览器却可以!咦,究竟发生了什么。

    在Chrome浏览器下,drop-shadow有一个如下的呈现特性:

    在Chrome浏览器下,如果一个元素的主体部分,无论以何种方式,只要在页面中不可见,其drop-shadow是不可见的;实体部分哪怕有1像素可见,则drop-shadow完全可见。

    所以,我试过:

    • text-indent负值隐藏原始图,无投影,失败!
    • clip剪裁隐藏,无投影,失败!
    • margin负值隐藏原始图,无投影,失败!
    • left负值隐藏原始图,无投影,失败!

    通通不行,实现遇到了巨大的阻碍。

    后来,灵光一现,如果我实体部分也在可视区域内,但是是透明的,会怎样呢(反正不会有投影出来)?

    于是,我就试了下曾经立下无数战功的透明边框,卧槽,又立功了,成了!

    因此,下面这一个CSS声明是千万不能少的:

    border-right: 20px solid transparent;

    1
    border-right: 20px solid transparent;

    <i class="icon"><i class="icon icon-del"></i></i>

    三、drop-shadow没有内阴影效果

    box-shadow支持inset内阴影,如:

    box-shadow: inset 5px 5px 10px black;

    1
    box-shadow: inset 5px 5px 10px black;

    但是,drop-shadow却没有。

    1. 兼容性

    box-shadow:从IE9 开始兼容

    新葡亰496net 9

    box-shadow兼容性

    filter:drop-shadow:从IE13 兼容

    新葡亰496net 10

    drop-shadow兼容性

    从上图可知,box-shadow在兼容性上做的更好。而drop-shadow还只能在新版本的浏览器中使用,对老旧浏览器并不友好

    四、关于兼容性

    IE13 支持,Chrome和FireFox浏览器支持,移动端iOS支持,Android4.4 支持。也就是,基本上,移动端现在可以使用这种技术了。

    既节约了流量,也让我们的开发更简单,维护更方便了。

    CSS:

    四、drop-shadow不能阴影叠加

    box-shadow有个超屌的特性,就是阴影可以任意累加,因此,理论上我们可以使用box-shadow生成任意的图片,包括张含韵妹子年轻时候的写真,具体可参加“CSS3 box-shadow盒阴影图形生成技术”一文。

    但是filter中的drop-shadow就只能抱歉了,我就是一锤子买卖。没钱也这么任性!

    说到现在,体现的尽是drop-shadow的不好,兼容性不够,内阴影不支持,多阴影也不支持;感觉就像是小蚯蚓,失恋了,工作也没了,存在的意义好像就成了白富美的谈资。

    真的是这样吗?显然非也!所谓存在既有道理。

    drop-shadow有一个很厉害的特性,也就这一个特性,让其以后有足够的机会大放异彩!那就是,drop-shadow才是真正意义上的投影,而box-shadow只是盒阴影而已。

    什么意思呢?

    2. 阴影叠加

    filter:drop-shadow不支持阴影叠加

    阴影叠加是你可以对一个元素重复进行阴影设置,使用box-shadow可以极限叠加,不考虑性能的话,甚至可以拼出你想要的任何形状。

    关于box-shadow阴影叠加属性可以点击这里box-shadow阴影叠加技术应用

    五、结语碎碎念

    其实,本文的技术发明(主要是透明border的处理)在“drop-shadow vs box-shaow”这篇文章完成后就研究出来了。本来想写个小专利,蹭点早饭钱。结果,新厂子写专利没费用,而且周期要3年。

    3年我儿子都可以打酱油了。所以,罢了,直接分享出来。

    今天8号,本月已经6篇文章了,写文章暴走了下。就是为了腾出大段且连续的业余时间,要秘密进行其他大项目。

    时光机
    如果你是3~5年之后看到此文,而且你是2016年上大学的,那么,我在写这篇文章的时候,你可能正在翻来覆去睡不着,还在焦虑明天的考试。总之,不要担心,我给大家找了一个非常硬的后台,保证你们这次高考无忧,放心睡觉吧!哟,你在好奇是哪个后台。嘻嘻嘻嘻,说出来怕吓着你————观音菩萨!

    2 赞 6 收藏 1 评论

    新葡亰496net 11

    .icon{
      display: inline-block;
      width: 20px;
      height: 20px;
      overflow: hidden;
    }
    .icon-del{
      background:url(delete.png) no-repeat center;
    }
    .icon>.icon{
      position:relative;
      left:-100%;
      border-right: 20px solid transparent;
      -webkit-filter: drop-shadow(blue 20px 0);
      filter: drop-shadow(blue 20px 0);
    }

    五、阴影 vs 盒阴影

    实践出真知,下面我们用CSS border写一个虚线框,例如:

    border: 10px dashed #beceeb;

    1
    border: 10px dashed #beceeb;

    结果长相如下:

     新葡亰496net 12

    新葡亰496net,新葡亰496net:PNG格式小图标的CSS任意颜色赋色技术,png图片制作任意颜色的小图标。然后,我们分别应用box-shadowdrop-shadow滤镜:

    border: 10px dashed #beceeb; box-shadow: 5px 5px 10px black;

    1
    border: 10px dashed #beceeb; box-shadow: 5px 5px 10px black;

    border: 10px dashed #beceeb; filter: drop-shadow(5px 5px 10px black);

    1
    border: 10px dashed #beceeb; filter: drop-shadow(5px 5px 10px black);

    结果:

     新葡亰496net 13

    怎么样?是不是本性暴露了!

    box-shadow顾名思意“盒阴影”,只是盒子的阴影;你想啊,这盒子中间明明是透明的,结果,阴影的时候,居然光线没有穿透;但是drop-shadow就符合真实世界的投影,非透明的颜色,我就有投影;透明部分,光线穿过,没投影,而什么盒子不盒子的,跟我没有任何关系。

    drop-shadow不仅可以穿透代码构建的元素的透明部分,PNG图片的透明部分也是可以穿透的,如下图:

    新葡亰496net 14

    于是,曾经困扰我们的一些老大难的问题就有了很好的解决思路了!

    3. 内阴影

    filter:drop-shadow不支持内阴影

    效果:

    六、drop-shadow的实际应用

    我们实现带有箭头指向的浮层面板的时候,考虑到兼容性,三角基本上都是使用border绘制的,没法box-shadow,但是,矩形部分设计师希望是有阴影的,于是,就会出现下图所示的情况:
    新葡亰496net 15

    箭头没有阴影,蒙混过关。

    后来,又捣腾了一个办法,就使用矩形进行45deg旋转,两个box-shadow合体,但是,会存在阴影重叠的一部分,说穿了,还是效果不完美。

    现在,有了drop-shadow,阴影就真的变成了阴影了。

    您可以狠狠地点击这里:filter:drop-shadow实现尖角带阴影的提示面板demo

    一切尽在截图中:
    新葡亰496net 16

    3. 阴影效果

    为了展示,我这里使用虚线形式的边框查看效果

        height: 25px;
        width: 30px;
        border:3px dashed #666;
    

    box-shadow:

     box-shadow: 5px 5px 0; 
    

    新葡亰496net 17

    box-shadow投影效果

    drop-shadow:

    filter:drop-shadow(5px 5px 0);
    

    新葡亰496net 18

    drop-shadow投影效果

    从这两张图可以初见端倪了对吗?

    新葡亰496net 19

    七、结束语

    低版本IE浏览器下,其实也有Shadow滤镜,不过是IE的私有滤镜。如果想要实现兼容IE9 的投影效果,估计要借助SVG来实现了。

    drop-shadow特性实在是不得了,我现在已经有很多非常棒的想法,比方说实现位图的色彩渐变动画,以及其他可以减少设计师和前端同学工作成本的技术实现思路,先保密等我先实践实践,等思路成熟再一起交流交流。

    总而言之,虽然drop-shadow滤镜亮点单一,但是这个亮点可以照亮整个北半球。

    2 赞 1 收藏 评论

    新葡亰496net 20

    drop-shadow实际应用

    重头戏来了,从二者的阴影效果上可以看出,box-shadow本质上是盒模型的投影,而drop-shadow才是真正意义上的投影。

    所以,纵然drop-shadow有着对兼容性要求高,无法设置内阴影,无法叠加阴影等很多不足,但它的特性决定了它无法被box-shadow取代的地位。

      当然还可以弄成其他颜色,只需要改变一下filter: drop-shadow(blue 20px 0); 里面的blue这个颜色。

    1. 不规则图形的投影

    这个好理解,使用标签和css构造的多边形,如三角形、或者上面写的虚线边框等,就可以使用drop-shadow为它设置自然的投影

     

    2. 升级功能:改变图标颜色
    <i class="icon">
        <i class="icon-del"></i>
    </i>
    

    对于上述html结构,我们想要插入一个黑色的定位图标。而目前的素材只有一个蓝色的图标

    新葡亰496net 21

    location.png

    .icon{
        display: inline-block;
        position: relative;
        height:30px;
        width: 40px;
    }
    .icon-del {
        background: url(location.png) no-repeat;
       height:100%;
       width:100%;
       display: inline-block;
    }
    

    这么写能让蓝色图标正常显示,那么如何将这个图标变为黑色呢?

    首先我们为这个图标设置投影

      .icon >.icon-del {
        filter: drop-shadow(20px 0 #000); 
       }
    

    新葡亰496net 22

    设置投影,x偏移20px

    再设置偏移量,和投影偏移相等,同时为父元素设置overflow:hidden;

    .icon{
        overflow:hidden;  //新增
        display: inline-block;
        position: relative;
        height:30px;
        width: 40px;
    }
     .icon >.icon-del {
        filter: drop-shadow(20px 0 #000); 
       position: relative;
       left: -20px;
       }
    

    最终效果,原图标隐藏,只显示投影,看上去就好像是改变了图标的颜色啦!

    新葡亰496net 23

    image.png

    文章参考:
    png小图标CSS赋色demo
    张鑫旭CSS3 filter:drop-shadow滤镜与box-shadow区别应用

    咦,我是不是让你们少了勾搭UI小姐姐的机会?

    溜了溜了

      这个原理就是利用filter过滤器的drop-shadow投影,也就是生成一个新的图标,然后我们给这个新图标添加颜色。

      我们给父元素设置宽和高以及overflow:hidden,然后让这个子元素正常的图片left:100%让它隐藏,再通过border-right来设置一个宽度为图片宽度的transparent透明边框,最后给它加投影就好了。

    本文由新葡亰496net发布于新葡亰官网,转载请注明出处:新葡亰496net:PNG格式小图标的CSS任意颜色赋色技

    关键词: