通过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实现文字向右循环闪过效果实例(可用于移动端)
Jun 15 HTML / CSS
利用CSS3伪元素实现逐渐发光的方格边框
May 07 HTML / CSS
css3针对移动端卡顿问题的解决(动画性能优化)
Feb 14 HTML / CSS
html+css实现自定义图片上传按钮功能
Sep 04 HTML / CSS
详解FireFox下Canvas使用图像合成绘制SVG的Bug
Jul 10 HTML / CSS
开发人员所需要知道的HTML5性能分析面面观
Jul 05 HTML / CSS
html5的新增的标签和废除的标签简要概述
Feb 20 HTML / CSS
血轮眼轮回眼特效 html+css
Mar 31 HTML / CSS
CSS极坐标的实例代码
Jun 03 HTML / CSS
CSS实现两列布局的N种方法
Aug 02 HTML / CSS
Canvas如何做个雪花屏版404的实现
Sep 25 HTML / CSS
通过feDisplacementMap和feImage实现水波特效
Apr 24 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抽象工厂模式(Elgg)
2010/03/21 PHP
Prototype 学习 工具函数学习($w,$F方法)
2009/07/12 Javascript
Mootools 1.2教程 函数
2009/09/15 Javascript
基于Jquery的实现回车键Enter切换焦点
2010/09/14 Javascript
javascript setinterval 的正确语法如何书写
2014/06/17 Javascript
js实现局部页面打印预览原理及示例代码
2014/07/03 Javascript
jQuery验证插件 Validate详解
2014/11/20 Javascript
jQuery中not()方法用法实例
2015/01/06 Javascript
JavaScript模块化开发之SeaJS
2015/12/13 Javascript
JS焦点图,JS 多个页面放多个焦点图的实例
2016/12/08 Javascript
详解React Native网络请求fetch简单封装
2017/08/10 Javascript
jQuery实现的简单无刷新评论功能示例
2017/11/08 jQuery
vue使用iframe嵌入网页的示例代码
2020/06/09 Javascript
关于vue v-for 循环问题(一行显示四个,每一行的最右边那个计算属性)
2018/09/04 Javascript
vuejs中监听窗口关闭和窗口刷新事件的方法
2018/09/21 Javascript
AngularJs返回前一页面时刷新一次前面页面的方法
2018/10/09 Javascript
PM2自动部署代码步骤流程总结
2018/12/10 Javascript
详解Vue中组件传值的多重实现方式
2019/08/16 Javascript
微信小程序云函数添加数据到数据库的方法
2020/03/04 Javascript
在GitHub Pages上使用Pelican搭建博客的教程
2015/04/25 Python
Python的Urllib库的基本使用教程
2015/04/30 Python
Python计算两个日期相差天数的方法示例
2017/05/23 Python
Python3 单行多行万能正则匹配方法
2019/01/07 Python
在Qt中正确的设置窗体的背景图片的几种方法总结
2019/06/19 Python
python调用支付宝支付接口流程
2019/08/15 Python
Python中list循环遍历删除数据的正确方法
2019/09/02 Python
tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例
2020/01/21 Python
pandas处理csv文件的方法步骤
2020/10/16 Python
CSS3制作炫酷的自定义发光文字
2016/03/28 HTML / CSS
html5 Canvas画图教程(1)—画图的基本常识
2013/01/09 HTML / CSS
Under Armour安德玛英国官网:美国高端运动科技品牌
2018/09/17 全球购物
幼儿园教师考核制度
2014/02/01 职场文书
租赁意向书范本
2014/04/01 职场文书
MySql学习笔记之事务隔离级别详解
2021/05/12 MySQL
详解Java实现数据结构之并查集
2021/06/23 Java/Android
TV动画「神渣☆爱豆」公开第一弹主视觉图
2022/03/21 日漫