用Canvas为网页添加动态背景

作者:uedtianji

最近刚刚接到为微信公众帐号“玩转三里屯”制作首页的任务。考虑到页面只在手机中浏览,而且手机对canvas的支持又非常好,所以打算使用canvas做点不一样的动画。

首先来看下效果图。

要实现这样的动画普通的CSS3是鞭长莫及了,只能使用Canvas。好在使用canvas也非常简单。

Step1.

新建一个画布(<canvas>)元素,并放在在所有按钮和logo的下方以免遮挡前面的元素。

<canvas id="canvas" style="position:absolute;top:0px;left:0px;z-index:1;"></canvas>  

将Canvas的宽高设定成其父元素的宽高,以充满他的父元素。也可以直接使用window.innerHeight,window.innerWidth。使其充满整个屏幕。

var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
canvas.width = canvas.parentNode.offsetWidth;
canvas.height = canvas.parentNode.offsetHeight;

Step2.

在画布中画一个充满半个屏幕的矩形。

我们只需要找到矩形的四个定点的坐标,使用Canvas的绘制路径并填充这个路径。四个点分别是:

(0, 画布高度t/2)
(画布宽度, 画布高度t/2)
(画布宽度 画布高度t/2)
(0, 画布高度t/2)

注意:坐标的(0,0)在画布的左上角。

//填充颜色
ctx.fillStyle = "rgba(0,222,255, 0.2)";
//开始绘制路径
ctx.beginPath();
//左上角
ctx.moveTo(0, canvas.height/2);
//右上角
ctx.lineTo(canvas.width, canvas.height/2);
//右下角
ctx.lineTo(canvas.width, canvas.height);
//左下角
ctx.lineTo(0, canvas.height);
//左上角
ctx.lineTo(0, canvas.height/2);
//闭合路径
ctx.closePath();
//填充路径
ctx.fill();

运行代码:

Step3.

让矩形动起来。要做动画我们需要持续的清空画布并重新绘制新的矩形,就像电影每秒播放24张图片。我们新建一个loop函数,用来绘制每一帧的图像,并使用requestAnimFrame来告诉浏览器每一帧都要使用loop来绘制。

//如果浏览器支持requestAnimFrame则使用requestAnimFrame否则使用setTimeout
window.requestAnimFrame = (function(){
return  window.requestAnimationFrame       ||window.webkitRequestAnimationFrame ||window.mozRequestAnimationFrame    ||function( callback ){window.setTimeout(callback, 1000 / 60);};
})();
function loop(){requestAnimFrame(loop);
}
loop();

把之前绘制矩形的代码放到loop中,并在绘制矩形的代码之前清空画布中所有的图形。

function loop(){//清空canvasctx.clearRect(0,0,canvas.width,canvas.height);//绘制矩形ctx.fillStyle = "rgba(0,222,255, 0.2)";ctx.beginPath();ctx.moveTo(0, canvas.height/2);ctx.lineTo(canvas.width, canvas.height/2);ctx.lineTo(canvas.width, canvas.height);ctx.lineTo(0, canvas.height);ctx.lineTo(0, canvas.height/2);ctx.closePath();ctx.fill();requestAnimFrame(loop);
}

接下来我们更改每一帧中的矩形的高度来模拟波浪的形态,波浪其实是在波峰与波谷之间做周期性运动。我们假设波峰与波谷间都是50px,那么矩形的高度的变化值应该在-50px到50px之间。为了达到周期性的效果我们采用正弦函数sin(x),因为不管x值怎么变化sin(x)的值始终在-1与1之间。我们新建一个变量 var step =0 使其在每一帧中自增,表示每一帧角度增加一度,并用Math.sin()取他的正弦值。JS中的sin使用的弧度值,我们需要把step转换成弧度值,var angle = step*Math.PI/180; 取角度的正弦值乘以50得到了矩形高度的变化量。将变化量加在矩形的左上与右上两个顶点的y坐标上。

//初始角度为0
var step = 0;
function loop(){ctx.clearRect(0,0,canvas.width,canvas.height);ctx.fillStyle = "rgba(0,222,255, 0.2)";//角度增加一度step++;//角度转换成弧度var angle = step*Math.PI/180;//矩形高度的变化量var deltaHeight   = Math.sin(angle) * 50;ctx.beginPath();//在矩形的左上与右上两个顶点加上高度变化量ctx.moveTo(0, canvas.height/2+deltaHeight);ctx.lineTo(canvas.width, canvas.height/2+deltaHeight);ctx.lineTo(canvas.width, canvas.height);ctx.lineTo(0, canvas.height);ctx.lineTo(0, canvas.height/2+deltaHeight);ctx.closePath();ctx.fill();requestAnimFrame(loop);
}

运行代码:

将右上顶点的变化值改为角度的余弦,使其左右不同步。var deltaHeightRight   = Math.cos(angle) * 50;

//初始角度为0
var step = 0;
function loop(){ctx.clearRect(0,0,canvas.width,canvas.height);ctx.fillStyle = "rgba(0,222,255, 0.2)";//角度增加一度step++;//角度转换成弧度var angle = step*Math.PI/180;//矩形高度的变化量var deltaHeight   = Math.sin(angle) * 50;//矩形高度的变化量(右上顶点)var deltaHeightRight   = Math.cos(angle) * 50;ctx.beginPath();ctx.moveTo(0, canvas.height/2+deltaHeight);//右上顶点ctx.lineTo(canvas.width, canvas.height/2+deltaHeightRight);ctx.lineTo(canvas.width, canvas.height);ctx.lineTo(0, canvas.height);ctx.lineTo(0, canvas.height/2+deltaHeight);ctx.closePath();ctx.fill();requestAnimFrame(loop);
}

运行代码:

Step4

将矩形的顶上的边变成曲线。

在上面的代码中我们用lineTo来绘制矩形的边,为了要绘制曲线我们需要

bezierCurveTo(cpX1, cpY1, cpX2, cpY2, x, y)

函数。绘制的起点是矩形的左上顶点,结束点为右上顶点。bezierCurveTo函数的参数中(cpX1,cpY1)与(cpX2,cpY2)分别是起点与结束点的控制点,(x,y)为结束点。我们将两个控制点的x值设定在画布的正中心,y值在起始点与终点的y值上面减去50;(canvas.width /2, canvas.height/2+deltaHeight-50),(canvas.width / 2,canvas.height/2+deltaHeightRight-50),可以根据效果调整。

ctx.bezierCurveTo(canvas.width /2, canvas.height/2+deltaHeight-50, canvas.width / 2, canvas.height/2+deltaHeightRight-50, canvas.width,canvas.height/2+deltaHeightRight);
ctx.beginPath();
ctx.moveTo(0, canvas.height/2+deltaHeight);
//ctx.lineTo(canvas.width, canvas.height/2+deltaHeightRight);
//画曲线
ctx.bezierCurveTo(canvas.width /2, canvas.height/2+deltaHeight-50, canvas.width / 2, canvas.height/2+deltaHeightRight-50, canvas.width, canvas.height/2+deltaHeightRight);
ctx.lineTo(canvas.width, canvas.height);
ctx.lineTo(0, canvas.height);
ctx.lineTo(0, canvas.height/2+deltaHeight);
ctx.closePath();

运行代码:

Step5

一个波浪画好了。我们只需要同时画3个不同颜色的波浪,并且使不同波浪的角度不同就可以得到效果图中的效果了。

//定义三条不同波浪的颜色
var lines = ["rgba(0,222,255, 0.2)","rgba(157,192,249, 0.2)","rgba(0,168,255, 0.2)"];
function loop(){ctx.clearRect(0,0,canvas.width,canvas.height);step++;//画3个不同颜色的矩形for(var j = lines.length - 1; j >= 0; j--) {ctx.fillStyle = lines[j];//每个矩形的角度都不同,每个之间相差45度var angle = (step+j*45)*Math.PI/180;var deltaHeight   = Math.sin(angle) * 50;var deltaHeightRight   = Math.cos(angle) * 50;ctx.beginPath();ctx.moveTo(0, canvas.height/2+deltaHeight);ctx.bezierCurveTo(canvas.width /2, canvas.height/2+deltaHeight-50, canvas.width / 2, canvas.height/2+deltaHeightRight-50, canvas.width, canvas.height/2+deltaHeightRight);ctx.lineTo(canvas.width, canvas.height);ctx.lineTo(0, canvas.height);ctx.lineTo(0, canvas.height/2+deltaHeight);ctx.closePath();ctx.fill();}requestAnimFrame(loop);
}

运行代码:

Step6

添加好按钮与logo的HTML代码就大功告成了。

查看所有代码请去Github

用Canvas为网页添加动态背景相关推荐

  1. 用HTML5 Canvas为网页添加动态波浪背景

    查看所有代码请去Github 本文出自 "UED" 博客:http://5344794.blog.51cto.com/5334794/1430877 <!DOCTYPE ht ...

  2. html5给网页添加视频背景

    html5给网页添加视频背景 1. 先插入如下代码: <video src="../video/2b.mp4" loop="loop" autoplay= ...

  3. 关闭CSDN网页端动态背景特效

    关闭CSDN网页端动态背景特效 许多博客都采用了动态背景特效,虽然也许有些好看,但对于我的老式笔记本来说是一个很大的负担.每次打开带有特效的博客,cpu占用率立马飚到70%,风扇直接3000+,都不能 ...

  4. 给网页添加动态视频背景 html+css

    前言: 普通图片: 给网页添加背景图片 html+css 动态: 就是换成MP4格式作为网页背景. 实现: 定义html的video标签: <video src="xiamu.mp4& ...

  5. 如何在html网页添加动态特效,《让网页动起来----动态HTML》教学案例

    <<让网页动起来----动态HTML>教学案例.doc>由会员分享,可免费在线阅读全文,更多与<<让网页动起来----动态HTML>教学案例>相关文档资 ...

  6. 网页粒子动态背景Particles.js

    下载地址 很酷的网页粒子特效,可以作为动态背景效果Particles.js dd:

  7. 怎么给网页加动态背景

    <video src="xxx.mp4" class="bjimg" autoplay loop muted></video> xxx就 ...

  8. 前端实现给文字添加动态背景

  9. 给网页添加背景图片1

    我们在打开博客的时候,有时会看到有的网页添加了背景图片.从而让网页增加了不少的乐趣.一个好的背景可以更好体现网站的风格.也让自己的网站与众不同.赏心悦目的图片可以让人眼前一亮. 同样,我们在网站制作过 ...

最新文章

  1. Java并发编程-CountDownLatch
  2. 方舟服务器如何修改恐龙,方块方舟人物及驯养恐龙属性修改教程 人物属性怎么修改_游侠网...
  3. 网络上的FreeBSD在线文档
  4. RedisTemplate方法的一些简单运用
  5. sql添加列,删除列,修改列
  6. 如何步入深度学习刷榜第一重境界
  7. Sqlserver中格式化日期作为查询条件的语句写法
  8. 关于h5py的使用及数据封装实例
  9. inux读取ISO文件或是光驱的方法--挂载
  10. 索非亚机器人的采访_还记得曾经扬言要“毁灭人类”的机器人索菲亚吗?如今过成这样...
  11. NodeJS使用淘宝 NPM 镜像/NPM使用国内源
  12. 对I2C总线的时钟同步和总线仲裁的深入理解
  13. 十五天精通WCF——第十三天 用WCF来玩Rest
  14. android viewholder继承,Android RecyclerView中的ViewHolder
  15. xp系统更改计算机名c盘,c盘满了怎么办,小编教你电脑xp的c盘满了怎么办
  16. 安装bcc、cachetop、cachestat
  17. vue3最简单的在线md编辑器
  18. 2021最新微信域名链接检测工具 微信域名拦截检测接口
  19. [JavaScript学习记录] 首次运用于网页,做一个简易利息计算器!!!
  20. 用户登录撞库与bean作用域问题

热门文章

  1. 两个div并排 左边div宽固定 右边自适应
  2. Python全栈编程
  3. thinking in uml 大象 用例
  4. PGP 对于JSON的加解密
  5. mysql eva模型_第四章 Schema 与数据类型优化
  6. Java类型转换笔记
  7. Dubbo-02 20190315
  8. aabbcc本质不同的排列数
  9. SVN:无校验和记录解决办法
  10. Jetty篇教程 之Jetty 嵌入式服务器