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 相关文章推荐
借用Google的Javascript API Loader来加速你的网站
Jan 28 Javascript
Javascript 继承机制的实现
Aug 12 Javascript
为超链接加上disabled后的故事
Dec 10 Javascript
JS复制到剪贴板示例代码
Oct 30 Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
Feb 07 Javascript
修改Jquery Dialog 位置的实现方法
Aug 26 Javascript
BootStrap Table 获取同行不同列元素的方法
Dec 19 Javascript
Vue2.0 UI框架ElementUI使用方法详解
Apr 14 Javascript
详解vue中引入stylus及报错解决方法
Sep 22 Javascript
Vue.js 中的 v-cloak 指令及使用详解
Nov 19 Javascript
JavaScript函数式编程(Functional Programming)纯函数用法分析
May 22 Javascript
vue中data改变后让视图同步更新的方法
Mar 29 Vue.js
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实现网站插件机制的方法
2009/11/10 PHP
php运行出现Call to undefined function curl_init()的解决方法
2010/11/02 PHP
destoon安装出现Internal Server Error的解决方法
2014/06/21 PHP
PHP判断是否为空的几个函数对比
2015/04/21 PHP
实现PHP框架系列文章(6)mysql数据库方法
2016/03/04 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
javascript 子窗体父窗体相互传值方法
2010/05/31 Javascript
复制网页内容,粘贴之后自动加上网址的实现方法(脚本之家特别整理)
2014/10/16 Javascript
什么是MEAN?JavaScript编程中的MEAN是什么意思?
2014/12/18 Javascript
javascript实现行拖动的方法
2015/05/27 Javascript
深入了解JavaScript中的Symbol的使用方法
2015/07/28 Javascript
javascript封装简单实现方法
2015/08/11 Javascript
AngularJS过滤器filter用法分析
2016/12/11 Javascript
简单实现nodejs上传功能
2017/01/14 NodeJs
bootstrap select插件封装成Vue2.0组件
2017/04/17 Javascript
基于对象合并功能的实现示例
2017/10/10 Javascript
JS实现关键词高亮显示正则匹配
2018/06/22 Javascript
JavaScript事件发布/订阅模式原理与用法分析
2018/08/21 Javascript
node版本管理工具n包使用教程详解
2018/11/09 Javascript
[02:49:21]2019完美盛典全程录像
2019/12/08 DOTA
Python中使用Beautiful Soup库的超详细教程
2015/04/30 Python
python实现自动更换ip的方法
2015/05/05 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
2020/03/25 Python
python用Configobj模块读取配置文件
2020/09/26 Python
美国棒球装备和用品商店:Baseball Savings
2018/06/09 全球购物
英国索普公园票务和酒店套餐:Thorpe Breaks
2019/09/14 全球购物
军训自我鉴定
2013/12/14 职场文书
促销活动策划方案
2014/01/12 职场文书
一年级语文教学反思
2014/02/13 职场文书
我心目中的好老师活动方案
2014/08/19 职场文书
关于读书的演讲稿600字
2014/08/27 职场文书
Django如何创作一个简单的最小程序
2021/05/12 Python
vue项目中的支付功能实现(微信支付和支付宝支付)
2022/02/18 Vue.js
试用1103暨1103、1101同门大比武 [ DAIWEI ]
2022/04/05 无线电
SpringBoot详解整合Redis缓存方法
2022/07/15 Java/Android
Spring Boot优化后启动速度快到飞起技巧示例
2022/07/23 Java/Android