canvas动画
canvas就像一个画板你画的每个东西都在一个板上没有元素的概念.canvas动画就是不断的重绘来实现的,也就是动画的每一帧都是一幅静态的图片。
其实canvas动画无外乎三个步骤:
1.准备要画的元素及其位置颜色等等....
2.用一个定时器不断改变元素的一些属性如位置
3.再用一个定时器清除画布,画变化中的元素
1.开始准备元素
/**画星星**/ function dragStar(a,b,ctx,r1,r2){ ctx.beginPath(); ctx.fillStyle="#f8b203"; for(var i=0;i<5;i++){ ctx.lineTo(a+r2*Math.cos((18+i*72)*Math.PI/180),b-r2*Math.sin((18+i*72)*Math.PI/180)); ctx.lineTo(a+r1*Math.cos((54+i*72)*Math.PI/180),b-r1*Math.sin((54+i*72)*Math.PI/180)); } ctx.closePath(); ctx.fill(); }; /**画围绕圆的星星**/ function dragCicle(x,y,R,radio){ var max = 5+radio,angle = 360/max; for(var j=0;j<max;j++){ var X =x + R*Math.cos(j*angle*Math.PI/180); var Y =y - R*Math.sin(j*angle*Math.PI/180); dragStar(X,Y,ctx,10+2*radio,5+1*radio); } };
2.绘制动画(因为这里是整个画面的动画所以没有第二步)
(function(){ iNumber++; ctx.clearRect(0,0,oc.width,oc.height); ctx.save(); ctx.transform(1,angleX,angleY,1,600,280); ctx.rotate(iNumber*Math.PI/180); for(var m=0;m<6;m++){ dragCicle(0,0,20+m*40,m); } ctx.restore(); animateCallBack(arguments.callee); })();
3.交互
oc.onmousemove=function(ev){ var x = ev.clientX - oc.offsetLeft; var y = ev.clientY - oc.offsetTop; if(x>600){ angleX=0.5; }else{ angleX=-0.5; } if(y>280){ angleY=0.5; }else{ angleY=-0.5; } };
到这里就完成了整个动画,你可以复制代码看效果
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>动画实现</title> <style> body{ background: #fff; } #canvas{ background: #fff; } </style> <script> window.onload=function(){ var oc = document.getElementById("canvas"), ctx = oc.getContext("2d"), number = 0,star = []; var animateCallBack = (window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame|| window.msRequestionFrame|| function(callback){return window.setTimeout(callback,100/60);}),iNumber=0,angleX=0,angleY=0; /**画星星**/ function dragStar(a,b,ctx,r1,r2){ ctx.beginPath(); ctx.fillStyle="#f8b203"; for(var i=0;i<5;i++){ ctx.lineTo(a+r2*Math.cos((18+i*72)*Math.PI/180),b-r2*Math.sin((18+i*72)*Math.PI/180)); ctx.lineTo(a+r1*Math.cos((54+i*72)*Math.PI/180),b-r1*Math.sin((54+i*72)*Math.PI/180)); } ctx.closePath(); ctx.fill(); }; /**画围绕圆的星星**/ function dragCicle(x,y,R,radio){ var max = 5+radio,angle = 360/max; for(var j=0;j<max;j++){ var X =x + R*Math.cos(j*angle*Math.PI/180); var Y =y - R*Math.sin(j*angle*Math.PI/180); dragStar(X,Y,ctx,10+2*radio,5+1*radio); } }; (function(){ iNumber++; ctx.clearRect(0,0,oc.width,oc.height); ctx.save(); ctx.transform(1,angleX,angleY,1,600,280); ctx.rotate(iNumber*Math.PI/180); for(var m=0;m<6;m++){ dragCicle(0,0,20+m*40,m); } ctx.restore(); animateCallBack(arguments.callee); })(); oc.onmousemove=function(ev){ var x = ev.clientX - oc.offsetLeft; var y = ev.clientY - oc.offsetTop; if(x>600){ angleX=0.5; }else{ angleX=-0.5; } if(y>280){ angleY=0.5; }else{ angleY=-0.5; } }; } </script> </head> <body> <div id="div1"> <canvas id="canvas" width="1360" height="800"></canvas> </div> </body> </html>
相关推荐
云端漂移 2020-07-17
冰蝶 2020-04-20
wangdaren 2020-01-14
山兔与孟婆 2019-12-15
山兔与孟婆 2019-12-14
Ladyseven 2020-10-22
mapaler 2020-07-17
淡风wisdon大大 2020-06-27
lanzhusiyu 2020-06-21
AlisaClass 2020-06-05
jiedinghui 2020-06-04
usepython 2020-05-31
flycony 2020-05-30
88284453 2020-05-09
hqulyc 2020-05-05
yaodilu 2020-04-30
vavid 2020-04-20
AlisaClass 2020-04-11