欢迎光临散文网 会员登陆 & 注册

每一个程序员都应该有的这颗爱心,它在这里!

2023-07-15 11:30 作者:极客小俊GeekerJun  | 我要投稿

📖 作者:极客小俊
💡 把逻辑思维转变为代码的技术博主




效果

我们不要废话了, 看效果!

如图

在这里插入图片描述


HTML部分

<canvas id="love"></canvas>



CSS部分

#love {
           position: absolute;
           width: 100%;
           height: 100%;
       }


JavaScript部分

 // 配置
   var settings = {
       particles: {
           length: 300, //设置最桃心粒量
           duration: 2, //设置桃心持续时间 单位秒
           velocity: 10,//设置速度
           effect: -0.25,//设置效果
           size: 20, //桃心粒子大小 单位像素
       },
   };

   (function () {
       var b = 0;
       var c = ["ms", "moz", "webkit", "o"];
       for (var a = 0; a < c.length && !window.requestAnimationFrame; ++a) {
           window.requestAnimationFrame = window[c[a] + "RequestAnimationFrame"];
           window.cancelAnimationFrame = window[c[a] + "CancelAnimationFrame"] || window[c[a] + "CancelRequestAnimationFrame"]
       }
       if (!window.requestAnimationFrame) {
           window.requestAnimationFrame = function (h, e) {
               var d = new Date().getTime();
               var f = Math.max(0, 16 - (d - b));
               var g = window.setTimeout(function () {
                   h(d + f)
               }, f);
               b = d + f;
               return g
           }
       }
       if (!window.cancelAnimationFrame) {
           window.cancelAnimationFrame = function (d) {
               clearTimeout(d)
           }
       }
   }());


   var Point = (function () {
       function Point(x, y) {
           this.x = (typeof x !== 'undefined') ? x : 0;
           this.y = (typeof y !== 'undefined') ? y : 0;
       }

       Point.prototype.clone = function () {
           return new Point(this.x, this.y);
       };
       Point.prototype.length = function (length) {
           if (typeof length == 'undefined')
               return Math.sqrt(this.x * this.x + this.y * this.y);
           this.normalize();
           this.x *= length;
           this.y *= length;
           return this;
       };
       Point.prototype.normalize = function () {
           var length = this.length();
           this.x /= length;
           this.y /= length;
           return this;
       };
       return Point;
   })();


   var Particle = (function () {
       function Particle() {
           this.position = new Point();
           this.velocity = new Point();
           this.acceleration = new Point();
           this.age = 0;
       }

       Particle.prototype.initialize = function (x, y, dx, dy) {
           this.position.x = x;
           this.position.y = y;
           this.velocity.x = dx;
           this.velocity.y = dy;
           this.acceleration.x = dx * settings.particles.effect;
           this.acceleration.y = dy * settings.particles.effect;
           this.age = 0;
       };
       Particle.prototype.update = function (deltaTime) {
           this.position.x += this.velocity.x * deltaTime;
           this.position.y += this.velocity.y * deltaTime;
           this.velocity.x += this.acceleration.x * deltaTime;
           this.velocity.y += this.acceleration.y * deltaTime;
           this.age += deltaTime;
       };
       Particle.prototype.draw = function (context, image) {
           function ease(t) {
               return (--t) * t * t + 1;
           }
           var size = image.width * ease(this.age / settings.particles.duration);
           context.globalAlpha = 1 - this.age / settings.particles.duration;
           context.drawImage(image, this.position.x - size / 2, this.position.y - size / 2, size, size);
       };
       return Particle;
   })();

   var ParticlePool = (function () {
       var particles,
           firstActive = 0,
           firstFree = 0,
           duration = settings.particles.duration;

       function ParticlePool(length) {
           particles = new Array(length);
           for (var i = 0; i < particles.length; i++)
               particles[i] = new Particle();
       }

       ParticlePool.prototype.add = function (x, y, dx, dy) {
           particles[firstFree].initialize(x, y, dx, dy);
           firstFree++;
           if (firstFree == particles.length) firstFree = 0;
           if (firstActive == firstFree) firstActive++;
           if (firstActive == particles.length) firstActive = 0;
       };
       ParticlePool.prototype.update = function (deltaTime) {
           var i;
           if (firstActive < firstFree) {
               for (i = firstActive; i < firstFree; i++)
                   particles[i].update(deltaTime);
           }
           if (firstFree < firstActive) {
               for (i = firstActive; i < particles.length; i++)
                   particles[i].update(deltaTime);
               for (i = 0; i < firstFree; i++)
                   particles[i].update(deltaTime);
           }
           while (particles[firstActive].age >= duration && firstActive != firstFree) {
               firstActive++;
               if (firstActive == particles.length) firstActive = 0;
           }
       };
       ParticlePool.prototype.draw = function (context, image) {
           if (firstActive < firstFree) {
               for (i = firstActive; i < firstFree; i++)
                   particles[i].draw(context, image);
           }
           if (firstFree < firstActive) {
               for (i = firstActive; i < particles.length; i++)
                   particles[i].draw(context, image);
               for (i = 0; i < firstFree; i++)
                   particles[i].draw(context, image);
           }
       };
       return ParticlePool;
   })();
   (function (canvas) {
       var context = canvas.getContext('2d'),
           particles = new ParticlePool(settings.particles.length),
           particleRate = settings.particles.length / settings.particles.duration, // particles/sec
           time;
       function pointOnHeart(t) {
           return new Point(
               160 * Math.pow(Math.sin(t), 3),
               130 * Math.cos(t) - 50 * Math.cos(2 * t) - 20 * Math.cos(3 * t) - 10 * Math.cos(4 * t) + 25
           );
       }
       var image = (function () {
           var canvas = document.createElement('canvas'),
               context = canvas.getContext('2d');
           canvas.width = settings.particles.size;
           canvas.height = settings.particles.size;

           function to(t) {
               var point = pointOnHeart(t);
               point.x = settings.particles.size / 2 + point.x * settings.particles.size / 350;
               point.y = settings.particles.size / 2 - point.y * settings.particles.size / 350;
               return point;
           }
           context.beginPath();
           var t = -Math.PI;
           var point = to(t);
           context.moveTo(point.x, point.y);
           while (t < Math.PI) {
               t += 0.01;
               point = to(t);
               context.lineTo(point.x, point.y);
           }
           context.closePath();
           //颜色修改
           context.fillStyle = '#fa71cd';
           context.fill();
           var image = new Image();
           image.src = canvas.toDataURL();
           return image;
       })();

       function render() {
           requestAnimationFrame(render);
           var newTime = new Date().getTime() / 1000,
               deltaTime = newTime - (time || newTime);
           time = newTime;
           context.clearRect(0, 0, canvas.width, canvas.height);
           var amount = particleRate * deltaTime;
           for (var i = 0; i < amount; i++) {
               var pos = pointOnHeart(Math.PI - 2 * Math.PI * Math.random());
               var dir = pos.clone().length(settings.particles.velocity);
               particles.add(canvas.width / 2 + pos.x, canvas.height / 2 - pos.y, dir.x, -dir.y);
           }
           particles.update(deltaTime);
           particles.draw(context, image);
       }
       function onResize() {
           canvas.width = canvas.clientWidth;
           canvas.height = canvas.clientHeight;
       }

       window.onresize = onResize;
       setTimeout(function () {
           onResize();
           render();
       }, 10);
   })(document.getElementById('love'));



大家的支持就是我坚持的动力!

如果文章对你有帮助的话就请

👍点赞 ✍️评论 💙收藏

一键三连哦!

🤗🤗🤗🤗🤗

如果以上内容有任何错误或者不准确的地方,🤝🤝欢迎在下面 👇 留个言指出!

或者你有更好的想法,欢迎一起交流学习❤️💙💛💚🧡💜


每一个程序员都应该有的这颗爱心,它在这里!的评论 (共 条)

分享到微博请遵守国家法律