今天发现一个又好看又好用的流星雨特效


一起来看流星雨

代码如下:

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

var star = new Star();

star.init();

star.draw();

arr.push(star);

}

//画流星

for (var i=0;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);

}

/*流星雨结束*/

body{

background-color: black;

}

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

这是转的一个小哥哥的,原文网址:https://www.cnblogs.com/springcloud/p/8432806.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容