随鼠标动的炫彩小球

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<style type="text/css">
*{
margin: 0;
padding: 0;
}
canvas{
display: block;
background: pink;
}
</style>
<body>
<canvas id="view" ></canvas>
</body>
<script type="text/javascript">

//0.获取元素

var view = document.getElementById('view');

var ps = view.getContext('2d');

var width = document.documentElement.clientWidth;

var height = document.documentElement.clientHeight;

view.width = width;

view.height = height;



//1.定义一个类(构造函数)

function ball(x,y){

//初始半径
this.r = 20;

//初始速度

this.speedX = this.random(8);

this.speedY = this.random(8);

this.speedR = Math.abs(this.random(2));

//初始化颜色及透明度

this.red = Math.abs(this.random(256));

this.green = Math.abs(this.random(256));

this.blue = Math.abs(this.random(256));

this.opacity = 1;

//初始化透明度速度

this.opacitySpeed = Math.random()*0.5/2;

//初始化xy值

this.x = x === undefined ? width/2 : x;

this.y = y ===undefined ? height/2 : y;



}

//2.添加原型方法

ball.prototype = {

random:function(num){
//获取随机正数
num = parseInt(Math.random()*num)+1

//随机获取是否使用负数

return parseInt(Math.random()*2) ? num : -num

},

render:function(){

//开启路径

ps.beginPath();

ps.fillStyle = 'rgba('+this.red+','+this.green+','+this.blue+','+this.opacity+')';

ps.arc(this.x,this.y,this.r,0,2*Math.PI);

ps.fill();

},

update:function(){

//如果半径 小于等于0 终止

if(this.r<=0) return;

this.x += this.speedX;

this.y += this.speedY;

this.r -= this.speedR;

this.opacity -= this.opacitySpeed;

this.render();

}


}

//3.声明一个舞台对象 保存演员及安排演出

var stage = {

speed:40,

sid:0,//保存定时器ID

//存球(演员)
children:[],

//添加演员方法(统一 使用该方法添加演员)

addChild:function(child){

// 记录一下你刚才添加了谁

this.children.push(child);

return this

},


//初始化添加方法 决定生成的数量 及XY坐标

init:function(num,x,y){

//循环生成

for(var i = 0; i<num ; i++){

//向子元素添加球

this.addChild( new ball(x,y) )


}

return this

},


play:function(){

// 如果sid为真直接return

if(this.sid) return this

var children = this.children;

this.sid = setInterval(function(){

//清场

ps.clearRect(0,0,width,height);

// 每个演员表演

for(var i = 0; i< children.length; i++){

//更新

children[i].update();

//判断当前元素半径是否小于等于0 如果是删除这个子元素

if(children[i].r<=0){

//删除当前元素

children.splice(i,1);

}

}



},this.speed)

}




}


//4.添加鼠标移动事件

view.onmousemove = function(e){

//兼容获取event

e = e || window.event;

var x = e.clientX - view.offsetLeft;

var y= e.clientY - view.offsetTop;

// 添加演员

stage.init(4,x,y).play();

console.log(stage.children.length)

}







</script>
</html>
原文地址:https://www.cnblogs.com/shuaishuaidejun/p/6580416.html