指引网

当前位置: 主页 > 网页制作 > WEB开发 >

canvas实现流星雨的背景效果

来源:网络 作者:佚名 点击: 时间:2017-07-19 00:18
[摘要] 看到一个很棒的流星雨效果。修改一下样式就可以作为网页背景了。。! 代码如下 复制代码 !DOCTYPE html html head metacharset=utf-8 title一起来看流星雨/title script var context; var arr = new Array(); var starC

看到一个很棒的流星雨效果。修改一下样式就可以作为网页背景了。。!

 

 代码如下 复制代码

<!DOCTYPE html>

<html>

  <head>

    <metacharset="utf-8">

    <title>一起来看流星雨</title>

    <script>

      var context;

      var arr = new Array();

      var starCount = 800;

      var rains = new Array();

  var rainCount =20;

      //初始化画布及context

      function init(){

        //获取canvas

        var stars = document.getElementById("stars");

        windowWidth = window.innerWidth; //当前的窗口的高度

        stars.width=windowWidth;

  stars.height=window.innerHeight;

        //获取context

        context = stars.getContext("2d");

      }

      //创建一个星星对象

      var Star = function (){

        this.x = windowWidth * Math.random();//横坐标

        this.y = 5000 * Math.random();//纵坐标

        this.text=".";//文本

        this.color = "white";//颜色

        //产生随机颜色

        this.getColor=function(){

          var _r = Math.random();

          if(_r<0.5){

            this.color="#333";

          }else{

            this.color="white";

          }

        }

        //初始化

        this.init=function(){

          this.getColor();

        }

        //绘制

        this.draw=function(){

          context.fillStyle=this.color;

          context.fillText(this.text,this.x,this.y);

        }

      }

       //画月亮

      function drawMoon(){

         varmoon=newImage();

           moon.src="./images/moon.jpg"

           context.drawImage(moon,-5,-10);

      }

      //页面加载的时候

      window.onload=function() {

        init();

        //画星星

        for (vari=0;i<starCount;i++) {

          varstar=newStar();

          star.init();

          star.draw();

          arr.push(star);

        }

        //画流星

        for (vari=0;i<rainCount;i++) {

    varrain=newMeteorRain();

    rain.init();

    rain.draw();

    rains.push(rain);

  }

        drawMoon();//绘制月亮

        playStars();//绘制闪动的星星

  playRains();//绘制流星

 

      }

       //星星闪起来

      function playStars(){

        for (varn=0; n < starCount; n++){

          arr[n].getColor();

          arr[n].draw();

        }

 

        setTimeout("playStars()",100);

      }

 

  /*流星雨开始*/

 varMeteorRain=function(){

   this.x = -1;

   this.y = -1;

   this.length = -1;//长度

   this.angle=30; //倾斜角度

   this.width = -1;//宽度

   this.height = -1;//高度

   this.speed=1;//速度

   this.offset_x = -1;//横轴移动偏移量

   this.offset_y = -1;//纵轴移动偏移量

   this.alpha=1; //透明度

   this.color1="";//流星的色彩

   this.color2=""; //流星的色彩

  /****************初始化函数********************/

  this.init=function() //初始化

  {

    this.getPos();

    this.alpha=1;//透明度

    this.getRandomColor();

    //最小长度,最大长度

    varx=Math.random() * 80 + 150;

    this.length=Math.ceil(x);

//        x=Math.random()*10+30;

    this.angle=30; //流星倾斜角

    x=Math.random()+0.5;

    this.speed=Math.ceil(x); //流星的速度

    varcos=Math.cos(this.angle*3.14/180);

    varsin=Math.sin(this.angle*3.14/180) ;

    this.width= this.length*cos ; //流星所占宽度

    this.height= this.length*sin ;//流星所占高度

    this.offset_x= this.speed*cos ;

    this.offset_y= this.speed*sin;

  }

  /**************获取随机颜色函数*****************/

  this.getRandomColor=function(){

    vara=Math.ceil(255-240* Math.random());

    //中段颜色

    this.color1="rgba("+a+","+a+","+a+",1)";

    //结束颜色

    this.color2="black";

  }

   /***************重新计算流星坐标的函数******************/

  this.countPos=function()//

  {

    //往左下移动,x减少,y增加

    this.x= this.x - this.offset_x;

    this.y= this.y + this.offset_y;

  }

  /*****************获取随机坐标的函数*****************/

  this.getPos=function() //

  {

    //横坐标200--1200

    this.x=Math.random() * window.innerWidth; //窗口高度

    //纵坐标小于600

    this.y=Math.random() * window.innerHeight; //窗口宽度

  }

   /****绘制流星***************************/

  this.draw=function() //绘制一个流星的函数

  {

    context.save();

    context.beginPath();

    context.lineWidth=1; //宽度

    context.globalAlpha=this.alpha; //设置透明度

    //创建横向渐变颜色,起点坐标至终点坐标

    varline=context.createLinearGradient(this.x, this.y,

      this.x + this.width,

      this.y - this.height);

    //分段设置颜色

    line.addColorStop(0, "white");

    line.addColorStop(0.3, this.color1);

    line.addColorStop(0.6, this.color2);

    context.strokeStyle=line;

    //起点

    context.moveTo(this.x, this.y);

    //终点

    context.lineTo(this.x + this.width, this.y - this.height);

    context.closePath();

    context.stroke();

    context.restore();

  }

  this.move=function(){

    //清空流星像素

    varx=this.x+this.width-this.offset_x;

    vary=this.y-this.height;

    context.clearRect(x-3,y-3,this.offset_x+5,this.offset_y+5);

//        context.strokeStyle="red";

//         context.strokeRect(x,y-1,this.offset_x+1,this.offset_y+1);

    //重新计算位置,往左下移动

    this.countPos();

    //透明度增加

    this.alpha-=0.002;

    //重绘

    this.draw();

  }

}

//绘制流星

function playRains(){

 

  for (varn=0; n < rainCount; n++){

    varrain=rains[n];

    rain.move();//移动

    if(rain.y>window.innerHeight){//超出界限后重来

      context.clearRect(rain.x,rain.y-rain.height,rain.width,rain.height);

      rains[n] = new MeteorRain();

      rains[n].init();

    }

  }

  setTimeout("playRains()",2);

}

 /*流星雨结束*/

    </script>

    <styletype="text/css">

      body{

        background-color: black;

      }

  body,html{width:100%;height:100%;overflow:hidden;}

    </style>

  </head>

  <body>

    <canvasid="stars"></canvas>

  </body>

</html>

 

------分隔线----------------------------