在前面简单讲述了一下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. MFC学习(二)

    WinApp封装了程序的主入口WinMain,WinMain就和C语言的main函数地位一样,是Win32程序的入口.在MFC的封装中,一个程序启动,Windows调用WinMain,这个WinMai ...

  2. nandflash裸机程序分析

    它包含7个文件: head.S init.c main.c Makefile nand.c nand.lds 我们之前的程序都是在nandflash的前4k放代码,上电后自动拷贝到SRAM中,之后将S ...

  3. springboot成神之——websocket发送和请求消息

    本文介绍如何使用websocket发送和请求消息 项目目录 依赖 DemoApplication MessageModel WebConfig WebSocketConfig HttpHandshak ...

  4. 详解调试Apache的mod_rewrite模块

    大家都知道Apache里面的Rewrite规则是一件很蛋疼的事情,有时候只是想做一个伪静态而已,不想去研究那些复杂的规则,可官方给的规则又常常出错,出了问题我们就要调试一下,看看提交的参数被映射到了哪 ...

  5. hive函数

    内置函数 测试各种内置函数的快捷方法: 1.创建一个dual表 create table dual(id string); 2.load一个文件(一行,一个空格)到dual表 3.select sub ...

  6. [原创]Spring Boot + Mybatis 简易使用指南(二)多参数方法支持 与 Joda DateTime类型支持

    前言 今天在开发练习项目时遇到两个mybatis使用问题 第一个问题是mapper方法参数问题,在参数大于一个时,mybatis不会自动识别参数命名 第二个问题是Pojo中使用Joda DateTim ...

  7. 【知识碎片】Asp.Net 篇

    51.app.config 连接字符串 <?xml version="1.0" encoding="utf-8"?> <configurati ...

  8. java多线程编程核心技术-笔记

    一.第一章 1.自定义线程类中实例变量针对其他线程有共享和不共享之分,自定义线程中的变量,如果是继承自thread类,则每个线程中的示例变量的更改,不影响其他线程2.当多个线程去访问一个局部变量是会产 ...

  9. MyEclipse从数据库反向生成实体类通过Hibernate的方式----mysql数据库实例

    1.我们通过DB与数据库建立连接 2.建立web工程,构建Hibernate框架 3.通过table生成实体类

  10. spring注解创建对象