爱心代码

简介: 爱心代码
<!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>


相关文章
|
12月前
|
分布式计算 Hadoop 大数据
大数据体系知识学习(一):PySpark和Hadoop环境的搭建与测试
这篇文章是关于大数据体系知识学习的,主要介绍了Apache Spark的基本概念、特点、组件,以及如何安装配置Java、PySpark和Hadoop环境。文章还提供了详细的安装步骤和测试代码,帮助读者搭建和测试大数据环境。
335 1
|
SQL Java 关系型数据库
MyBatis-Plus 分页魅力绽放!紧跟技术热点,带你领略数据分页的高效与便捷
【8月更文挑战第29天】在 Java 开发中,数据处理至关重要,尤其在大量数据查询与展示时,分页功能尤为重要。MyBatis-Plus 作为一款强大的持久层框架,提供了便捷高效的分页解决方案。通过封装数据库分页查询语句,开发者能轻松实现分页功能。在实际应用中,只需创建 `Page` 对象并设置页码和每页条数,再通过 `QueryWrapper` 构建查询条件,调用 `selectPage` 方法即可完成分页查询。MyBatis-Plus 不仅生成分页 SQL 语句,还自动处理参数合法性检查,并支持条件查询和排序等功能,极大地提升了系统性能和稳定性。
385 0
|
移动开发 JavaScript 前端开发
前端(九)——探索微信小程序、Vue、React和Uniapp生命周期(下)
前端(九)——探索微信小程序、Vue、React和Uniapp生命周期(下)
330 0
|
10月前
|
机器学习/深度学习 人工智能 API
【AI系统】昇腾异构计算架构 CANN
本文介绍了昇腾 AI 异构计算架构 CANN,涵盖硬件层面的达·芬奇架构和软件层面的全栈支持,旨在提供高性能神经网络计算所需的硬件基础和软件环境。通过多层级架构,CANN 实现了高效的 AI 应用开发与性能优化,支持多种主流 AI 框架,并提供丰富的开发工具和接口,助力开发者快速构建和优化神经网络模型。
574 1
|
Java 测试技术 持续交付
自动化测试框架选型与实战:深入探索与应用
【5月更文挑战第8天】本文探讨了自动化测试框架的选型与实战应用,强调了其在软件质量保障中的重要性。选型原则包括考虑项目需求、技术栈、可扩展性和可维护性,以及社区支持和文档。介绍了Selenium、Appium、JUnit和Pytest等常用框架,并概述了实战应用的步骤,包括明确需求、搭建环境、编写测试用例、执行测试、分析结果、维护代码和持续集成。合理选型与实践能提升测试效率,保障项目成功。
|
Java 关系型数据库 MySQL
JavaWeb基础第一章(MySQL数据库与JDBC)
JavaWeb基础第一章(MySQL数据库与JDBC)
|
12月前
|
JSON 小程序 API
了解API文档
API文档是技术手册,详述了如何使用和集成API。内容涵盖API功能、参数信息、调用方式、返回值及错误码等。其作用在于帮助开发者高效理解和运用API,降低开发成本,提升效率。对于API提供者来说,良好的文档有助于提高API的易用性和稳定性,减少支持成本。常见的文档格式包括HTML、PDF和Markdown,而Swagger和Postman等工具则方便生成和测试API文档。无论是Java官方API还是微信小程序API,理解文档都是使用API的关键步骤。
|
JavaScript 开发者
从零基础到实战应用:Angular入门指南带你一步步构建你的第一个Web应用——全面介绍环境搭建、项目创建、组件开发与应用集成
【8月更文挑战第31天】本文档是针对初学者的Angular入门指南。通过详细步骤与示例代码,教你如何使用Angular CLI搭建开发环境、创建新项目、添加及配置组件,并运行首个应用。Angular是由Google开发的强大Web框架,专为高效构建复杂单页应用设计。按照本指南操作,你将能够快速上手Angular,开启Web应用开发之旅。
872 0
|
12月前
|
人工智能 安全 大数据
CDGA|数据要素与数据安全:携手构建可信数据生态的深远探讨
数据要素与数据安全是数字经济时代不可分割的双生子。只有在保障数据安全的前提下,才能充分发挥数据要素的价值,推动数字经济持续健康发展。构建可信数据生态,需要政府、企业、社会组织及广大公众的共同努力,形成合力,共同应对挑战,共创数字经济的美好未来。
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:一场永无止境的较量
在移动操作系统的双寡头格局中,安卓(Android)与iOS以其独特的魅力和优势各自占据了半壁江山。然而,正如硬币的两面,它们在安全性方面的差异也成为了用户、开发者乃至整个行业关注的焦点。本文旨在深入剖析安卓与iOS在安全性上的不同表现,探讨其背后的原因,并展望未来两者在安全性领域的发展趋势。通过对比分析,我们将揭示这场永无止境的较量中,谁更能为用户的数据安全保驾护航。