Toggle navigation
在线编辑器
在线代码
文本比较
jQuery下载
前端库
在线手册
登录/注册
下载代码
html
css
js
分享到微信朋友圈
X
html
css
* { margin: 0; padding: 0; } html, body { overflow: hidden; } body { position: relative; background: #000; }
JavaScript
/* * File Name / blowingHeart.js * Created Date / Aug 24, 2020 * Aurhor / Toshiya Marukubo */ /* Common Tool. */ class Tool { // random number. static randomNumber(min, max) { return Math.floor(Math.random() * (max - min + 1) + min); } // random color rgb. static randomColorRGB() { return ( "rgb(" + this.randomNumber(0, 255) + ", " + this.randomNumber(0, 255) + ", " + this.randomNumber(0, 255) + ")" ); } // random color hsl. static randomColorHSL(hue, saturation, lightness) { return ( "hsl(" + hue + ", " + saturation + "%, " + lightness + "%)" ); } // gradient color. static gradientColor(ctx, cr, cg, cb, ca, x, y, r) { const col = cr + "," + cg + "," + cb; const g = ctx.createRadialGradient(x, y, 0, x, y, r); g.addColorStop(0, "rgba(" + col + ", " + (ca * 1) + ")"); g.addColorStop(0.5, "rgba(" + col + ", " + (ca * 0.5) + ")"); g.addColorStop(1, "rgba(" + col + ", " + (ca * 0) + ")"); return g; } } /* When want to use Angle and radian. */ class Angle { constructor(a) { this.a = a; this.rad = (this.a * Math.PI) / 180; } incDec(num) { this.a += num; this.rad = (this.a * Math.PI) / 180; } } /* variable for canvas. */ let canvas; let offCanvas; class Canvas { constructor(bool) { // create canvas. this.canvas = document.createElement("canvas"); // if on screen. if (bool === true) { this.canvas.style.position = 'relative'; this.canvas.style.display = 'block'; this.canvas.style.top = 0; this.canvas.style.left = 0; document.getElementsByTagName("body")[0].appendChild(this.canvas); } this.ctx = this.canvas.getContext("2d"); this.width = this.canvas.width = window.innerWidth; this.height = this.canvas.height = window.innerHeight; // size. this.width < 768 ? this.heartSize = 180 : this.heartSize = 250; // mouse infomation. this.mouseX = null; this.mouseY = null; // sprite array and quantity. this.hearts = []; this.offHeartNum = 1; this.offHearts = []; // offscreen data. this.data = null; } onInit() { let index = 0; for (let i = 0; i < this.height; i += 12) { for (let j = 0; j < this.width; j += 12) { let oI = (j + i * this.width) * 4 + 3; if (this.data[oI] > 0) { index++; const h = new Heart(canvas.ctx, j + Tool.randomNumber(-3, 3), i + Tool.randomNumber(-3, 3), Tool.randomNumber(6, 12), index); canvas.hearts.push(h); } } } } offInit() { for (let i = 0; i < this.offHeartNum; i++) { const s = new Heart(this.ctx, this.width / 2, this.height / 2.3, this.heartSize); this.offHearts.push(s); } for (let i = 0; i < this.offHearts.length; i++) { this.offHearts[i].offRender(i); } // data this.data = this.ctx.getImageData(0, 0, this.width, this.height).data; // on screen init. this.onInit(); } render() { this.ctx.clearRect(0, 0, this.width, this.height); for (let i = 0; i < this.hearts.length; i++) { this.hearts[i].render(i); } } resize() { this.offHearts = []; this.hearts = []; this.width = this.canvas.width = window.innerWidth; this.height = this.canvas.height = window.innerHeight; this.width < 768 ? this.heartSize = 180 : this.heartSize = 250; } } class Heart { constructor(ctx, x, y, r, i) { this.ctx = ctx; this.init(x, y, r, i); } init(x, y, r, i) { this.x = x; this.xi = x; this.y = y; this.yi = y; this.r = r; this.i = i * 0.5 + 200; this.l = this.i; this.c = Tool.randomColorHSL(Tool.randomNumber(-5, 5), 80, 60); this.a = new Angle(Tool.randomNumber(0, 360)); this.v = { x: Math.random(), y: -Math.random() }; this.ga = Math.random(); } draw() { const ctx = this.ctx; ctx.save(); ctx.globalCompositeOperation = 'lighter'; ctx.globalAlpha = this.ga; ctx.beginPath(); ctx.fillStyle = this.c; ctx.moveTo(this.x, this.y + this.r); ctx.bezierCurveTo( this.x - this.r - this.r / 5, this.y + this.r / 1.5, this.x - this.r, this.y - this.r, this.x, this.y - this.r / 5 ); ctx.bezierCurveTo( this.x + this.r, this.y - this.r, this.x + this.r + this.r / 5, this.y + this.r / 1.5, this.x, this.y + this.r ); ctx.closePath(); ctx.fill(); ctx.restore(); } updateParams() { this.a.incDec(1); Math.sin(this.a.rad) < 0 ? this.r = -Math.sin(this.a.rad) * 20 : this.r = Math.sin(this.a.rad) * 20; } updatePosition() { this.l -= 1; if (this.l < 0) { this.v.y -= 0.01; this.v.x += 0.02; this.y += this.v.y; this.x += this.v.x; } } wrapPosition() { if (this.x > canvas.width * 1.5) { this.init(this.xi, this.yi, Tool.randomNumber(6, 12), this.i); } } render() { this.wrapPosition(); this.updateParams(); this.updatePosition(); this.draw(); } offRender(i) { this.draw(); } } (function () { "use strict"; window.addEventListener("load", function () { offCanvas = new Canvas(false); canvas = new Canvas(true); offCanvas.offInit(); function render() { window.requestAnimationFrame(function () { canvas.render(); render(); }); } render(); // event window.addEventListener("resize", function () { canvas.resize(); offCanvas.resize(); offCanvas.offInit(); }, false); }); })();
粒子
时间
文字
hover
canvas
3d
游戏
音乐
火焰
水波
轮播图
鼠标跟随
动画
css
加载动画
导航
菜单
按钮
滑块
tab
弹出层
统计图
svg
×
Close
在线代码下载提示
开通在线代码永久免费下载,需支付20jQ币
开通后,在线代码模块中所有代码可终身免费下!
您已开通在线代码永久免费下载,关闭提示框后,点下载代码可直接下载!
您已经开通过在线代码永久免费下载
对不起,您的jQ币不足!可通过发布资源 或
直接充值获取jQ币
取消
开通下载
<!doctype html> <html> <head> <meta charset="utf-8"> <title>JavaScript心动画-jq22.com</title> <script src="https://www.jq22.com/jquery/jquery-1.10.2.js"></script> <style>
</style> </head> <body>
<script>
</script>
</body> </html>
2012-2021 jQuery插件库版权所有
jquery插件
|
jq22工具库
|
网页技术
|
广告合作
|
在线反馈
|
版权声明
沪ICP备13043785号-1
浙公网安备 33041102000314号