HTML很火的浪漫愛心表白代碼
更新時間:2023年01月01日 10:07:32 作者:吾不圖
程序員的你是不是也想送個特別的禮物。今天給大家分享一個HTML+CSS+jQuery實現(xiàn)的情侶浪漫愛心表白JS特效,視覺效果還是相當(dāng)不錯!得此表白神器,程序猿也可以很浪漫!快去追你的女神吧,把這個告白愛心動畫發(fā)給你心愛的她!
程序員的你是不是也想送個特別的禮物。今天給大家分享一個HTML+CSS+jQuery實現(xiàn)的情侶浪漫愛心表白JS特效,視覺效果還是相當(dāng)不錯!得此表白神器,程序猿也可以很浪漫!快去追你的女神吧,把這個告白愛心動畫發(fā)給你心愛的她!
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("點關(guān)注不迷路!"); } </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>
相關(guān)文章
百度手寫板代碼JavaScript遠(yuǎn)程調(diào)用的實現(xiàn)(鼠標(biāo)輸入法)
百度手寫板代碼JavaScript遠(yuǎn)程調(diào)用的實現(xiàn),其實沒什么可參考的,引用百度的Js文件,如果大家想使用這個類的話,自己下載就行了,正好可參考一下本演示,幫你快速入題。2010-09-09Web網(wǎng)頁對話框可拖動、關(guān)閉(自動)文字循環(huán)變化
由Js實現(xiàn)的網(wǎng)頁WEB對話框,鼠標(biāo)可隨意拖動改變位置,類似于有些軟件初次運行時候彈出的每日提示,里面有文字在循環(huán)變化,時間到自動關(guān)閉,多么強大的一個web對話框啊,有興趣的朋友可以參考下啊2012-12-12javascript實現(xiàn)div的拖動并調(diào)整大小類似qq空間個性編輯模塊
qq空間的個性編輯模塊可以隨意的拖動頁面上的元素并且調(diào)動大小實現(xiàn)動態(tài)布局;這種效果的確很酷,那么我們也來實現(xiàn)一個吧2012-12-12自己寫的兼容ie和ff的在線文本編輯器類似ewebeditor
最近寫了個在線的編輯器,類似ewebeditor那樣的,當(dāng)然沒有人家那么強大,但是基本功能都有,而且還是兼容ie和ff的,需要的朋友可以參考下2012-12-12table 隔列(行)換色效果讓表格結(jié)構(gòu)更清淅
table 隔列換色效果,很實用的一款網(wǎng)頁特效代碼,用隔行換色來修飾表格,可讓表格結(jié)構(gòu)更清淅,也更加美觀,是一個十分流行的表格特效,在網(wǎng)頁中有利于提高用戶體驗,是一個很不錯的效果,需要的朋友可以參考下2012-12-12