爱心代码

简介: 爱心代码
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>💗 Love you 💗</title>
    <style type="text/css">
      body {
        margin: 0;
        overflow: hidden;
        background: #000;      }
      canvas {
        position: absolute;
        width: 100%;
        height: 100%;
      }
#pinkboard {        animation: anim 1.5s ease-in-out infinite;
-webkit-animation: anim 1.5s ease-in-out infinite;
-o-animation: anim 1.5s ease-in-out infinite;
-moz-animation: anim 1.5s ease-in-out infinite;
      }
      @keyframes anim {
0% {
          transform: scale(0.8);
        }
25% {
          transform: scale(0.7);
        }
50% {
          transform: scale(1);
        }
75% {
          transform: scale(0.7);
        }
100% {
          transform: scale(0.8);
        }
      }
      @-webkit-keyframes anim {
0% {
-webkit-transform: scale(0.8);
        }
25% {
-webkit-transform: scale(0.7);
        }
50% {
-webkit-transform: scale(1);
        }
75% {
-webkit-transform: scale(0.7);
        }
100% {
-webkit-transform: scale(0.8);
        }
      }
      @-o-keyframes anim {
0% {
-o-transform: scale(0.8);
        }
25% {
-o-transform: scale(0.7);
        }
50% {
-o-transform: scale(1);
        }
75% {
-o-transform: scale(0.7);
        }
100% {
-o-transform: scale(0.8);
        }
      }
      @-moz-keyframes anim {
0% {
-moz-transform: scale(0.8);
        }
25% {
-moz-transform: scale(0.7);
        }
50% {
-moz-transform: scale(1);
        }
75% {
-moz-transform: scale(0.7);
        }
100% {
-moz-transform: scale(0.8);
        }
      }
#name {        position: absolute;
top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        margin-top: -20px;
        font-size: 46px;
        color: #ea80b0;      }
    </style>
  </head>
  <body>
    <canvas id="pinkboard"></canvas>
    <!-- <div id="name"></div> -->
    <canvas id="canvas"></canvas>
    <script type="text/javascript">
      const colors = [
"#eec996",
"#8fb7d3",
"#b7d4c6",
"#c3bedd",
"#f1d5e4",
"#cae1d3",
"#f3c89d",
"#d0b0c3",
"#819d53",
"#c99294",
"#cec884",
"#ff8e70",
"#e0a111",
"#fffdf6",
"#cbd7ac",
"#e8c6c0",
"#dc9898",
"#ecc8ba",
      ]; //用来设置的颜色
      var canvas = document.getElementById("canvas");
      var ctx = canvas.getContext("2d");
      let count =1;
      var ww = window.innerWidth;
      var wh = window.innerHeight;
      var hearts = [];
function init() {
        requestAnimationFrame(render);
        canvas.width = ww;
        canvas.height = wh;
for (var i =0; i < 100; i++) {
          hearts.push(new Heart());
        }
      }
function Heart() {
        this.x = Math.random() * ww;
        this.y = Math.random() * wh;
        this.opacity = Math.random() * 0.5 +0.5;
        this.vel = {
          x: (Math.random() -0.5) * 4,
          y: (Math.random() -0.5) * 4,
        };
        this.targetScale = Math.random() * 0.15 +0.02;
        this.scale = this.targetScale * Math.random();
      }
      Heart.prototype.update =function (i) {
        this.x += this.vel.x;
        this.y += this.vel.y;
        this.scale += (this.targetScale - this.scale) * 0.01;
if (this.x - this.width > ww || this.x + this.width < 0) {
          this.scale =0;
          this.x = Math.random() * ww;
        }
if (this.y - this.height > wh || this.y + this.height < 0) {
          this.scale =0;
          this.y = Math.random() * wh;
        }
        this.width =473.8;
        this.height =408.6;
      };
      Heart.prototype.draw =function (i) {
        ctx.globalAlpha = this.opacity;
        ctx.font =`${180 * this.scale}px "微软雅黑"`;
        // ctx.font="20px";
        ctx.fillStyle = colors[i % 18];
        ctx.fillText(
"",
          this.x - this.width * 0.5,
          this.y - this.height * 0.5,
          this.width,
          this.height
        );
        // ctx.drawImage(
        //   heartImage,
        //   this.x - this.width * 0.5,
        //   this.y - this.height * 0.5,
        //   this.width,
        //   this.height
        // );
      };
function render() {
        ctx.clearRect(0, 0, ww, wh);
        // ctx.globalAlpha =1;
        // ctx.fillStyle ="rgba(255,255,255,0.3)";
        // ctx.fillRect(0, 0, ww, wh);
for (var i =0; i < 100; i++) {
          hearts[i].update(i);
          hearts[i].draw(i);
        }
        requestAnimationFrame(render);
      }
      init();
      // var heartImage = new Image();
      // heartImage.onload = init();
      // heartImage.src =      //   "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0NzMuOHB4IiBoZWlnaHQ9IjQwOC42cHgiIHZpZXdCb3g9IjAgMCA0NzMuOCA0MDguNiI+PHBhdGggZmlsbD0iI2QzMjkzMiIgZD0iTTQwNC42LDE2LjZDMzg1LjQsNi4xLDM2My41LDAsMzQwLDBjLTQxLjUsMC03OC41LDE4LjktMTAzLDQ4LjVDMjEyLjMsMTguOSwxNzUuMywwLDEzMy44LDAgYy0yMy4zLDAtNDUuMyw2LjEtNjQuNSwxNi42QzI3LjksMzkuNSwwLDgzLjQsMCwxMzMuOWMwLDE0LjQsMi40LDI4LjMsNi42LDQxLjJDMjkuNiwyNzguNCwyMzcsNDA4LjYsMjM3LDQwOC42IHMyMDcuMi0xMzAuMiwyMzAuMi0yMzMuNWM0LjMtMTIuOSw2LjYtMjYuOCw2LjYtNDEuMkM0NzMuOCw4My40LDQ0NS45LDM5LjYsNDA0LjYsMTYuNnoiLz48L3N2Zz4=";
      window.addEventListener("resize", function () {
        ww = window.innerWidth;
        wh = window.innerHeight;
      });
    </script>
    <script>
      /*
       * Settings
       */
      var settings = {
        particles: {
          length: 500, // maximum amount of particles
          duration: 2, // particle duration in sec
          velocity: 100, // particle velocity in pixels/sec
          effect: -0.75, // play with this for a nice effect
          size: 30, // particle size in pixels
        },
      };
      /*
       * RequestAnimationFrame polyfill by Erik M?ller
       */
      (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);
          };
        }
      })();
      /*
       * Point class
       */
      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;
      })();
      /*
       * Particle class
       */
      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;
      })();
      /*
       * ParticlePool class
       */
      var ParticlePool = (function () {
        var particles,
          firstActive =0,
          firstFree =0,
          duration = settings.particles.duration;
function ParticlePool(length) {
          // create and populate particle pool
          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);
          // handle circular queue
          firstFree++;
if (firstFree == particles.length) firstFree =0;
if (firstActive == firstFree) firstActive++;
if (firstActive == particles.length) firstActive =0;
        };
        ParticlePool.prototype.update =function (deltaTime) {
          var i;
          // update active particles
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);
          }
          // remove inactive particles
while (
            particles[firstActive].age >= duration &&
            firstActive != firstFree
          ) {
            firstActive++;
if (firstActive == particles.length) firstActive =0;
          }
        };
        ParticlePool.prototype.draw =function (context, image) {
          // draw active particles
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;
      })();
      /*
       * Putting it all together
       */
      (function (canvas) {
        var context = canvas.getContext("2d"),
          particles = new ParticlePool(settings.particles.length),
          particleRate =            settings.particles.length / settings.particles.duration, // particles/sec
          time;
        // get point on heart with -PI <= t <= PI
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          );
        }
        // creating the particle image using a dummy canvas
        var image = (function () {
          var canvas = document.createElement("canvas"),
            context = canvas.getContext("2d");
          canvas.width = settings.particles.size;
          canvas.height = settings.particles.size;
          // helper function to create the path
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;
          }
          // create the path
          context.beginPath();
          var t =-Math.PI;
          var point = to(t);
          context.moveTo(point.x, point.y);
while (t < Math.PI) {
            t +=0.01; // baby steps!
            point = to(t);
            context.lineTo(point.x, point.y);
          }
          context.closePath();
          // create the fill
          context.fillStyle ="#ea80b0";
          context.fill();
          // create the image
          var image = new Image();
          image.src = canvas.toDataURL();
          return image;
        })();
        // render that thing!
function render() {
          // next animation frame
          requestAnimationFrame(render);
          // update time
          var newTime = new Date().getTime() / 1000,
            deltaTime = newTime - (time || newTime);
          time = newTime;
          // clear canvas
          context.clearRect(0, 0, canvas.width, canvas.height);
          // create new particles
          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
            );
          }
          // update and draw particles
          particles.update(deltaTime);
          particles.draw(context, image);
        }
        // handle (re-)sizing of the canvas
function onResize() {
          canvas.width = canvas.clientWidth;
          canvas.height = canvas.clientHeight;
        }
        window.onresize = onResize;
        // delay rendering bootstrap
        setTimeout(function () {
          onResize();
          render();
        }, 10);
      })(document.getElementById("pinkboard"));
    </script>
  </body>
</html>


相关文章
|
10月前
|
设计模式 存储 Java
写出漂亮代码的45个小技巧(上)
大家好,我是三友~~ 不知道大家有没有经历过维护一个已经离职的人的代码的痛苦,一个方法写老长,还有很多的if else ,根本无法阅读,更不知道代码背后的含义,最重要的是没有人可以问,此时只能心里默默地问候这个留坑的兄弟。。
写出漂亮代码的45个小技巧(上)
|
存储 设计模式 安全
代码优雅的45个小技巧,你知道吗?
代码优雅的45个小技巧,你知道吗?
|
Java Android开发
几行代码就能实现为何要多此一举
几行代码就能搞定,不能代表一个人很牛,借助了开源,只是站在了巨人的肩膀上,让你省去了去往成功的一大段路,然而这一段路上的风景,还请你仔细去欣赏,到头来,你会发现,路上的风景会远远美于终点的成功。
|
Java Python
长见识,让大家看看什么是垃圾代码
长见识,让大家看看什么是垃圾代码
99 0
|
存储 分布式计算 并行计算
聊聊什么代码是好代码
聊聊什么代码是好代码
|
设计模式 消息中间件 前端开发
这45个小技巧,让你的代码突然又优雅了
这45个小技巧,让你的代码突然又优雅了
|
SQL 人工智能 前端开发
无代码的未来
随着无代码技术越来越成熟,很多web应用已经可以基于无代码平台进行开发。本文分析了4个最流行的无代码平台,并梳理了无代码行业今后可能的发展方向。
414 0
无代码的未来
|
设计模式 IDE Java
如何将代码写的更加优雅
如何将代码写的更加优雅
|
数据可视化 JavaScript 前端开发
你的代码长啥样?
你的代码长啥样?
153 0
你的代码长啥样?
|
数据可视化 开发工具 git
如何给你的代码祝寿?
前段时间 alibaba/x-render 突破 3K Star,一直寻思着怎么给开源社区贡献的同学做一个小礼物来“祝寿”,然后就想到了之前玩过的 gource 和 avconv 这两个库(参数不熟悉可查文档,此外不多加解释),前者用于处理提交日志可视化,后者用于视频处理。