使用feDisplacementMap+feImage滤镜实现水波纹效果(计算动态值)
该文章已经讲的特别细致了,该篇仅以此记录动效过程中各点的计算。
1.feDisplacementMap
feDisplacementMap
实际上是一个位置替换滤镜,就是改变元素和图形的像素位置的。遍历原图形的所有像素点,使用feDisplacementMap
重新映射替换一个新的位置,形成一个新的图形。feDisplacementMap
滤镜在业界的主流应用是对图形进行形变,扭曲,液化。
P'(x,y) ← P( x + scale * (XC(x,y) - 0.5), y + scale * (YC(x,y) - 0.5))
· P'(x,y)
指的是转换之后的x, y
坐标。
· x + scale * (XC(x,y) - 0.5), y + scale * (YC(x,y) - 0.5)
指的是具体的转换规则。
· XC(x,y)
表示当前x,y坐标像素点其X轴方向上设置的对应通道的计算值,范围是0~1。
· YC(x,y)
表示当前x,y坐标像素点其Y轴方向上设置的对应通道的计算值,范围是0~1。
· -0.5是偏移值,因此XC(x,y) - 0.5
范围是-0.5~0.5
,YC(x,y) - 0.5
范围也是-0.5~0.5
。
· scale
表示计算后的偏移值相乘的比例,scale
越大,则偏移越大。
再用一句话解释就是,根据设定的通道颜色对原图的x, y
坐标进行偏移。
值 | 默认值 | 取值 | 说明 |
---|---|---|---|
xChannelSelector | A | A or R or G or B | 对应XC(x,y),表示X轴坐标使用的是哪个颜色通道进行位置偏移 |
yChannelSelector | A | A or R or G or B | 对应YC(x,y),表示Y轴坐标使用的是哪个颜色通道进行位置偏移 |
color-interpolation-filters | linearRGB | linearRGB or sRGB | 滤镜对颜色进行计算时候采用的颜色模式类型 |
scale | 0 | 可正可负 | 缩放比例 通常使用正数值处理,值越大,偏移越大。 |
in | SourceGraphic | SourceGraphic,SourceAlpha,BackgroundImage, BackgroundAlpha,FillPaint,StrokePaint,以及自定义的滤镜的原始引用 | 原始图形 |
in2 | 同in | 用来映射的图形 |
2.通过feDisplacementMap和feImage实现水波特效
实现水波效果通常使用下图
<svg id='svg' width="400" height="400" xmlns="http://www.w3.org/2000/svg"> <defs> <filter id="filter-ripple" primitiveUnits='objectBoundingBox'> <feImage id='feImage' result="pict2" xlink:href="上述图片地址" x="0" y="0" width="100%" height="100%"></feImage> <feDisplacementMap id='displacement-map' result='ok' scale="0" xChannelSelector="R" yChannelSelector="G" in2="pict2" in="SourceGraphic" color-interpolation-filters="sRGB"></feDisplacementMap> <feComposite operator="in" in2="pict2"></feComposite> <feComposite in2="SourceGraphic"></feComposite> //这个的目的是因为添加滤镜的元素可见区域和feImage元素的大小一致。融合原有元素保证整个元素都可见 </filter> </defs> </svg>
水波特效,是通过<feImage>
标签 x
,y
,width
,height
四个属性和<feDisplacementMap>
标签scale
动态变化实现。
就像涟漪,以石子掉落处为中心,范围由小扩大,起伏由强减弱。 转为代码,也就是width
,height
由小变大,scale
由大变小
根据点击事件,可以计算出中心坐标(pointX,pointY)
在扩散过程中,中心坐标不变,x,y为图片的起始坐标
pointX = width/2 + x ;pointY = height/2 + y
=> x = pointX - width/2; y = pointY - height/2
width,height,scale的最大值就可以根据需求来设置啦~
参考资料
https://www.zhangxinxu.com/wordpress/2017/12/understand-svg-fedisplacementmap-filter/
到此这篇关于使用feDisplacementMap+feImage滤镜实现水波纹效果(计算动态值)的文章就介绍到这了,更多相关feDisplacementMap滤镜水波纹内容请搜索脚本之家以前的文章或继续浏览下面的相关文章,希望大家以后多多支持脚本之家!
相关文章
- 本文详细介绍了Checkbox的基础属性、样式自定义及其应用场景,Checkbox通过<input>元素实现,样式自定义可以通过隐藏原始Checkbox、使用伪元素、JavaScript来实现,Chec2024-10-16
- 本文介绍了HTML5中表单的自动验证、取消验证、自定义错误信息等功能,通过required、pattern、min、max和step属性,可以实现对表单输入的自动检查,novalidate和formnovalida2024-09-23
- 在HTML5项目中使用NotoSansCJK字体能提升用户体验,本文介绍了通过GoogleFonts在线加载和本地托管两种方法,在线加载无需下载,通过GoogleFonts链接快速引入,适合离线使用或2024-09-23
- HLS是一种基于HTTP协议的流媒体传输协议,它的出现使得视频的传输更加稳定和可靠,本文给大家介绍Html5如何播放hls格式的视频,感兴趣的朋友一起看看吧2024-08-19
- 使用<blockquote>标签可以实现页面文字的段落缩进,这一标签也是每使用一次,段落就缩进一次,并且可以嵌套使用,以达到不同的缩进效果,本文通过实例代码介绍HTML5使2024-07-08
- 这篇文章主要介绍了window.open()各参数示例详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧2024-06-19
- 在现代互联网应用中,有时我们需要让用户在网页上进行签字操作,比如确认文件、填写电子表格或者签署合同,利用 HTML5 的 canvas 画布,我们可以轻松地实现这一功能,为用2024-06-19
uniapp在h5页面实现扫码功能(html5-qrcode)
这篇文章主要介绍了uniapp在h5页面实现扫码功能(html5-qrcode),本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下2024-06-11- a 元素可通过其href属性创建指向其他网页、文件、同一页面内的位置或其他URL的超链接,这篇文章主要介绍了HTML5中的A 标签,需要的朋友可以参考下2024-05-28
- button 用于显示一个可点击的按钮,可用在表单或文档的其它地方,button元素是内联双标签,不同浏览器下button样式不同,可以通过CSS修改,这篇文章主要介绍了HTML5 中的Bu2024-05-28
最新评论