canvas实现流星雨的背景效果


Posted in Javascript onJanuary 13, 2017

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

<!DOCTYPE html>
<html>
  <head>
    <meta charset="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(){
         var moon = new Image();
           moon.src = "./images/moon.jpg"
           context.drawImage(moon,-5,-10);
      }
      //页面加载的时候
      window.onload = function() {
        init();
        //画星星
        for (var i=0;i<starCount;i++) {
          var star = new Star();
          star.init();
          star.draw();
          arr.push(star);
        }
        //画流星
        for (var i=0;i<rainCount;i++) {
    var rain = new MeteorRain();
    rain.init();
    rain.draw();
    rains.push(rain);
  }
        drawMoon();//绘制月亮
        playStars();//绘制闪动的星星
  playRains();//绘制流星

      }
       //星星闪起来
      function playStars(){
        for (var n = 0; n < starCount; n++){ 
          arr[n].getColor(); 
          arr[n].draw(); 
        } 

        setTimeout("playStars()",100);
      }

  /*流星雨开始*/
 var MeteorRain = 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();
    //最小长度,最大长度
    var x = 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); //流星的速度
    var cos = Math.cos(this.angle*3.14/180);
    var sin = 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 (){
    var a = 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; //设置透明度
    //创建横向渐变颜色,起点坐标至终点坐标
    var line = 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(){
    //清空流星像素
    var x = this.x+this.width-this.offset_x;
    var y = 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 (var n = 0; n < rainCount; n++){ 
    var rain = 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>
    <style type="text/css">
      body{
        background-color: black;
      }
  body,html{width:100%;height:100%;overflow:hidden;}
    </style>
  </head>
  <body>
    <canvas id="stars"></canvas>
  </body>
</html>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
优化JavaScript脚本的性能的几个注意事项
Dec 22 Javascript
ASP.NET jQuery 实例12 通过使用jQuery validation插件简单实现用户注册页面验证功能
Feb 03 Javascript
JavaScript 和 Java 的区别浅析
Jul 31 Javascript
js+css实现回到顶部按钮(back to top)
Mar 02 Javascript
AngularJS Bootstrap详细介绍及实例代码
Jul 28 Javascript
AngularJs表单验证实例代码解析
Nov 29 Javascript
javascript操作cookie
Jan 17 Javascript
原生js实现中奖信息无间隙滚动效果
Jan 18 Javascript
js实现下拉菜单效果
Mar 01 Javascript
详解webpack引入第三方库的方式以及注意事项
Jan 15 Javascript
使用JS监听键盘按下事件(keydown event)
Nov 07 Javascript
使用TS来编写express服务器的方法步骤
Oct 29 Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
Jan 13 #Javascript
原生js实现手风琴功能(支持横纵向调用)
Jan 13 #Javascript
JavaScript使用简单正则表达式的数据验证功能示例
Jan 13 #Javascript
bootstrap网格系统使用方法解析
Jan 13 #Javascript
js 判断数据类型的几种方法
Jan 13 #Javascript
AngularJS 文件上传控件 ng-file-upload详解
Jan 13 #Javascript
BootStrap表单验证实例代码
Jan 13 #Javascript
You might like
php 修改上传文件大小限制实例详解
2016/10/23 PHP
php定期拉取数据对比方法实例
2019/09/22 PHP
我也种棵OO树JXTree[js+css+xml]
2007/04/02 Javascript
理解Javascript_11_constructor实现原理
2010/10/18 Javascript
JavaScript中的类继承
2010/11/25 Javascript
js验证整数加保留小数点的简单实例
2013/12/02 Javascript
js判断undefined类型,undefined,null, 的区别详细解析
2013/12/16 Javascript
jquery下div 的resize事件示例代码
2014/03/09 Javascript
JavaScript中的数据类型转换方法小结
2015/10/26 Javascript
Javascript 引擎工作机制详解
2016/11/30 Javascript
Vue axios 中提交表单数据(含上传文件)
2017/07/06 Javascript
JS实现定时任务每隔N秒请求后台setInterval定时和ajax请求问题
2017/10/15 Javascript
Angular 4中如何显示内容的CSS样式示例代码
2017/11/06 Javascript
浅谈Vue路由快照实现思路及其问题
2018/06/07 Javascript
微信小程序实时聊天WebSocket
2018/07/05 Javascript
vue实现同一个页面可以有多个router-view的方法
2018/09/20 Javascript
JAVA面试题 static关键字详解
2019/07/16 Javascript
Layui Form 自定义验证的实例代码
2019/09/14 Javascript
js生成1到100的随机数最简单的实现方法
2020/02/07 Javascript
Vue中关闭弹窗组件时销毁并隐藏操作
2020/09/01 Javascript
[10:49]2014国际邀请赛 叨叨刀塔第二期为真正的电竞喝彩
2014/07/21 DOTA
Python爬取读者并制作成PDF
2015/03/10 Python
python利用urllib和urllib2访问http的GET/POST详解
2017/09/27 Python
Python引用传值概念与用法实例小结
2017/10/07 Python
pyqt5 使用cv2 显示图片,摄像头的实例
2019/06/27 Python
pytorch中的inference使用实例
2020/02/20 Python
Python日志logging模块功能与用法详解
2020/04/09 Python
如何写python的配置文件
2020/06/07 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
2020/06/30 Python
CSS3截取字符串实例代码【推荐】
2018/06/07 HTML / CSS
马来西亚网上购物平台:ezbuy
2018/02/13 全球购物
英国婴儿和儿童服装网站:Vertbaudet
2018/04/02 全球购物
教师政风行风评议心得体会
2014/10/21 职场文书
教师“一帮一”结对子活动总结
2015/05/07 职场文书
珍惜时间的诗歌赏析
2019/08/23 职场文书
Redis基于Bitmap实现用户签到功能
2021/06/20 Redis