前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >动态爱心

动态爱心

作者头像
千山暮海雪
发布2024-12-25 18:49:36
发布2024-12-25 18:49:36
4700
代码可运行
举报
文章被收录于专栏:xcdhxcdh
运行总次数:0
代码可运行

New Document

代码语言:javascript
代码运行次数:0
复制
<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;
  }
  canvas {
    position: absolute;
    width: 100%;
    height: 100%;
  }
</style>
代码语言:javascript
代码运行次数:0
复制
<canvas id="pinkboard"></canvas>
<script>
  /*

Settings */

代码语言:javascript
代码运行次数:0
复制
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 */

代码语言:javascript
代码运行次数:0
复制
(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>

演示:aixin.mov

BYV.png
BYV.png
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档