通过feDisplacementMap和feImage实现水波特效


Posted in HTML / CSS onApril 24, 2022

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.5YC(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 元素的result属性值 同in 用来映射的图形

2.通过feDisplacementMap和feImage实现水波特效

实现水波效果通常使用下图

通过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)

通过feDisplacementMap和feImage实现水波特效

在扩散过程中,中心坐标不变,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滤镜实现水波纹效果(计算动态值)的文章就介绍到这了!


Tags in this post...

HTML / CSS 相关文章推荐
CSS3 :nth-child()伪类选择器实现奇偶行显示不同样式
Nov 05 HTML / CSS
纯css3显示隐藏一个div特效的具体实现
Feb 10 HTML / CSS
html5+css3之动画在webapp中的应用
Nov 21 HTML / CSS
CSS3 2D模拟实现摩天轮旋转效果
Nov 16 HTML / CSS
CSS Houdini实现动态波浪纹效果
Jul 30 HTML / CSS
详解CSS3实现响应式手风琴效果
Jun 10 HTML / CSS
基于HTML5 FileSystem API的使用介绍
Apr 24 HTML / CSS
css 如何让背景图片拉伸填充避免重复显示
Jul 11 HTML / CSS
html5 更新图片颜色示例代码
Jul 29 HTML / CSS
html5使用canvas画三角形
Dec 15 HTML / CSS
HTML5超炫酷粒子效果的进度条的实现示例
Aug 23 HTML / CSS
CSS实现单选折叠菜单功能
Nov 01 HTML / CSS
什么是css原子化,有什么用?
Apr 24 #HTML / CSS
css3 文字断裂效果
css3属性选择器 “~”(波浪号) “,”(逗号) “+”(加号)和 “>”(大于号)
Apr 19 #HTML / CSS
开发微信小程序之WXSS样式教程
Apr 18 #HTML / CSS
CSS中float高度塌陷问题的四种解决方案
Apr 18 #HTML / CSS
HTML5基础学习之文本标签控制
Mar 25 #HTML / CSS
CSS实现渐变色边框(Gradient borders)的5种方法
Mar 25 #HTML / CSS
You might like
php之对抗Web扫描器的脚本技巧
2008/10/01 PHP
php cli换行示例
2014/04/22 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
php json中文编码为null的解决办法
2016/12/14 PHP
php实现session共享的实例方法
2019/09/19 PHP
[原创]提供复制本站内容时出现,该文章转自脚本之家等字样的js代码
2007/03/27 Javascript
ASP中进行HTML数据及JS数据编码函数
2009/11/11 Javascript
jQuery之网页换肤实现代码
2011/04/30 Javascript
基于JQuery的多标签实现代码
2012/09/19 Javascript
js创建子窗口并且回传值示例代码
2013/07/02 Javascript
将json当数据库一样操作的javascript lib
2013/10/28 Javascript
Angularjs+bootstrap+table多选(全选)支持单击行选中实现编辑、删除功能
2017/03/27 Javascript
你有必要知道的10个JavaScript难点
2017/07/25 Javascript
解决Js先触发失去焦点事件再执行点击事件的问题
2018/08/30 Javascript
在vue中v-bind使用三目运算符绑定class的实例
2018/09/29 Javascript
JavaScript简单实现的仿微博留言功能示例
2019/01/17 Javascript
vue学习笔记之Vue中css动画原理简单示例
2020/02/29 Javascript
nodejs如何在package.json中设置多条启动命令
2020/03/16 NodeJs
vue各种事件监听实例(小结)
2020/06/24 Javascript
Javascript柯里化实现原理及作用解析
2020/10/22 Javascript
python连接MySQL数据库实例分析
2015/05/12 Python
Python列表(List)知识点总结
2019/02/18 Python
python Jupyter运行时间实例过程解析
2019/12/13 Python
DataFrame 数据合并实现(merge,join,concat)
2020/06/14 Python
sklearn和keras的数据切分与交叉验证的实例详解
2020/06/19 Python
Python QTimer实现多线程及QSS应用过程解析
2020/07/11 Python
英国建筑用品在线:Building Supplies Online(BSO)
2018/04/30 全球购物
NFL Game Pass欧洲:在线观看NFL比赛直播和点播,以高清质量播放
2018/08/30 全球购物
社区班子对照检查材料
2014/08/27 职场文书
夫妻双方自愿离婚协议书
2014/10/24 职场文书
母亲节主题班会
2015/08/14 职场文书
2016个人先进事迹材料范文
2016/03/01 职场文书
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
2021/06/18 MySQL
浅谈Vue的computed计算属性
2022/03/21 Vue.js
nginx之内存池的实现
2022/06/28 Servers
python计算列表元素与乘积详情
2022/08/05 Python