通过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()说明
Jul 10 HTML / CSS
CSS3 实现倒计时效果
Nov 25 HTML / CSS
详解基于 Canvas 手撸一个六边形能力图
Sep 02 HTML / CSS
canvas实现有递增动画的环形进度条的实现方法
Jul 10 HTML / CSS
Bootstrap 学习分享
Nov 12 HTML / CSS
html5弹跳球示例代码
Jul 23 HTML / CSS
24个canvas基础知识小结
Dec 17 HTML / CSS
五个2015 年最佳HTML5 框架
Nov 11 HTML / CSS
canvas裁剪clip()函数的具体使用
Mar 01 HTML / CSS
关于html字符串正则判断和匹配的具体使用
Dec 12 HTML / CSS
HTML5调用手机发短信和打电话功能
Apr 29 HTML / CSS
Html5基于canvas实现电子签名并生成PDF文档
Dec 07 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 传值赋值与引用赋值的区别
2010/12/29 PHP
php新建文件自动编号的思路与实现
2011/06/27 PHP
PHP FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)
2011/07/23 PHP
PHP程序开发范例学习之表单 获取文本框的值
2011/08/08 PHP
php项目开发中用到的快速排序算法分析
2016/06/25 PHP
PHP实现与java 通信的插件使用教程
2019/08/11 PHP
Thinkphp5框架使用validate实现验证功能的方法
2019/08/27 PHP
pjblog中的UBBCode.js
2007/04/25 Javascript
动态样式类封装JS代码
2009/09/02 Javascript
基于promise.js实现nodejs的promises库
2014/07/06 NodeJs
jquery引用方法时传递参数原理分析
2014/10/13 Javascript
jQuery实现的倒计时效果实例小结
2016/04/16 Javascript
javascript简单判断输入内容是否合法的方法
2016/05/11 Javascript
AngularJS解决ng界面长表达式(ui-set)的方法分析
2016/11/07 Javascript
获取当前月(季度/年)的最后一天(set相关操作及应用)
2016/12/27 Javascript
Javascript的this用法
2017/01/16 Javascript
js禁止浏览器的回退事件
2017/04/20 Javascript
js实现本地时间同步功能
2017/08/26 Javascript
vue项目中vue-i18n和element-ui国际化开发实现过程
2018/04/25 Javascript
js实现无缝轮播图特效
2020/05/09 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
2020/09/21 Javascript
使用python3.5仿微软记事本notepad
2016/06/15 Python
基于Python闭包及其作用域详解
2017/08/28 Python
Python+树莓派+YOLO打造一款人工智能照相机
2018/01/02 Python
python3实现网页版raspberry pi(树莓派)小车控制
2020/02/12 Python
django中ImageField的使用详解
2020/12/21 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
2021/02/24 Python
荷兰牛仔裤网上商店:Jeans Centre
2018/04/03 全球购物
耐克波兰官方网站:Nike波兰
2019/09/03 全球购物
意大利时尚奢侈品店:D’Aniello Boutique
2021/01/19 全球购物
法人授权委托书
2014/09/16 职场文书
教师节横幅标语
2014/10/08 职场文书
创业计划书之服装
2019/10/07 职场文书
CSS布局之浮动(float)和定位(position)属性的区别
2021/09/25 HTML / CSS
asyncio异步编程之Task对象详解
2022/03/13 Python
《吸血鬼幸存者》新内容发布 追加多个全新模式
2022/04/07 其他游戏