通过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代码实现switch滑动开关按钮效果
Aug 30 HTML / CSS
任意一块网页内容实现“活”的背景(目前火狐浏览器专有)
May 07 HTML / CSS
基于CSS3制作立体效果导航菜单
Jan 12 HTML / CSS
CSS3 animation实现简易幻灯片轮播特效
Sep 27 HTML / CSS
html5菜单折纸效果
Apr 22 HTML / CSS
HTML5中的强制下载属性download使用实例解析
May 12 HTML / CSS
canvas拼图功能实现代码示例
Nov 21 HTML / CSS
canvas学习总结三之绘制路径-线段
Jan 31 HTML / CSS
HTML5语义化元素你真的用对了吗
Aug 22 HTML / CSS
Html5导航栏吸顶方案原理与对比实现
Jun 10 HTML / CSS
在html页面中取得session中的值的方法
Aug 11 HTML / CSS
Html5同时支持多端sdk的小技巧
Nov 17 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
第十节 抽象方法和抽象类 [10]
2006/10/09 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
2017/02/15 PHP
ThinkPHP 模板引擎使用详解
2017/05/07 PHP
基于Laravel-admin 后台的自定义页面用法详解
2019/09/30 PHP
javascript下给元素添加事件的方法与代码
2007/08/13 Javascript
js完美实现@提到好友特效(兼容各大浏览器)
2015/03/16 Javascript
javascript背景时钟实现方法
2015/06/18 Javascript
详解Jquery实现ready和bind事件
2016/04/14 Javascript
JS添加删除DIV的简单实例
2016/07/08 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
jQuery实现文档树效果
2017/02/20 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
2017/03/31 Javascript
PHP7新特性简述
2017/06/11 Javascript
nginx部署访问vue-cli搭建的项目的方法
2018/02/12 Javascript
Vue Router去掉url中默认的锚点#
2018/08/01 Javascript
JavaScript 对引擎、运行时、调用堆栈的概述理解
2018/10/22 Javascript
微信小程序云开发使用方法新手初体验
2019/05/16 Javascript
微信小程序npm引入vant-weapp的踩坑记录
2019/08/01 Javascript
微信小程序实现左滑删除效果
2020/11/18 Javascript
python自动zip压缩目录的方法
2015/06/28 Python
python数据结构之图的实现方法
2015/07/08 Python
Python wxPython库消息对话框MessageDialog用法示例
2018/09/03 Python
django将网络中的图片,保存成model中的ImageField的实例
2019/08/07 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
2019/09/11 Python
解决flask接口返回的内容中文乱码的问题
2020/04/03 Python
浅析Python 序列化与反序列化
2020/08/05 Python
python 输入字符串生成所有有效的IP地址(LeetCode 93号题)
2020/10/15 Python
什么是CSS3 HSLA色彩模式?HSLA模拟渐变色条
2016/04/26 HTML / CSS
亚历山大·王官网:Alexander Wang
2017/06/23 全球购物
最新茶叶店创业计划书
2014/01/14 职场文书
小学信息技术教学反思
2014/02/10 职场文书
设备动力科岗位职责范本
2014/02/23 职场文书
关于环保的建议书400字
2014/03/12 职场文书
求职信范文大全
2014/05/26 职场文书
学位证书委托书
2014/09/30 职场文书
趣味运动会广播稿
2015/08/19 职场文书