分享一个利用HTML5制作的海浪效果代码
在前面简单讲述了一下HTML里的Canvas,这次根据Canvas完成了“海浪效果”(水波上升)。
(O(∩_∩)O哈哈哈~作者我能看这个动画看一下午)

上升水波.gif
动画分析
构成:贝塞尔曲线
画布:Canvas
效果:波浪涨潮(上升、波动)
触发条件:点击按钮

贝塞尔曲线.gif
算法实现分析:从sin()函数切入,sin()越大波度起伏越大,简单说就是通过不断改变sin()值来实现海浪效果动画
干货开始:
1、创建触发条件(按钮)
|
1
2
3
4
5
|
<button type="button" onclick="Beisizer()"//点击时触发JS事件 onmouseover="bcd()"//鼠标经过时JS事件 onmouseleave="out()"//鼠标离开时JS事件 id="Anniu">确                     定</button> |
2、创建画布Canvas
|
1
|
<canvas id="Theback"></canvas> |
3、创建JS事件(属性设置)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
//获取画布 var beisizer = document.getElementById("Theback"); var ContenofBeisizer = beisizer.getContext("2d"); //设置波浪海域(海浪宽度,高度) var beisizerwidth = beisizer.width; var beisizerheight = beisizer.height; var beisizerlinewidth = 2;//曲线 var sinX = 0; var sinY = beisizerheight/2.0;//轴长 var axisLenght = beisizerwidth;//弧度宽度 var waveWidth = 0.014;//海浪高度 var waveHeight = beisizerheight / 15.0;ContenofBeisizer.lineWidth = beisizerlinewidth; |
4、画贝塞尔曲线
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
var drawSin = function (xofspeed) { ContenofBeisizer.save(); //存放贝塞尔曲线的各个点 var points = []; ContenofBeisizer.beginPath(); //创建贝塞尔点 for (var x = sinX;x < sinX +axisLenght;x+=80/axisLenght){ // var y = -Math.sin((sinX+x)*waveWidth); 测试请解开注释,注释下一行 var y = -Math.sin((sinX+x)*waveWidth+xofspeed); // points.push([x,sinY + y * waveHeight]); 测试请解开注释,注释下一行 points.push([x,rand+y*waveHeight]); // ContenofBeisizer.lineTo(x,sinY + y * waveHeight); 测试请解开注释,注释下一行 ContenofBeisizer.lineTo(x,rand + y * waveHeight); } ContenofBeisizer.lineTo(axisLenght,beisizerheight); ContenofBeisizer.lineTo(sinX,beisizerheight); ContenofBeisizer.lineTo(points[0][0],points[0][1]); ContenofBeisizer.stroke(); ContenofBeisizer.restore(); //贝塞尔曲线样式设置 ContenofBeisizer.strokeStyle = "#3bc777"; ContenofBeisizer.fillStyle = "#3bc777"; ContenofBeisizer.fill(); }; |
这一段代码已经完成静态贝赛尔曲线的绘制了,可以通过解开以下语句尝试运行看下效果。
var y = -Math.sin((sinX+x)*waveWidth);points.push([x,rand+y*waveHeight]);var y = -Math.sin((sinX+x)*waveWidth+xofspeed);
运行方法执行 drawSin()

静态贝塞尔曲线.png
5、海浪效果的实现
需要在属性中加入一下代码进行速率的设置var speed = 0.1; 数值越大速率越快var xofspeed = 0; 波浪横向的偏移量var rand = beisizerheight;波浪高度
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
var rendY = function () { ContenofBeisizer.clearRect(0,0,beisizerwidth,beisizerheight); //控制海浪高度 var tmp = 0.1; rand-=tmp; var b = beisizerheight - rand; //控制循环涨潮 if (parseInt(b)==beisizerheight){ rand = beisizerheight; } drawSin(xofspeed); drawSinl(xofspeed); xofspeed += speed; requestAnimationFrame(rendY);}; |
通过调用自身产生不同的高度,来产生海浪效果。这里设置的属性值配合第四步画贝塞尔曲线一起进行理解。
运行方式 rendY();
总结
贝赛尔曲线也可以制作音波,心跳仪等。可以尝试改变频率值来实现。
分享一个利用HTML5制作的海浪效果代码的更多相关文章
- 利用html5制作一个时钟动画
<canvas id="clock" width="500" height="500" style="background- ...
- 利用OpacityMask制作打洞效果
起因 项目上存在一个连线功能,在设计的原型中,在连线中间文字上下各有15像素的空白.接手的同事觉得没思路,问我能不能在不影响连线后面的背景情况下解决该问题.我就抽了点时间给他写了个Demo.回家后趁热 ...
- 分享一个基于HTML5实现的视频播放器
什么是hivideo? 最近一段时间在使用PhoneGap开发一个App应用,App需要播放视频,本想直接使用html5的video,但使用它在全屏播放时不支持横屏播放,只能放弃.最终决定还是自己封装 ...
- 分享一个基于HTML5实现的视频播放器【转】
什么是hivideo? 最近一段时间在使用PhoneGap开发一个App应用,App需要播放视频,本想直接使用html5的video,但使用它在全屏播放时不支持横屏播放,只能放弃.最终决定还是自己封装 ...
- 利用css3制作毛玻璃的效果
忙里偷闲,最近又在看许多比较酷炫的效果.现在基于jquery的插件比较多,但是很多插件的兼容性不是太好,所以原生的才是王道.在日常当中,毛玻璃已经不常见了,那是一个很久远年代的东西了.诺,下面就是毛玻 ...
- 利用Clip制作打洞效果
起因 如上篇博文所说,连线原型需要在中间文字上下各留15像素的空白.设计师完成原型之后,问我有没有办法实现,我说,我能想到两种实现方式.其中一种就是上篇博文所说的OpacityMask.第二种就是使用 ...
- 分享一个纯css制作的动画化,在网页(手机)载入等的时候能够引用!
CSS代码例如以下: /* Custom Stylesheet */ body, html { margin: 0; -webkit-font-smoothing: antialiased; back ...
- flash8中利用遮罩制作图片切换效果
http://www.56.com/w73/play_album-aid-8642763_vid-NDY5ODU2Mzg.html
- CorelDRAW快速制作闪耀钻石项链效果
今天小编为大家分享使用CorelDRAW快速制作闪耀钻石项链效果,过程并不是很复杂,主要用到刻刀工具.智能填充和渐变色的应用,待到一个角完成之后会走一点点捷径,利用旋转复制的方法做出完整的钻石效果,最 ...
随机推荐
- Bash脚本编程总结
bash脚本编程之用户交互: read [option]… [name …] -p ‘PROMPT’ -t TIMEOUT bash -n /path/to/some_script 检测脚本中的 ...
- 基于Nfs和Samba的Lamp环境实现
一 系统环境二 网络文件系统与web环境的结合三 搭建lamp环境四 实现nfs服务五 实现samba服务六 实现效果 一 系统环境 系统平台:CentOS release 6.8 (Final) L ...
- hibernate缓存机制详细介绍
hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别). 一:hibernate的 N+1问题 list()获得对象: 如果通过list()方法 ...
- java - 输入的字符串中是否包含中文
今天和同事在讨论一个问题,需要检查“输入的字符串中是否包含中文”,刚开始想到是用正则表达式,正则表达式中是以[u4e00-u9fa5]来全匹配字符是否是中文,但现在面临的问题是这个字符串中还可能包含英 ...
- chrome启动参数设置
chrome禁止本地浏览时加载本地其他文件,可以采用添加启动参数的方式来支持 添加参数为 --allow-file-access-from-files 或者 --disable-web-securi ...
- 手机发烫是为何—— App 电量测试定位方法
为什么要做电量测试 随着移动互联网的快速发展,手机的实用性.娱乐性越来越强.日常使用中发现,安装了应用后,即使不怎么使用,电量也会消耗很快.但如果恢复出场设置充满电后,手机可以待机很长时间.真相只有一 ...
- TreeView的异步延时加载
TreeView的延时加载 在使用TreeView控件的时候,如果数据量太大,这个TreeView控件加载会很慢,有时甚至加载失败, 为了更好的使用TreeView控件加载大量的数据,采用异步延迟加载 ...
- Android studio如何和VS的region一样折叠代码
相信用过VS的朋友都会经常有用到VS的region来折叠代码,非常方便.那么Android studio是否可以呢?当然可以. 选择代码,Ctrl + Alt + T 选择 第二项,这样就可以啦
- web界面上的字体兼容方案
原贴地址:http://www.baidufe.com/item/60cd11d3bfdee5c51369.html 做前端的,对web界面基本都抠的很仔细,尤其精确到1px! 类似边距.宽度.高度等 ...
- spring注解创建对象