加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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();
  }
}

效果如图:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读