SVG+JS驱动的波浪动画

裂谷
• 阅读 7815

先上效果图:
这只是SVG+JS驱动的动画的惊鸿一瞥,这里用到的技术,只是其皮毛。三次以上的贝塞尔曲线,更加复杂的函数控制SVG路径……路总要一步一步走,先总结一下当前实现的效果吧!

功能:随意指定高度和宽度(在SVG pathd属性中填写相关参数),波浪的高度会在高度和-高度之间来会变动,时间控制使用了setInterval,因此可以指定动画速度。

SVG+JS驱动的波浪动画

 <html>
 <head>
 </head>
<body>

<svg style="width:100%;height:250px;margin:0;padding:0;">
//绘制背景方框,大小为50*6400
<path d="M0 110v50h6400v-50z" stroke="#fff" style="fill:#529BB3;stroke-width:0px;"></path>
//绘制二次贝塞尔曲线,q的控制点为(50,20),其后跟随的t会自动对称该控制点,因此t命令中只要指定结束点即可
<path id="wave1" d="M0 110q50 20,100 0t100 0t100 0t100 0t100 0t100 0t100 0t100 0t100 0t100 0t100 0t100 0t100 0t100 0t100 0" stroke="#fff" style="fill:lightblue;stroke-width:1px;"></path>

</svg>
<script>
(function(){
  //利用正则获取传入元素的控制点高度并返回
  var getHeight=function($ele){
    var path=$ele.getAttribute('d');
    var height=parseInt(/q\d{2}\s(\-*\d{1,2})/.exec(path)[1]);
    return height;
  };
  //时间控制主函数
  var myTimer=function(id,callback){
    var $ele=document.querySelector(id);
    //利用前面的函数获取高度
    var height=getHeight($ele);
    var num=height;
    //高度递减时flag为true
    var flag=true;
    setInterval(function(){
      if (flag) {
        height--;
        //如果高度达到最低点,则flag设为false,高度开始递增
        if (height <= -num) {flag = false;}
      } else {
        height++;
        if (height >= num) {flag = true;}
      };
      //调用回调函数,改变元素属性值
      callback($ele,height);
    },50);
  };
  var changeHeight=function($ele,val){
    //利用正则提取元素控制点高度
    var array=$ele.getAttribute('d').split(/(q\d{2}\s)(\-*\d{1,2})/);
    //改变控制点高度
    array[2]=val;
    //给元素写入改变后的高度
    $ele.setAttribute('d',array.join(''));
  };
  //执行主函数
  myTimer('#wave1',changeHeight);
})();
</script>
 </body>
 </html>

参考资料:
深度掌握SVG路径path的贝塞尔曲线指令 « 张鑫旭-鑫空间-鑫生活
路径 - SVG | MDN
如何获取setInterval中函数的返回值?

点赞
收藏
评论区
推荐文章
晴空闲云 晴空闲云
3年前
svg中path贝塞尔曲线和圆弧图文详解
最近研究了一下svg的path标签,功能非常强大,理论上来讲path标签可以画出任意图形。自己记性不太好,记录一下path的使用语法和自己的理解。path介绍path用d属性来描述路径,语法格式大概如下:html其中路径描述包含如下命令:Mmoveto移动到某点。Llineto画一条直线到某点。Hhorizontallineto
晴空闲云 晴空闲云
3年前
svg用animate实现简单动画效果
svg中可以使用animate标签实现动画效果。就是在相应的形状标签内加入animate标签,其中若干属性如下:attributeName目标属性名称from起始值to结束值dur持续时间repeatCount次数|indefinite,动画时间将发生几次,indefinite表示无限次。一个简单示例效果,颜色在3秒内从steelblue
徐小夕 徐小夕
4年前
如何使用css3实现一个类在线直播的队列动画
之前在群里有个朋友问了这样一个问题,就是如何在小程序中实现类似直播平台的用户上线时的队列动画?作为一名前端工程师,解决方案无非以下2种:1.使用javascript根据条件来控制元素的样式实现队列动画2.用纯css3配合数据驱动模型来实现.大家都知道在现代的Web开发中,我们能使用Css实现的效果尽量不要用Js,所以我们应该优先考虑用C
Chase620 Chase620
4年前
CSS3动画之逐帧动画
CSS3动画开发指南第二弹,剥丝抽茧为你解析逐帧动画,同时放送从实战经验中总结出来的逐帧动画使用技巧。什么是逐帧动画要了解CSS3逐帧动画,首先要明确什么是逐帧动画。看一下维基百科中的定义:定格动画,又名逐帧动画,是一种动画技术,其原理即将每帧不同的图像连续播放,从而产生动画效果。简而言之,实现逐帧动画需要两个条件:(1)相关联
Stella981 Stella981
3年前
Flutter 贝塞尔曲线切割
现在人们对于网站的美感要求是越来越高了,所以很多布局需要优美的曲线设计。当然最简单的办法是作一个PNG的透明图片,然后外边放一个Container.但其内容如果本身就不是图片,只是容器,这种放入图片的做法会让包体变大。其实我们完全可以使用贝塞尔曲线进行切割。!(https://oscimg.oschina.net/oscnet/4e9a304ba
Stella981 Stella981
3年前
Flutter 之贝塞尔曲线(一)
贝塞尔曲线简介!(https://oscimg.oschina.net/oscnet/863784996212c918a1feef7a916bce28f31.png"bezier1.png")bezier1.png由上图可以看出:A,C依据控制点B不断的取点使得AD:ABBE:BCDF:DE,构成一个二阶贝塞尔曲线。AD:
Stella981 Stella981
3年前
Flutter贝塞尔曲线之水波纹与球形进度(二)
续上篇,再用贝塞尔曲线绘制一个循环水波纹,一个水波纹进度球,先看效果,以下效果的实现用的都是二阶贝塞尔曲线。效果图!(https://oscimg.oschina.net/oscnet/db689ecfebdfa10dbc59b588184913f7c6f.gif"bezierShow4.gif")bezierShow4.
Stella981 Stella981
3年前
CSS3 SVG实现可爱的动物哈士奇和狐狸动画
今天,我想向大家展示如何巧妙地使用HTML、CSS排序动画和SVG滤镜把生活中可能最可爱的东西之一——动物画到网页上。我们将探讨绘制动物的两种技术:一种使用纯HTML和CSS,另一种使用内联SVG背景图像。此演示高度实验性质——动画SVG滤镜目前仅在Chrome中可用。所涉及的动画也很复杂,因此本教程将重点介绍创建这些动物以及栩栩如生的动作所涉及
Stella981 Stella981
3年前
Android 应用的动画实践
<h2id"menuIndex0"前言</h2<p尝试搜索了一下android动画的中文资料,很多都是一些枯燥的翻译api的一些文档,很少有系统讲解如何利用动画开发一个应用的资料,忽然,发现很多应用也不怎么注重动画在app的应用,想了想,自己尝试总结一下吧。因为,本人也不是什么动画制作师,没法把动画做得很绚丽,只好,利用内置的效果,进行简单加工
Wesley13 Wesley13
3年前
Unity 2D游戏开发教程之使用脚本实现游戏逻辑
Unity2D游戏开发教程之使用脚本实现游戏逻辑使用脚本实现游戏逻辑通过上一节的操作,我们不仅创建了精灵的动画,还设置了动画的过渡条件,最终使得精灵得以按照我们的意愿,进入我们所指定的动画状态。但是这其中还有一些问题。例如,我们无法使用键盘控制精灵当前要进入的动画状态,而且精
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(