canvas实现鼠标跟随可交互的波浪线动画i效果代码
代码语言:html
所属分类:动画
代码描述:canvas实现鼠标跟随可交互的波浪线动画i效果代码
代码标签: canvas 鼠标 跟随 可 交互 波浪 线 动画i
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <style> body { width: 100vw; height: 100vh; background: #f40c3f; } a-waves { --x: -0.5rem; --y: 50%; position: absolute; top: 0; left: 0; margin: 0; padding: 0; width: 100%; height: 100%; overflow: hidden; } a-waves:before { position: absolute; top: 0; left: 0; width: 0.5rem; height: 0.5rem; background: #160000; border-radius: 50%; transform: translate3d(calc(var(--x) - 50%), calc(var(--y) - 50%), 0); will-change: transform; content: ""; } a-waves canvas { display: block; width: 100%; height: 100%; } </style> </head> <body translate="no"> <a-waves> <canvas class="js-canvas"></canvas> </a-waves> <script > class Noise { constructor(seed = 0) { this.grad3 = [ new Grad(1, 1, 0), new Grad(-1, 1, 0), new Grad(1, -1, 0), new Grad(-1, -1, 0), new Grad(1, 0, 1), new Grad(-1, 0, 1), new Grad(1, 0, -1), new Grad(-1, 0, -1), new Grad(0, 1, 1), new Grad(0, -1, 1), new Grad(0, 1, -1), new Grad(0, -1, -1) ]; this.p = [151,160,137,91,90,15, 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23, 190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33, 88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166, 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244, 102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196, 135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123, 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42, 223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9, 129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228, 251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107, 49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254, 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180]; this.perm = new Array(512); this.gradP = new Array(512); this.seed(seed); } /** * Seed function */ seed(seed) { if(seed > 0 && seed < 1) { seed *= 65536; } seed = Math.floor(seed); if(seed < 256) { seed |= seed << 8; } for(let i = 0; i < 256; i++) { let v; if(i & 1) { v = this.p[i] ^ (seed & 255); } else { v = this.p[i] ^ ((seed>>8) & 255); } this.perm[i] = this.perm[i + 256] = v; this.gradP[i] = this.gradP[i + 256] = this.grad3[v % 12]; } } /** * Fade function */ fade(t) { return t * t * t * (t * (t * 6 - 15) + 10); } /** * Lerp function */ lerp(a, b, t) { return (1 - t) * a + t * b; } /** * Perlin 2D noise */ perlin2(x, y) { let X = Math.floor(x); let Y = Math.floor(y); x -= X; y -= Y; X = X & 255; Y = Y & 255; const n00 = this.gradP[X + this.perm[Y]].dot2(x, y); const n01 = this.gradP[X + this.perm[Y + 1]].dot2(x, y - 1); const n10 = this.gradP[X + 1 + this.perm[Y]].dot2(x - 1, y); const n11 = this.gradP[X + 1 + this.perm[Y + 1]].dot2(x - 1, y - 1); const u = this.fade(x); return this.lerp(this.lerp(n00, n10, u), this.lerp(n01, n11, u), this.fade(y)); } } class Grad { constructor(x, y, z) { this.x = x; this.y = y; this.z = z; } dot2(x, y) { return this.x * x + this.y * y; } dot3(x, y, z) { return this.x * x + this.y * y + this.z * z; } } class AWaves extends HTMLElement { /** * Init */ connectedCallback() { // Elements this.canvas = this.querySelector(".js-canvas"); this.ctx = this.canvas.getContext("2d"); // Properties this.mouse = { x: -10, y: 0, lx: 0, ly: 0, sx: 0, sy: 0, v: 0, vs: 0, a: 0, set: false }; this.lines = []; this.noise = new Noise(Math.random()); // Init this.setSize(); this.setLines(); this.bindEvents(); // RAF requestAnimationFrame(this.tick.bind(this)); } /** * Bind events */ bindEvents() { window.addEventListener("resize", this.onResize.bind(this)); window.addEventListener("mousemove", this.onMouseMove.bind(this)); this.addEventListener("touchmove", this.onTouchMove.bind(this)); } /** * Resize handler */ onResize() { this.setSize(); this.setLines(); } /** * Mouse handler */ onMouseMov.........完整代码请登录后点击上方下载按钮下载查看
网友评论0