在前面简单讲述了一下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">确  &nbsp &nbsp  &nbsp  &nbsp  &nbsp  &nbsp &nbsp  &nbsp  &nbsp  &nbsp  定</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制作的海浪效果代码的更多相关文章

  1. 利用html5制作一个时钟动画

    <canvas id="clock" width="500" height="500" style="background- ...

  2. 利用OpacityMask制作打洞效果

    起因 项目上存在一个连线功能,在设计的原型中,在连线中间文字上下各有15像素的空白.接手的同事觉得没思路,问我能不能在不影响连线后面的背景情况下解决该问题.我就抽了点时间给他写了个Demo.回家后趁热 ...

  3. 分享一个基于HTML5实现的视频播放器

    什么是hivideo? 最近一段时间在使用PhoneGap开发一个App应用,App需要播放视频,本想直接使用html5的video,但使用它在全屏播放时不支持横屏播放,只能放弃.最终决定还是自己封装 ...

  4. 分享一个基于HTML5实现的视频播放器【转】

    什么是hivideo? 最近一段时间在使用PhoneGap开发一个App应用,App需要播放视频,本想直接使用html5的video,但使用它在全屏播放时不支持横屏播放,只能放弃.最终决定还是自己封装 ...

  5. 利用css3制作毛玻璃的效果

    忙里偷闲,最近又在看许多比较酷炫的效果.现在基于jquery的插件比较多,但是很多插件的兼容性不是太好,所以原生的才是王道.在日常当中,毛玻璃已经不常见了,那是一个很久远年代的东西了.诺,下面就是毛玻 ...

  6. 利用Clip制作打洞效果

    起因 如上篇博文所说,连线原型需要在中间文字上下各留15像素的空白.设计师完成原型之后,问我有没有办法实现,我说,我能想到两种实现方式.其中一种就是上篇博文所说的OpacityMask.第二种就是使用 ...

  7. 分享一个纯css制作的动画化,在网页(手机)载入等的时候能够引用!

    CSS代码例如以下: /* Custom Stylesheet */ body, html { margin: 0; -webkit-font-smoothing: antialiased; back ...

  8. flash8中利用遮罩制作图片切换效果

    http://www.56.com/w73/play_album-aid-8642763_vid-NDY5ODU2Mzg.html

  9. CorelDRAW快速制作闪耀钻石项链效果

    今天小编为大家分享使用CorelDRAW快速制作闪耀钻石项链效果,过程并不是很复杂,主要用到刻刀工具.智能填充和渐变色的应用,待到一个角完成之后会走一点点捷径,利用旋转复制的方法做出完整的钻石效果,最 ...

随机推荐

  1. PHP面向对象深入研究之【了解类】与【反射API】

    了解类 class_exists验证类是否存在 <?php // TaskRunner.php $classname = "Task"; $path = "task ...

  2. Cocos暂停和重新开始游戏

    创建按钮 cc.MenuItemFont.setFontSize(18); cc.MenuItemFont.setFontName("Arial"); var systemMenu ...

  3. Python 小知识点(1)

    1.Python命名规则------>下划线连接    girl_of_wfb="lgl" 2.常量-----名称全大写->WFB="WFaceBoss&qu ...

  4. sql代码段添加数据

      declare @i int,@index int     set @i=1     set @index=0   while @i<1000000   begin    set @inde ...

  5. linux启动优化:mdev&nbsp;-s自从…

    转载请说明出处:http://control.blog.sina.com.cn/admin/article/article_add.php 近期工作中遇到的问题如下: linux启动后加载根文件系统时 ...

  6. 斯坦福CS229机器学习课程笔记 part3:广义线性模型 Greneralized Linear Models (GLMs)

    指数分布族 The exponential family 因为广义线性模型是围绕指数分布族的.大多数常用分布都属于指数分布族,服从指数分布族的条件是概率分布可以写成如下形式:η 被称作自然参数(nat ...

  7. zookeeper介绍及集群的搭建(利用虚拟机)

    ZooKeeper ​ ZooKeeper是一个分布式的,开放源码(apache)的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase.dubbox.kaf ...

  8. AC自动机详解

    概述 AC自动机全称Aho-Corasick automaton,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法. 考虑这样一个场景,给出L个模式字符串(加总长度为N),以及长度为M大文本, ...

  9. mysql中如何不重复插入满足某些条件的重复的记录的问题

    最近在项目中遇到了这样的一个问题“: 在mysql数据库中需要每次插入的时候不能插入三个字段都相同的记录.在这里使用到了 insert into if not exists  和insert igno ...

  10. MyBatis—实现关联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...