You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.4 KiB
88 lines
2.4 KiB
10 months ago
|
var canvas = document.getElementById("canvas"),
|
||
|
context = canvas.getContext("2d"),
|
||
|
w = canvas.width = window.innerWidth,
|
||
|
h = canvas.height = window.innerHeight,
|
||
|
|
||
|
hue = 217,
|
||
|
stars = [],
|
||
|
count = 0,
|
||
|
maxStars = 1600;//星星数量
|
||
|
|
||
|
var canvas2 = document.createElement("canvas"),
|
||
|
context2 = canvas2.getContext("2d");
|
||
|
canvas2.width = 100;
|
||
|
canvas2.height = 100;
|
||
|
var half = canvas2.width / 2,
|
||
|
gradient2 = context2.createRadialGradient(half,half,0,half,half,half);
|
||
|
gradient2.addColorStop(0.025,"#CCC");
|
||
|
gradient2.addColorStop(0.1,"hsl("+hue+",61%,33%)");
|
||
|
gradient2.addColorStop(0.25,"hsl("+hue+",64%,6%)");
|
||
|
gradient2.addColorStop(1,"transparent");
|
||
|
|
||
|
context2.fillStyle = gradient2;
|
||
|
context2.beginPath();
|
||
|
context2.arc(half,half,half,0,Math.PI*2);
|
||
|
context2.fill();
|
||
|
|
||
|
function random(min,max){
|
||
|
if(arguments.length < 2) {
|
||
|
max = min;
|
||
|
min = 0;
|
||
|
}
|
||
|
if (min > max) {
|
||
|
var hold = max;
|
||
|
max = min;
|
||
|
min = hold;
|
||
|
}
|
||
|
return Math.floor(Math.random()*(max-min+1))+min;
|
||
|
}
|
||
|
|
||
|
function maxOrbit(x, y){
|
||
|
var max = Math.max(x,y),diameter = Math.round(Math.sqrt(max*max+max*max));
|
||
|
return diameter/2;//星星移动范围,值越大范围越小,
|
||
|
}
|
||
|
|
||
|
var Star = function(){
|
||
|
this.orbitRadius = random(maxOrbit(w,h));
|
||
|
this.radius = random(60,this.orbitRadius)/8;//星星大小
|
||
|
this.orbitX = w/2;
|
||
|
this.orbitY = h/2;
|
||
|
this.timePassed = random(0,maxStars);
|
||
|
this.speed = random(this.orbitRadius)/50000;//星星移动速度
|
||
|
this.alpha = random(2, 10)/10;
|
||
|
count++;
|
||
|
stars[count] = this;
|
||
|
}
|
||
|
|
||
|
Star.prototype.draw = function(){
|
||
|
var x = Math.sin(this.timePassed)*this.orbitRadius+this.orbitX,
|
||
|
y = Math.cos(this.timePassed)*this.orbitRadius+this.orbitY,
|
||
|
twinkle = random(10);
|
||
|
if(twinkle === 1 && this.alpha > 0){
|
||
|
this.alpha -= 0.05;
|
||
|
}else if(twinkle === 2 && this.alpha < 1){
|
||
|
this.alpha += 0.05;
|
||
|
}
|
||
|
|
||
|
context.globalAlpha = this.alpha;
|
||
|
context.drawImage(canvas2,x-this.radius/2,y-this.radius/2,this.radius,this.radius);
|
||
|
this.timePassed += this.speed;
|
||
|
}
|
||
|
|
||
|
for (var i = 0; i < maxStars; i++) {
|
||
|
new Star();
|
||
|
}
|
||
|
|
||
|
function animation() {
|
||
|
context.globalCompositeOperation = "source-over";
|
||
|
context.globalAlpha = 0.5; //尾巴
|
||
|
context.fillStyle = "hsla("+hue+",64%,6%,2)";
|
||
|
context.fillRect(0,0,w,h)
|
||
|
|
||
|
context.globalCompositeOperation = "lighter";
|
||
|
for(var i = 1, l = stars.length;i < l;i++) {
|
||
|
stars[i].draw();
|
||
|
};
|
||
|
window.requestAnimationFrame(animation);
|
||
|
}
|
||
|
window.setTimeout(animation,400);
|