图片是一个网站必不可少的元素,而呈现出绚丽多彩的图片效果在不少状况下不只仅是设计师的工做,经过代码来修饰图片也是一个前端工程师必备的技能。由于兼容性的问题,实际项目中可能用的比较少,包括博主本身也只是用过几回剪切,不少状况下都交给设计师去作了。但做为一个hacker怎么能知足于此呢,必须深刻探究!前端
filter有十种特效来处理图片,博主只放几种特效的样例给你们看一下:react
照片反色效果:git
照片褐色效果:github
照片阴影效果:web
十种特效源码:浏览器
-webkit-filter:opacity(.6);//透明度 filter:opacity(.6); -webkit-filter:blur(10px);//照片模糊 filter:blur(10px); -webkit-filter:invert(1); filter:invert(1); -webkit-filter:saturate(3);//照片饱和度 filter:saturate(3); -webkit-filter:grayscale(1);//照片灰度 filter:grayscale(1); -webkit-filter:sepia(1);//照片褐色 filter:sepia(1); -webkit-filter:hue-rotate(90deg);//色相旋转 filter:hue-rotate(90deg); -webkit-filter:brightness(.5);//亮度 filter:brightness(.5); -webkit-filter:contrast(2);//对比度 filter:contrast(2); -webkit-filter:drop-shadow(10px 10px 10px #ccc);//阴影 filter:drop-shadow(10px 10px 10px #ccc);
但实际上这个属性兼容性很低:前端工程师
截止博主发文日期,Filter的兼容性如上图,咱们能够看到IE是彻底不支持的,Edge也是部分支持。这可能也是Filter无法用在项目中的缘由之一了。感兴趣的读者能够Copy博主代码本地测试一下,或是参照MDN|Filter了解。博主不在这里作过多的说明了。函数
这两个属性正是今天的重头戏,博主曾在从隐藏元素谈起提起过,但并没作深刻解释。是的,它能够用来隐藏元素,固然也就能处理图片了。测试
clip网站
clip这个属性我相信会有很大一部分人不知道,由于这个属性使用率很是的低,由于不少状况下咱们会直接从新切一张新图出来代替而不会去剪裁已有的图片,但实际上这个属性用在CSS sprite简直就如同神器通常,由于在不少状况下background-position并不符合咱们的需求,好比,有时咱们但愿Sprite图片能够延迟滚动加载,或者是能够很轻松的右键图片另存为...或是其它background-position无法知足的情景。
废话很少说,看样例:
position:absolute; clip:rect(50px 250px 250px 50px); /* IE6, IE7 */ clip:rect(50px,250px,250px,50px);
注意,元素定位position必须是absolute或是fixed的,兼容IE6,IE7须要将值之间的逗号去掉。另外,react(top,right,bottom,left);四个值分别是相对于图片左上角为原点的坐标值。Clip基本全部的浏览器都支持,能够放心使用。
让人放弃它的缘由无外乎:
clip 只对绝对定位的元素有效对于position:relative和position:static无效
clip 只能用于矩形,即rect()函数
clip-path
其实clip在HTML5中已经被废弃了(依然可用),取而代之的是clip-path。原本clip还有一个circle(圆),但基本没有浏览器实现这个属性值,只有rect()但是使用,可能W3C也是等不下去了吧,直接推出了一个更牛逼的属性——clip-path,这个属性起初是SVG里面的而后被挪用到了CSS里面。关于SVG博主有时间会再另外介绍,这里按下不表。效果图:
读者能够在这里自行体验
兼容:如今为止IE 和 Edge 不支持这个属性,Firefox 仅部分支持 clip-path ,
Chrome、Safari 和 Opera 须要使用 -webkit- 前缀支持此属性。
clip-path兼容性甚至比前面说到的filter还差,因此很难真正使用起来。更多使用效果戳这里和这里
说一下它的四个属性值:
clip-source: 能够是内、外部的SVG的clipPath元素的URL引用;
basic-shape: 使用一些基本的形状函数建立的一个形状。主要包括circle()、ellipse()、inset()和polygon()。
geometry-box: 是可选参数。此参数和basic-shape函数一块儿使用时,能够为basic-shape的裁剪工做提供参考盒子。若是geometry-box由自身指定,那么它会使用指定盒子形状做为裁剪的路径,包括任何(由border-radius提供的)的角的形状。
开始使用clip-path
在开始使用clip-path绘制图形,或者说裁剪图形以前,有两点须要你们注意:
使用clip-path要从同一个方向绘制,若是顺时针绘制就一概顺时针,逆时针就一概逆时针,由于polygon是一个连续线段,若线段彼此有交集,裁剪区域就会有相减的状况发生,固然若是你特地须要这样的效果除外。
若是绘制时采用比例的方式绘制,长宽就必需要先行设定,否则有可能绘制出来的长宽和咱们想像的就会有差距,使用像素绘制就不会有这样的现象。
咱们就拿上面途中的六边形做为polygon()函数示例:
-webkit-clip-path: polygon(0% 50%, 25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%); clip-path: polygon(0% 50%, 25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%);
效果图:
讲解:
每一个点的第一个坐标值决定了它在 x 轴上的位置,第二个坐标值指定了它在 y 轴的位置,全部点是顺时针绘制的。其实一个 polygon()就能知足全部的形状须要了,有自定义的API用更加方便不是么。
注意:inset()这个真的坑,按说一样裁剪成方形应该是和clip的rect同样用法,可不同!
//Clip的rect position:absolute; clip:rect(50px 250px 250px 50px); //clip-path clip-path: inset(50px 50px 50px 50px); -webkit-clip-path: inset(50px 50px 50px 50px);
本文使用图片是300*300的。
很明显:
clip:rect(50px 250px 250px 50px); =clip-path: inset(50px 50px 50px 50px);
好大的一个坑....
相信随着时代发展,clip-path会慢慢被浏览器厂商接受的。本文有任何错误,欢迎评论留言。