发布作者: 笒鬼鬼 
   百度收录: 正在检测是否收录... 
    作品采用:  《 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 》许可协议授权  

JS代码:
(function (window, document) {
            var Vector2 = (function () {
              function Vector2(x, y) {
                this.x = x || 0;
                this.y = y || 0;
              }
              return Vector2;
            })();
          
            Vector2.prototype.add = function (addend) {
              this.x += addend.x;
              this.y += addend.y;
            };
          
            var RainDrop = (function () {
              function RainDrop(parent) {
                this.size = 2;
                this.parent = parent;
                this.init();
              }
              return RainDrop;
            })();
          
            RainDrop.prototype.init = function () {
              this.life = 0;
              this.ttl = Math.random() * 500 + 300;
              this.position = new Vector2(Math.random() * window.innerWidth, 0);
              this.velocity = new Vector2(
                0.5 - Math.random() * 1,
                Math.random() * 1 + 0.2
              );
              this.terminalVelocity = 8;
            };
          
            RainDrop.prototype.update = function () {
              if (
                this.position.x > window.innerWidth ||
                this.position.x < -this.size ||
                this.life > this.ttl
              )
                this.init();
              if (this.position.y > this.parent.floor) {
                this.position.y = this.parent.floor - this.size;
                this.velocity.y *= -0.2 - Math.random() * 0.2;
              }
              this.life++;
              this.position.add(this.velocity);
              this.velocity.y += 0.1;
            };
          
            var Rain = (function () {
              function Rain(args) {
                this.props = args;
                this.rainDrops = [];
                this.init();
              }
              return Rain;
            })();
          
            Rain.prototype.init = function () {
              this.createCanvas();
              this.resize();
              this.loop();
            };
          
            Rain.prototype.resize = function () {
              var attr =
                "position: absolute; z-index: -99; top: 0; left: 0; height: 100vh; width: 100vw;";
          
              this.canvas.setAttribute("style", attr);
          
              this.dimensions = {
                width: window.innerWidth,
                height: window.innerHeight
              };
          
              this.canvas.width = this.dimensions.width;
              this.canvas.height = this.dimensions.height;
              this.floor = this.dimensions.height * 0.7;
            };
          
            Rain.prototype.createCanvas = function () {
              this.canvas = document.createElement("canvas");
          
              this.ctx = this.canvas.getContext("2d");
          
              document.body.appendChild(this.canvas);
            };
          
            Rain.prototype.draw = function () {
              this.ctx.fillStyle = this.props.backgroundColor;
              this.ctx.fillRect(0, 0, this.dimensions.width, this.floor);
              for (var i = 0, len = this.rainDrops.length; i < len; i++) {
                var rainDrop = this.rainDrops[i];
                rainDrop.update();
                this.ctx.fillStyle = this.props.rainColor;
                this.ctx.fillRect(
                  rainDrop.position.x,
                  rainDrop.position.y,
                  rainDrop.size,
                  rainDrop.size
                );
              }
              this.reflect();
            };
          
            Rain.prototype.reflect = function () {
              var grad = this.ctx.createLinearGradient(
                this.dimensions.width / 2,
                this.floor * 0.6,
                this.dimensions.width / 2,
                this.floor
              );
              grad.addColorStop(0, "rgba(20,30,40,1)");
              grad.addColorStop(1, "rgba(20,30,40,0)");
              this.ctx.save();
              this.ctx.scale(1, -1);
              this.ctx.translate(0, this.floor * -2);
              this.ctx.filter = "blur(2px) saturate(150%)";
              this.ctx.drawImage(
                this.canvas,
                0,
                0,
                this.dimensions.width,
                this.floor,
                0,
                0,
                this.dimensions.width,
                this.floor
              );
              this.ctx.fillStyle = grad;
              this.ctx.fillRect(0, 0, this.dimensions.width, this.floor);
              this.ctx.restore();
            };
          
            Rain.prototype.loop = function () {
              var timeout,
                self = this;
              if (self.rainDrops.length < self.props.rainDropCount) {
                timeout = window.setTimeout(function () {
                  self.rainDrops.push(new RainDrop(self));
                }, Math.random() * 200);
              } else if (timeout) {
                timeout = null;
                window.clearTimeout(timeout);
              }
              self.draw();
              window.requestAnimationFrame(self.loop.bind(self));
            };
          
            window.onload = function () {
              var args = {
                rainDropCount: 500,
                rainColor: "rgba(150,180,255,0.8)",
                backgroundColor: "rgba(10,10,10,0.5)"
              };
          
              var rain = new Rain(args);
          
              window.onresize = function () {
                rain.resize();
              };
            };
          
            window.requestAnimationFrame = (function () {
              return (
                window.requestAnimationFrame ||
                window.webkitRequestAnimationFrame ||
                window.mozRequestAnimationFrame ||
                window.oRequestAnimationFrame ||
                window.msRequestAnimationFrame ||
                function (callback) {
                  window.setTimeout(callback, 1000 / 60);
                }
              );
            })();
          })(this, document);
—— 评论区 ——