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的跟踪代码 动态加载js代码方法应用
Nov 12 Javascript
javascript 保存文件到本地实现方法
Nov 29 Javascript
firefox下jquery iframe刷新页面提示会导致重复之前动作
Dec 17 Javascript
javascript中节点的最近的相关节点访问方法
Mar 20 Javascript
浅析jQuery EasyUI中的tree使用指南
Dec 18 Javascript
AngularJS中的按需加载ocLazyLoad示例
Jan 11 Javascript
JS拉起或下载app的实现代码
Feb 22 Javascript
Bootstrap缩略图的创建方法
Mar 22 Javascript
js中的事件委托或是事件代理使用详解
Jun 23 Javascript
jQuery Datatable 多个查询条件自定义提交事件(推荐)
Aug 24 jQuery
微信小程序中post方法与get方法的封装
Sep 26 Javascript
JavaScript 对引擎、运行时、调用堆栈的概述理解
Oct 22 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
Ajax+PHP 边学边练 之二 实例
2009/11/24 PHP
解析php中array_merge与array+array的区别
2013/06/21 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
2014/11/19 PHP
用javascript来实现动画导航效果的代码
2007/12/16 Javascript
用最通俗易懂的代码帮助新手理解javascript闭包 推荐
2012/03/01 Javascript
javascript 树形导航菜单实例代码
2013/08/13 Javascript
理解JavaScript的变量的入门教程
2015/07/07 Javascript
IE6兼容透明背景图片及解决方案
2015/08/19 Javascript
微信jssdk用法汇总
2016/07/16 Javascript
jQuery实现侧浮窗与中浮窗切换效果的方法
2016/09/05 Javascript
JS实现鼠标移上去显示图片或微信二维码
2016/12/14 Javascript
浅谈mvvm-simple双向绑定简单实现
2018/04/18 Javascript
Vuex mutitons和actions初使用详解
2019/03/04 Javascript
JavaScript setTimeout()基本用法有哪些
2020/11/04 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 大神专访第二弹!
2014/05/20 DOTA
Python利用字典将两个通讯录文本合并为一个文本实例
2018/01/16 Python
彻底理解Python中的yield关键字
2019/04/01 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
2019/06/12 Python
深入浅析Python科学计算库Scipy及安装步骤
2019/10/12 Python
Python面向对象实现方法总结
2020/08/12 Python
Python爬虫如何破解JS加密的Cookie
2020/11/19 Python
python中altair可视化库实例用法
2021/01/26 Python
DNA测试:Orig3n
2019/03/01 全球购物
Holland & Barrett爱尔兰:英国领先的健康零售商
2019/03/31 全球购物
求职推荐信范文
2013/12/01 职场文书
会计电算化专业自荐信
2014/03/15 职场文书
市场策划求职信
2014/08/07 职场文书
国企干部对照检查材料
2014/08/22 职场文书
运动会广播稿200字(10篇)
2014/10/12 职场文书
2015年新农合工作总结
2015/03/30 职场文书
运动员入场前导词
2015/07/20 职场文书
Python基础之赋值,浅拷贝,深拷贝的区别
2021/04/30 Python
Python中的套接字编程是什么?
2021/06/21 Python
css中z-index: 0和z-index: auto的区别
2021/08/23 HTML / CSS
详解Vue router路由
2021/11/20 Vue.js
宝塔更新Python及Flask项目的部署
2022/04/11 Python