| <!DOCTYPE html> |
| <html> |
| <head> |
| <title></title> |
| <script src="js/jquery.min.js"></script> |
| </head> |
| <style> |
| * { |
| padding:; |
| margin:; |
| } |
| html, |
| body { |
| height:%; |
| padding:; |
| margin:; |
| background: #; |
| } |
| |
| .aa { |
| position: fixed; |
| left:%; |
| bottom:px; |
| color: #ccc; |
| } |
| |
| .container { |
| width:%; |
| height:%; |
| } |
| canvas { |
| z-index:; |
| position: absolute; |
| width:%; |
| height:%; |
| } |
| </style> |
| <body> |
| |
| <div id="jsi-cherry-container" class="container"> |
| <audio autoplay="autopaly"> |
| <source src="renxi.mp" type="audio/mp3" /> |
| </audio> |
| <img class="img" src="./.png" alt="" /> |
| |
| <canvas id="pinkboard" class="container"> </canvas> |
| </div> |
| |
| </body> |
| </html> |
| <script> |
| |
| |
| |
| var settings = { |
| particles: { |
| length:, |
| duration:, |
| velocity:, |
| effect: -.75, |
| size:, |
| }, |
| }; |
| |
| (function () { |
| var b =; |
| var c = ["ms", "moz", "webkit", "o"]; |
| for (var a =; 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(, 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 :; |
| this.y = typeof y !== "undefined" ? y :; |
| } |
| 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 =; |
| } |
| 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 =; |
| }; |
| 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 +; |
| } |
| var size = image.width * ease(this.age / settings.particles.duration); |
| context.globalAlpha = - this.age / settings.particles.duration; |
| context.drawImage( |
| image, |
| this.position.x - size /, |
| this.position.y - size /, |
| size, |
| size |
| ); |
| }; |
| return Particle; |
| })(); |
| |
| |
| |
| |
| var ParticlePool = (function () { |
| var particles, |
| firstActive =, |
| firstFree =, |
| duration = settings.particles.duration; |
| |
| function ParticlePool(length) { |
| |
| particles = new Array(length); |
| for (var i =; 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 =; |
| if (firstActive == firstFree) firstActive++; |
| if (firstActive == particles.length) firstActive =; |
| }; |
| 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 =; i < firstFree; i++) particles[i].update(deltaTime); |
| } |
| |
| |
| while ( |
| particles[firstActive].age >= duration && |
| firstActive != firstFree |
| ) { |
| firstActive++; |
| if (firstActive == particles.length) firstActive =; |
| } |
| }; |
| 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 =; i < firstFree; i++) particles[i].draw(context, image); |
| } |
| }; |
| return ParticlePool; |
| })(); |
| |
| |
| |
| |
| (function (canvas) { |
| var context = canvas.getContext("d"), |
| particles = new ParticlePool(settings.particles.length), |
| particleRate = |
| settings.particles.length / settings.particles.duration, |
| time; |
| |
| |
| function pointOnHeart(t) { |
| return new Point( * Math.pow(Math.sin(t), 3), |
| * Math.cos(t) - |
| * Math.cos(2 * t) - |
| * Math.cos(3 * t) - |
| * Math.cos(4 * t) + |
| |
| ); |
| } |
| |
| |
| var image = (function () { |
| var canvas = document.createElement("canvas"), |
| context = canvas.getContext("d"); |
| canvas.width = settings.particles.size; |
| canvas.height = settings.particles.size; |
| |
| function to(t) { |
| var point = pointOnHeart(t); |
| point.x = |
| settings.particles.size / + |
| (point.x * settings.particles.size) /; |
| point.y = |
| settings.particles.size / - |
| (point.y * settings.particles.size) /; |
| return point; |
| } |
| |
| context.beginPath(); |
| var t = -Math.PI; |
| var point = to(t); |
| context.moveTo(point.x, point.y); |
| while (t < Math.PI) { |
| t +=.01; |
| point = to(t); |
| context.lineTo(point.x, point.y); |
| } |
| context.closePath(); |
| |
| context.fillStyle = "#eab0"; |
| context.fill(); |
| |
| var image = new Image(); |
| image.src = canvas.toDataURL(); |
| return image; |
| })(); |
| |
| |
| function render() { |
| |
| requestAnimationFrame(render); |
| |
| |
| var newTime = new Date().getTime() /, |
| deltaTime = newTime - (time || newTime); |
| time = newTime; |
| |
| |
| context.clearRect(, 0, canvas.width, canvas.height); |
| |
| |
| var amount = particleRate * deltaTime; |
| for (var i =; i < amount; i++) { |
| var pos = pointOnHeart(Math.PI - * Math.PI * Math.random()); |
| var dir = pos.clone().length(settings.particles.velocity); |
| particles.add( |
| canvas.width / + pos.x, |
| canvas.height / - 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(); |
| },); |
| })(document.getElementById("pinkboard")); |
| </script> |
| |
| <script> |
| var RENDERER = { |
| INIT_CHERRY_BLOSSOM_COUNT:, |
| MAX_ADDING_INTERVAL:, |
| |
| init: function () { |
| this.setParameters(); |
| this.reconstructMethods(); |
| this.createCherries(); |
| this.render(); |
| if ( |
| navigator.userAgent.match( |
| /(phone|pod|iPhone|iPod|ios|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i |
| ) |
| ) { |
| |
| |
| |
| } |
| }, |
| setParameters: function () { |
| this.$container = $("#jsi-cherry-container"); |
| this.width = this.$container.width(); |
| this.height = this.$container.height(); |
| this.context = $("<canvas />") |
| .attr({ width: this.width, height: this.height }) |
| .appendTo(this.$container) |
| .get() |
| var rate = this.FOCUS_POSITION / (this.z + this.FOCUS_POSITION), |
| x = this.renderer.width / + this.x * rate, |
| y = this.renderer.height / - this.y * rate; |
| return { rate: rate, x: x, y: y }; |
| }, |
| re |
| } |
| } else { |
| this.phi += Math.PI / (axis.y == this.thresholdY ? : 500); |
| this.phi %= Math.PI; |
| } |
| if (this.y <= -this.renderer.height * this.SURFACE_RATE) { |
| this.x +=; |
| this.y = -this.renderer.height * this.SURFACE_RATE; |
| } else { |
| this.x += this.vx; |
| this.y += this.vy; |
| } |
| return ( |
| this.z > -this.FOCUS_POSITION && |
| this.z < this.FAR_LIMIT && |
| this.x < this.renderer.width *.5 |
| ); |
| }, |
| }; |
| $(function () { |
| RENDERER.init(); |
| }); |
| </script> |