程序员的你是不是也想送个特别的礼物。今天给大家分享一个html+css+jquery实现的情侣浪漫爱心表白js特效,视觉效果还是相当不错!得此表白神器,程序猿也可以很浪漫!快去追你的女神吧,把这个告白爱心动画发给你心爱的她!
html代码如下,亲测可用。
<!doctype html> <html lang="zh"> <head> <meta charset="utf-8"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <title>diy跳动爱心</title> <style> * { padding: 0; margin: 0; } body { height: 600px; padding: 0; margin: 0; background: #000; display: flex; justify-content: center; align-items: center; } .container { width: 500px; height: 500px; position: relative; } canvas { z-index: 99; position: absolute; width: 500px; height: 500px; } .text_box { text-align: center; position: absolute; font-size: 1.125rem; top: 36%; left: 22%; color: #ff437b; z-index: 100; } input { font-size: 1.375rem; color: #ff437b; text-align: center; background: none; } button { font-size: 1.375rem; border: none; border-radius: 4px; } input::input-placeholder { color: #dc4b61; } input::-webkit-input-placeholder { color: #dc4b61; } .heart { animation: heart 1s infinite ease-in-out; } @keyframes heart { 0%, 100% { transform: rotate(-2deg) scale(1); } 50% { transform: rotate(2deg) scale(1.12); } } </style> </head> <body> <div id="jsi-cherry-container" class="container "> <!-- 爱心 --> <canvas id="pinkboard" class="container heart"> </canvas> <!-- 输入你需要的文字 --> <div class="text_box"> <input type="text" id="text" placeholder="送给你的那个[ta]️"> <button id="btn" onclick="fn()">❤️</button> </div> </div> </body> <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script> <script> function fn() { var a1 = document.queryselector('#text'); var btn = document.queryselector('#btn'); a1.style.border = 'none'; btn.parentnode.removechild(btn); console.log("点关注不迷路!"); } </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 }, }; (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 = "#dc4b61"; 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> </html>
发表评论