| <html> |
| <body> |
| <style> |
| canvas { |
| position: fixed; |
| top: 0; |
| right: 0; |
| bottom: 0; |
| left: 0; |
| width: 100%; |
| height: 100%; |
| } |
| </style> |
| <script> |
| "use strict"; |
| |
| let context = document.body.appendChild(document.createElement("canvas")).getContext("2d"); |
| let canvasWidth = 0; |
| let canvasHeight = 0; |
| |
| function handleResize() { |
| canvasWidth = context.canvas.width = context.canvas.offsetWidth; |
| canvasHeight = context.canvas.height = context.canvas.offsetHeight; |
| } |
| handleResize(); |
| window.addEventListener("resize", handleResize); |
| |
| class Star { |
| constructor() |
| { |
| this._initialize(); |
| } |
| |
| draw() |
| { |
| // if (this._x > -this._s && this._x < canvasWidth + this._s && this._y > -this._s && this._y < canvasHeight + this._s) { |
| context.moveTo(this._x, this._y); |
| context.arc(this._x, this._y, this._s, 0, 2 * Math.PI); |
| // } |
| |
| this._x += this._vx; |
| this._y += this._vy; |
| if (this._x > canvasWidth + this._s || this._y < -this._s) |
| this._initialize(); |
| } |
| |
| _initialize() |
| { |
| this._s = this._randomFromInterval(0.5, 3); |
| |
| this._x = this._randomFromInterval(-canvasWidth, 0); |
| this._y = this._randomFromInterval(canvasHeight, canvasHeight * 2); |
| |
| this._vx = this._randomFromInterval(0.5, 3); |
| this._vy = this._randomFromInterval(-0.5, -3); |
| } |
| |
| _randomFromInterval(min, max) |
| { |
| return Math.random() * (max - min + 1) + min; |
| } |
| } |
| |
| let stars = []; |
| for (let i = 0; i < 10000; ++i) |
| stars.push(new Star); |
| |
| window.requestAnimationFrame(function frame(timestamp) { |
| context.fillStyle = "hsla(0, 0%, 10%, 0.5)"; |
| context.fillRect(0, 0, canvasWidth, canvasHeight); |
| |
| for (let i = 0; i < 10; ++i) { |
| context.beginPath(); |
| |
| for (let j = 0; j < stars.length / 10; ++j) |
| stars[(i * stars.length / 10) + j].draw(); |
| |
| context.fillStyle = "white"; |
| context.fill(); |
| } |
| |
| window.requestAnimationFrame(frame); |
| }); |
| |
| </script> |