HTML制作跳动的心形网页

作为一名码农 也有自己浪漫的小心思嗷~ 该网页  代码整体难度不大 操作性较强 祝大家都幸福hhhhh

效果成品:

全部代码: 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>

<HEAD>
  <TITLE> 一个有内涵的网页 </TITLE>
  <META NAME="Generator" CONTENT="EditPlus">
  <META NAME="Author" CONTENT="">
  <META NAME="Keywords" CONTENT="">
  <META NAME="Description" CONTENT="">
  <style>
    html,
    body {
      height: 100%;
      padding: 0;
      margin: 0;
      background: #000;
    }

    h1 {
      color: pink;
    }

    canvas {
      position: absolute;
      width: 100%;
      height: 100%;
    }
  </style>
</HEAD>

<BODY>
  <canvas id="pinkboard"></canvas>


  <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>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/545101.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

攻防世界07Robots

7.Robots 打开是一个空白的&#xff08;没错下面是一张空白图片&#xff09; 查看源代码显示flag is not here&#xff0c;在后面加上robots.txt查看 robots协议也称爬虫协议、爬虫规则等,是指网站可建立一个robots.txt文件来告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,而…

MyBatis 源码分析 - 配置文件解析过程

* 本文速览 由于本篇文章篇幅比较大&#xff0c;所以这里拿出一节对本文进行快速概括。本篇文章对 MyBatis 配置文件中常用配置的解析过程进行了较为详细的介绍和分析&#xff0c;包括但不限于settings&#xff0c;typeAliases和typeHandlers等&#xff0c;本文的篇幅也主要在…

运动耳机怎么选择?五款超值必购开放式耳机推荐!

在喧嚣的城市中&#xff0c;如何找到一款既适合户外运动又能保持警觉性的耳机呢&#xff1f;开放式蓝牙耳机或许是你的理想之选。它的开放式设计让你在享受音乐的同时&#xff0c;也能时刻关注周围环境的变化。对于经常参与户外活动或需要在工作场所保持警觉的人来说&#xff0…

B端模块(1):用户管理模块的定义、功能、页面和设计原则。

B端管理系统都是各个模块的有机结合&#xff0c;保证系统的正常运转&#xff0c;这点和人体系统一样&#xff0c;比如消化、呼吸、循环系统等等。从本期开始&#xff0c;贝格前端工场将详细B端各个模块&#xff0c;一共分为20期&#xff0c;本期是第一期&#xff0c;欢迎老铁们…

精品方案- 智慧养殖业IOT项目技术建议书(免费下载)

本项目建设从实际需求出发&#xff0c;利用物联网信息化手段进行畜牧业经济运行监测&#xff0c;掌握畜牧业生产与畜牧业经济运行的动态&#xff0c;监测畜牧业生产经营的成本收益变化&#xff0c;对畜牧业生产经营活动提供分析。提高畜牧业市场监管的电子化、网络化水平&#…

Maven 项目 JDK 8、JDK 17 多版本 Java 编译依赖最佳实践

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

Java SPI机制详解

Java SPI机制详解 1、什么是SPI&#xff1f; SPI 全称为 (Service Provider Interface) &#xff0c;是JDK内置的一种服务提供发现机制。SPI是一种动态替换发现的机制&#xff0c; 比如有个接口&#xff0c;想运行时动态的给它添加实现&#xff0c;你只需要添加一个实现。我们…

高中数学:三角函数-4个解题妙招

一、对偶式 1、针对题型 同角三角函数的问题 2、方法定义 对于形如下方的式子&#xff0c;就可以用对偶式方法解 3、练习 例题1 例题2 二、巧用三角函数定义 1、针对题型 没有给出具体三角函数值的问题 2、方法定义 3、练习 例题1 三、诱导公式 1、针对题型 锐…

VK1618 SOP18/DIP18高稳定LED驱动IC防干扰数显驱动控制器计量插座数显芯片 FAE支持

产品型号&#xff1a;VK1618 产品品牌&#xff1a;永嘉微电/VINKA 封装形式&#xff1a;SOP18/ DIP18 原厂&#xff0c;工程服务&#xff0c;技术支持&#xff01; 概述 VK1618是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片&#xff0c;内部集成有3线串行接口、数…

高风险IP的来源及其影响

随着互联网的发展&#xff0c;网络安全问题越来越引人关注。其中&#xff0c;高风险IP的来源成为了研究和讨论的焦点之一。高风险IP指的是那些经常涉及到网络攻击、恶意软件传播以及其他不良行为的IP地址。它们的存在不仅对个人和组织的网络安全构成威胁&#xff0c;还可能给整…

2024年4月最新十大地推拉新APP一手接单平台!盘点地推网推项目渠道!

随着移动互联网的蓬勃发展&#xff0c;APP市场的竞争愈发激烈&#xff0c;各类APP需要不断创新&#xff0c;吸引更多用户。在这个背景下&#xff0c;拉新推广市场愈发兴盛。如果您正在寻找最新的APP拉新渠道&#xff0c;或者想了解如何获取和使用地推拉新资源&#xff1f;那么您…

matlab使用教程(44)—绘制带标记的二维曲线图

在线图中添加标记是区分多个线条或突出显示特定数据点的有用方法。使用下面的一种方式添加标记&#xff1a; • 在线条设定输入参数&#xff08;例如 plot(x,y,-s) &#xff09;中包含标记符号。 • 将 Marker 属性指定为一个名称-值对组&#xff0c;例如 plot(x,y,Marker,s…

元强化学习研究综述

源自&#xff1a;软件学报 作者&#xff1a;陈奕宇, 霍静, 丁天雨, 高阳 “人工智能技术与咨询” 发布 摘 要 近年来, 深度强化学习(deep reinforcement learning, DRL)已经在诸多序贯决策任务中取得瞩目成功, 但当前, 深度强化学习的成功很大程度依赖于海量的学习数据与计…

[阅读笔记5][MoCo]Momentum Contrast for Unsupervised Visual Representation Learning

接下来是MoCo这篇论文&#xff0c;facebook于20年2月发表。 这篇论文研究的是对比学习。 受NLP自监督预训练的模型影响&#xff0c;CV这边也希望能有一个自监督预训练的特征提取器&#xff0c;这样就能很方便的在其他下游任务微调了。而对比学习的目的就是能够自监督预训练得到…

postgresql 备份恢复相关知识点整理归纳 —— 筑梦之路

概述 PG一般有两种备份方式&#xff1a;逻辑备份和物理备份 逻辑备份对于数据量大的场景下耗时较长&#xff0c;恢复也会耗时较长 物理备份拷贝文件的方式相对来说耗时较短&#xff0c;跟磁盘读写性能和网络传输性能有关 逻辑备份 pg_dump pg_dump 将表结构及数据以SQL语句…

传感器展会现场直击!道合顺传感邀您共鉴气体传感器前沿技术

4月14日&#xff0c;#深圳国际传感器#与应用技术展览会在深圳会展中心&#xff08;福田&#xff09;如期举办。道合顺传感亮相本届大会并展示了对气体传感器的探索和最新研究成果&#xff0c;获得了传感器业内的广泛关注。 多年来&#xff0c;道合顺传感依托于雄厚的研发实力&a…

有了一站式知识库服务平台,再也不用担心工作效率了!

你是否记得无数次在海量文件和邮件里搜索资料的烦恼&#xff1f;又或者是在急需某个信息时&#xff0c;却发现它埋藏在某个早已遗忘的文件夹深处&#xff1f;如果你的答案是肯定的&#xff0c;那么一站式知识库服务平台的出现&#xff0c;无疑是你提高工作效率的得力助手。 知识…

Android IPC机制

在Android系统中&#xff0c;IPC&#xff08;Inter-Process Communication&#xff0c;进程间通讯&#xff09;是指在不同进程之间传送数据和通讯的机制。Android中的应用通常运行在独立的沙箱环境中的进程里&#xff0c;由于安全限制&#xff0c;这些进程无法直接访问彼此的内…

arxiv文章导出的bibtex格式是misc导致latex引用不正确

问题 在arxiv官网上右下角导出bibtex&#xff0c;发现是misc格式&#xff0c;然后我用的是springer的期刊latex模板&#xff0c;发现引用不正确。 引用效果如下&#xff0c;就只有一个2024。 解决方案&#xff1a; 把上面那个bibtex手动改成下面这个。 article{liu2024in…

2024最新 PyCharm 2024.1 更新亮点看这篇就够了

2024最新 PyCharm 2024.1 更新亮点看这篇就够了 文章目录 2024最新 PyCharm 2024.1 更新亮点看这篇就够了&#x1f680; PyCharm 2024.1 发布&#xff1a;全面升级&#xff0c;助力高效编程&#xff01;摘要引言 &#x1f680; 快速掌握 Hugging Face&#xff1a;模型与数据集文…