zoukankan      html  css  js  c++  java
  • 随鼠标动的炫彩小球

    <!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>
  • 相关阅读:
    新新人加入博客园
    C#通过第三方组件生成二维码(QR Code)和条形码(Bar Code)
    关于delphi 类的属性定义property方法
    从XML文件乱码问题,探寻其背后的原理
    Clang RecursiveASTVisitor & ASTFrontendActions based on it
    Clang FrontendActions
    C++ 学习笔记
    Clang Preprocessor 类的创建
    世上最伟大的十个公式
    RestEasy+用户指南第5章.@PathParam
  • 原文地址:https://www.cnblogs.com/shuaishuaidejun/p/6580416.html
Copyright © 2011-2022 走看看