<!DOCTYPE html> <html lang="en">   <head>     <meta charset="UTF-8" />     <meta name="viewport" content="width=device-width, initial-scale=1.0" />     <title>Document</title>   </head>   <style>     body {       margin: 0;       overflow: hidden;       background-color: rgba(0, 0, 0, 0.8);     }   </style>   <body>     <canvas id="canvas"></canvas>   </body> </html>
  <script>   window.addEventListener("resize", resizeCanvas, false);      window.requestAnimationFrame =     window.requestAnimationFrame ||     window.webkitRequestAnimationFrame ||     window.mozRequestAnimationFrame ||     window.oRequestAnimationFrame ||     window.msRequestAnimationFrame ||     function (callback) {       window.setTimeout(callback, 1000 / 60);     };
    var canvas,     ctx,     w,     h,     particles = [],     probability = 0.99,     xPoint,     yPoint;   function openFlower() {     canvas = document.getElementById("canvas");     if (!canvas) return;     ctx = canvas.getContext("2d");     resizeCanvas();     window.requestAnimationFrame(updateWorld);
                             }
    function resizeCanvas() {     if (!!canvas) {       w = canvas.width = 1920;       h = canvas.height = 1080;     }   }
    function updateWorld() {     update();     paint();     window.requestAnimationFrame(updateWorld);   }
    function update() {     if (particles.length < 500 && Math.random() < probability) {       createFirework();     }     var alive = [];     for (var i = 0; i < particles.length; i++) {       if (particles[i].move()) {         alive.push(particles[i]);       }     }     particles = alive;   }
    function paint() {          ctx.clearRect(0, 0, w, h);          ctx.fillStyle = "rgba(0, 0, 0, 0)";     ctx.fillRect(0, 0, w, h);          ctx.globalCompositeOperation = "lighter";          for (var i = 0; i < particles.length; i++) {       particles[i].draw(ctx);     }   }
    function createFirework() {     xPoint = Math.random() * (w - 200) + 100;     yPoint = Math.random() * (h - 200) + 100;               var nFire = Math.random() * 50 + 100;     var c =       "rgb(" +       ~~(Math.random() * 200 + 55) +       "," +       ~~(Math.random() * 200 + 55) +       "," +       ~~(Math.random() * 200 + 55) +       ")";     for (var i = 0; i < nFire; i++) {       var particle = new Particle();       particle.color = c;       var vy = Math.sqrt(25 - particle.vx * particle.vx);       if (Math.abs(particle.vy) > vy) {         particle.vy = particle.vy > 0 ? vy : -vy;       }       particles.push(particle);     }   }
    function Particle() {     this.w = this.h = Math.random() * 4 + 1.1;     this.x = xPoint - this.w / 2;     this.y = yPoint - this.h / 2;     this.vx = (Math.random() - 0.5) * 10;     this.vy = (Math.random() - 0.5) * 10;     this.alpha = Math.random() * 0.5 + 0.5;     this.color;   }
    Particle.prototype = {     gravity: 0.05,     move: function () {       this.x += this.vx;       this.vy += this.gravity;       this.y += this.vy;       this.alpha -= 0.01;       if (         this.x <= -this.w ||         this.x >= screen.width ||         this.y >= screen.height ||         this.alpha <= 0       ) {         return false;       }       return true;     },     draw: function (c) {       c.save();       c.beginPath();       c.translate(this.x + this.w / 2, this.y + this.h / 2);       c.arc(0, 0, this.w, 0, Math.PI * 2);       c.fillStyle = this.color;       c.globalAlpha = this.alpha;       c.closePath();       c.fill();       c.restore();     },   };   openFlower(); </script>
 
   |