angular2 绘制星空背景图
发布时间:2020-12-17 08:45:17 所属栏目:安全 来源:网络整理
导读:制作一个星空背景动图 参考代码:http://www.htmleaf.com/Demo/201707294657.html import {Component,OnInit,HostListener} from "@angular/core";@Component({ selector: 'star-background',template: ` canvas id="canvas" style="position: absolute"/can
|
制作一个星空背景动图 参考代码:http://www.htmleaf.com/Demo/201707294657.html import {Component,OnInit,HostListener} from "@angular/core";
@Component({
selector: 'star-background',template: `
<canvas id="canvas" style="position: absolute"></canvas>
`
})
export class StarBackgroundComponent implements OnInit {
ngOnInit(): void {
this.draw();
}
draw() {
var canvas: any = document.getElementById('canvas'),ctx = canvas.getContext('2d'),w = canvas.width = window.innerWidth,h = canvas.height = window.innerHeight,hue = 217,stars = [],count = 0,maxStars = 1400;
// Thanks @jackrugile for the performance tip! http://codepen.io/jackrugile/pen/BjBGoM
// Cache gradient
var canvas2 = document.createElement('canvas'),ctx2 = canvas2.getContext('2d');
canvas2.width = 100;
canvas2.height = 100;
var half = canvas2.width / 2,gradient2 = ctx2.createRadialGradient(half,half,half);
gradient2.addColorStop(0.025,'#fff');
gradient2.addColorStop(0.1,'hsl(' + hue + ',61%,33%)');
gradient2.addColorStop(0.25,64%,6%)');
gradient2.addColorStop(1,'transparent');
ctx2.fillStyle = gradient2;
ctx2.beginPath();
ctx2.arc(half,Math.PI * 2);
ctx2.fill();
// End cache
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 Star() {
this.orbitRadius = random(w / 2 - 50);
this.radius = random(100,this.orbitRadius) / 10;
this.orbitX = w / 2;
this.orbitY = h / 2;
this.timePassed = random(0,maxStars);
this.speed = random(this.orbitRadius) / 1000000;
this.alpha = random(2,10) / 10;
count++;
stars[count] = this;
}
Star.prototype.draw = function () {
var x = Math.sin(this.timePassed + 1) * this.orbitRadius + this.orbitX,y = Math.cos(this.timePassed) * this.orbitRadius / 2 + 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;
}
ctx.globalAlpha = this.alpha;
ctx.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() {
ctx.globalCompositeOperation = 'source-over';
ctx.globalAlpha = 0.8;
ctx.fillStyle = 'hsla(' + hue + ',6%,1)';
ctx.fillRect(0,w,h);
ctx.globalCompositeOperation = 'lighter';
for (var i = 1,l = stars.length; i < l; i++) {
stars[i].draw();
}
window.requestAnimationFrame(animation);
}
animation();
}
@HostListener("window:resize") //监听窗口事件,用于自适应窗口大小
canvasResize() {
this.draw();
}
}
效果如图: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
