要使用标准的CSS3实现某元素的投影效果,您可以
CSS3 filter:drop-shadow滤镜与box-shadow区别应用
2016/05/19 · CSS · box-shadow, drop-shadow
原文出处: 张鑫旭(@张鑫旭 )
要使用标准的CSS3实现某元素的投影效果,有两个套路,第一个就是使用常见的box-shadow
,
第二个就是使用CSS3的filter
阴影滤镜drop-shadow
,那这两个阴影实现有什么具体的差异呢?
首先介绍一下,css3中有两个属性可设置投影,分别是:
PNG格式小图标的CSS任意颜色赋色技术
2016/06/08 · CSS · 1 评论 · PNG
原文出处: 张鑫旭(@张鑫旭)
一、box-shadow
一、兼容性不一
CSS3 box-shadow
从IE9浏览器开始就支持了,如下表示意:
而filter
中的drop-shadow
IE13才开始支持,移动端Android4.4才开始支持,细想一下,其实离在移动端愉快使用就差一口气,明天的今天,大家说不定就在载歌载舞了:
box-shadow:x偏移, y偏移, 模糊大小, 色值;
filter:drop-shadow(x偏移, y偏移, 模糊大小, 色值)
一、眼见为实
CSS可以修改图片的颜色,没错,可以,眼见为实!您可以狠狠地点击这里:png小图标CSS赋色demo
上面的不是很黑的是原始图标,是个PNG图片,下面这个是可以赋色的:
下面,我们随意选择一个颜色,例如紫色,然后:
是不是感觉很厉害!以后设计师就不需要在提供几套颜色的图片了。
SVG, icon fonts等技术似乎也不是那么耀眼了。
box-shadow是css3中新增的属性,用于增加边框阴影,让原有的元素变得更多样性,它名下有四位小弟,老大控制水平方向偏移,老二控制垂直方向偏移,老三控制模糊度,最小的老四控制阴影颜色。
二、同样的参数值,表现效果有差异
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或手机浏览器查看):
但是,如果使用同样参数值的box-shadow
,例如:
box-shadow: 5px 5px 10px black;
1
|
box-shadow: 5px 5px 10px black;
|
会发现,box-shadow
的阴影距离更小,色值要更深:
二者有什么区别?
二、原理其实很简单
原理其实很简单,使用了CSS3滤镜filter
中的drop-shadow
,drop-shadow
滤镜可以给元素或图片非透明区域添加投影。
如果对drop-shadow
不是很了解,建议先看看前些时间写的“CSS3
filter:drop-shadow滤镜与box-shadow区别应用”一文!
对于背景透明的png小图标而言,如果我们施加一个不带模糊的投影,不就等同于生成了另外一个颜色的小图标了吗?
然后,我们把原始图标隐藏在容器外面,投影图标在容器中间,不见给人感觉是赋色效果了?
比方说本文的demo,如果把icon父级的的overflow:hidden
去掉,原始的图标就暴露出来啦!
其中老大老二老三是一组三胞胎,都是像素(px)家族的,而老大老二又是同卵,控制的都是阴影的偏移,老大正值向右偏移,负值向左偏移;老二正值向下偏移,负值向上偏移;老三是异卵,控制引用的模糊度,取值范围是(0,+∞),当值为0的时候表示不模糊,值越大越模糊,当值小于0的时候,阴影消失。老四负责阴影颜色。一家子都在“挣钱养家”,只有老四负责“貌美如花”。
三、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+开始兼容
box-shadow兼容性
filter:drop-shadow:从IE13+兼容
drop-shadow兼容性
从上图可知,box-shadow
在兼容性上做的更好。而drop-shadow
还只能在新版本的浏览器中使用,对老旧浏览器并不友好
三、实现的时候实际有难度
原理如上面,我一开始实现的时候,以为很简单,因为分分钟可以实现自己的想法,后来发现有些天真了,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;
|
二、drop-shadow
四、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阴影叠加技术应用
四、关于兼容性
IE13+支持,Chrome和FireFox浏览器支持,移动端iOS支持,Android4.4+支持。也就是,基本上,移动端现在可以使用这种技术了。
既节约了流量,也让我们的开发更简单,维护更方便了。
drop-shadow也是css3特有的,用于投影,这里为什么说是投影而不是阴影呢?下面会提到。和box-shadow一样,它名下的家族完全复制过来就可以,成员和代表的意思都一样。
五、阴影 vs 盒阴影
实践出真知,下面我们用CSS border
写一个虚线框,例如:
border: 10px dashed #beceeb;
1
|
border: 10px dashed #beceeb;
|
结果长相如下:
然后,我们分别应用box-shadow
和drop-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);
|
结果:
怎么样?是不是本性暴露了!
box-shadow
顾名思意“盒阴影”,只是盒子的阴影;你想啊,这盒子中间明明是透明的,结果,阴影的时候,居然光线没有穿透;但是drop-shadow
就符合真实世界的投影,非透明的颜色,我就有投影;透明部分,光线穿过,没投影,而什么盒子不盒子的,跟我没有任何关系。
drop-shadow
不仅可以穿透代码构建的元素的透明部分,PNG图片的透明部分也是可以穿透的,如下图:
于是,曾经困扰我们的一些老大难的问题就有了很好的解决思路了!
3. 内阴影
filter:drop-shadow不支持内阴影
五、结语碎碎念
其实,本文的技术发明(主要是透明border的处理)在“drop-shadow vs box-shaow”这篇文章完成后就研究出来了。本来想写个小专利,蹭点早饭钱。结果,新厂子写专利没费用,而且周期要3年。
3年我儿子都可以打酱油了。所以,罢了,直接分享出来。
今天8号,本月已经6篇文章了,写文章暴走了下。就是为了腾出大段且连续的业余时间,要秘密进行其他大项目。
时光机
如果你是3~5年之后看到此文,而且你是2016年上大学的,那么,我在写这篇文章的时候,你可能正在翻来覆去睡不着,还在焦虑明天的考试。总之,不要担心,我给大家找了一个非常硬的后台,保证你们这次高考无忧,放心睡觉吧!哟,你在好奇是哪个后台。嘻嘻嘻嘻,说出来怕吓着你————观音菩萨!
2 赞 6 收藏 1 评论
三、box-shadow和drop-shadow的区别
六、drop-shadow的实际应用
我们实现带有箭头指向的浮层面板的时候,考虑到兼容性,三角基本上都是使用border
绘制的,没法box-shadow
,但是,矩形部分设计师希望是有阴影的,于是,就会出现下图所示的情况:
箭头没有阴影,蒙混过关。
后来,又捣腾了一个办法,就使用矩形进行45deg旋转,两个box-shadow
合体,但是,会存在阴影重叠的一部分,说穿了,还是效果不完美。
现在,有了drop-shadow
,阴影就真的变成了阴影了。
您可以狠狠地点击这里:filter:drop-shadow实现尖角带阴影的提示面板demo
一切尽在截图中:
3. 阴影效果
为了展示,我这里使用虚线形式的边框查看效果
height: 25px;
width: 30px;
border:3px dashed #666;
9159.com,box-shadow:
box-shadow: 5px 5px 0;
box-shadow投影效果
drop-shadow:
filter:drop-shadow(5px 5px 0);
drop-shadow投影效果
从这两张图可以初见端倪了对吗?
1.兼容性
七、结束语
低版本IE浏览器下,其实也有Shadow
滤镜,不过是IE的私有滤镜。如果想要实现兼容IE9+的投影效果,估计要借助SVG来实现了。
drop-shadow
特性实在是不得了,我现在已经有很多非常棒的想法,比方说实现位图的色彩渐变动画,以及其他可以减少设计师和前端同学工作成本的技术实现思路,先保密等我先实践实践,等思路成熟再一起交流交流。
总而言之,虽然drop-shadow
滤镜亮点单一,但是这个亮点可以照亮整个北半球。
2 赞 1 收藏 评论
drop-shadow实际应用
重头戏来了,从二者的阴影效果上可以看出,box-shadow本质上是盒模型的投影,而drop-shadow才是真正意义上的投影。
所以,纵然drop-shadow有着对兼容性要求高,无法设置内阴影,无法叠加阴影等很多不足,但它的特性决定了它无法被box-shadow取代的地位。
box-shadow在IE9以上就支持了,基本上各大浏览器都支持,而drop-shadow在IE13以上才支持,而谷歌chrome浏览器暂时是不支持的,这是在我应用的时候发现的,在懵逼了几秒之后,决定用火狐FireFox试一下,居然成功了!因为使用的是mac系统,没有IE,所以,下面的展示就用FireFox来实现。
1. 不规则图形的投影
这个好理解,使用标签和css构造的多边形,如三角形、或者上面写的虚线边框等,就可以使用drop-shadow为它设置自然的投影
2.写法
2. 升级功能:改变图标颜色
<i class="icon">
<i class="icon-del"></i>
</i>
对于上述html结构,我们想要插入一个黑色的定位图标。而目前的素材只有一个蓝色的图标
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);
}
设置投影,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;
}
最终效果,原图标隐藏,只显示投影,看上去就好像是改变了图标的颜色啦!
image.png
文章参考:
png小图标CSS赋色demo
张鑫旭CSS3 filter:drop-shadow滤镜与box-shadow区别应用
咦,我是不是让你们少了勾搭UI小姐姐的机会?
溜了溜了
box-shadow直接写就可以了,简单粗暴,比如:
box-shadow: 5px 5px 10px black;
drop-shadow就不一样了,就好比box-shadow是个成年能独立的人,能一手抓好多东西,而drop-shadow就是个还不能独立的小孩,出门得有大人领着,同时手小,带的东西不能一把抓,只能背个小书包把东西装里面,也就是用代码中的括号,比如:
filter:drop-shadow(5px 5px 10px black);
filter是滤镜的意思,具体的我就不在这讲了,有兴趣的可以参考一下菜鸟教程:
3.表现效果
在同样参数下,box-shadow和drop-shadow表现的效果是不一样的,下面用我喜欢的idol,前天刚入伍的TOP给大家演示一下:
box-shadow下:
drop-shadow下:
两张图片对比下你会发现,box-shadow的阴影在越接近图片边缘的时候比drop-shadow的越黑,而且阴影的宽度也相对drop-shadow的小,从上边界和左边界就能看出来,box-shadow的阴影几乎看不清,而宽度相对较宽的drop-shadow就能看到。
4.盒阴影和投影
这里就提到上面说的投影了。虽然shadow就是阴影的意思,但是在严格意义上讲,drop-shadow更应该说是投影,而什么是盒阴影,什么是投影,用语言可能表达不清楚,直接上图给你看就知道了。
先上一串代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
*{
padding: 0;
margin: 0;
}
.dash1{
width: 50px;
height: 50px;
margin: 0 auto;
border: dashed 10px #beceeb;
box-shadow: 5px 5px 10px black;
}
.dash2{
width: 50px;
height: 50px;
margin: 50px auto;
border: dashed 10px #beceeb;
filter: drop-shadow(5px 5px 10px black);
}
</style>
</head>
<body>
<div class="dash1"></div>
<div class="dash2"></div>
</body>
</html>
展现的结果就是下面这样
box-shadow:
drop-shadow:
可以很明显的看出区别,为什么会这样呢?在这里我用的是div标签,大家都知道,div标签是个块标签,说白了是个盒模型,指的是一块区域,box-shadow的属性只能添加到盒模型外面,因此内部的东西是不会添加上的,就变成上图的样子,中间还是白色部分。而drop-shadow就不一样了,他是把选中的所有的非透明区域都做了阴影效果,就相当于一种真正的投影,这里为了看得更清楚特意把边框弄成虚线,所以能看到凡是边框显示出来的部分,都有drop-shadow属性,这也就是为什么我说他是投影更确切。
四、结束语
关于box-shadow和drop-shadow的主要区别就这些,还有一些box-shadow特有的阴影叠加、内阴影效果什么的我就不说了,有兴趣的可以百度了解一下。知识点很小,但也是花了我一上午的时间组织语言,尽量让大家一看就懂,如果有什么不对的欢迎指出!第二篇博客随笔就此告终!撤~
本文由9159.com发布于前端,转载请注明出处:要使用标准的CSS3实现某元素的投影效果,您可以
关键词: