Toggle navigation
在线编辑器
在线代码
文本比较
jQuery下载
前端库
在线手册
登录/注册
下载代码
html
css
js
分享到微信朋友圈
X
html
css
html, body { position: absolute; overflow: hidden; margin: 0; padding: 0; width: 100%; height: 100%; background:#000; touch-action: none; content-zooming: none; } canvas { position: absolute; width: 100%; height: 100%; background:#000; }
JavaScript
"use strict"; { // particles class class Particle { constructor(k, i, j) { this.i = i; this.j = j; this.init(); this.x = this.x0; this.y = this.y0; this.pos = posArray.subarray(k * 3, k * 3 + 3); this.pointer = pointer; } init() { this.x0 = canvas.width * 0.5 + this.i * canvas.width / 240; this.y0 = canvas.height * 0.5 + this.j * canvas.height / 160; } move() { const dx = this.pointer.x - this.x; const dy = this.pointer.y - this.y; const d = Math.sqrt(dx * dx + dy * dy); const s = 1000 / d; this.x += -s * (dx / d) + (this.x0 - this.x) * 0.02; this.y += -s * (dy / d) + (this.y0 - this.y) * 0.02; // update buffer position this.pos[0] = this.x; this.pos[1] = this.y; this.pos[2] = 0.15 * s * s; } } // webGL canvas const canvas = { init(options) { // set webGL context this.elem = document.querySelector("canvas"); const gl = (this.gl = this.elem.getContext("webgl", options) || this.elem.getContext("experimental-webgl", options)); if (!gl) return false; // compile shaders const vertexShader = gl.createShader(gl.VERTEX_SHADER); gl.shaderSource( vertexShader, ` precision highp float; attribute vec3 aPosition; uniform vec2 uResolution; void main() { gl_PointSize = max(2.0, min(30.0, aPosition.z)); gl_Position = vec4( ( aPosition.x / uResolution.x * 2.0) - 1.0, (-aPosition.y / uResolution.y * 2.0) + 1.0, 0.0, 1.0 ); } ` ); gl.compileShader(vertexShader); const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); gl.shaderSource( fragmentShader, ` precision highp float; void main() { vec2 pc = 2.0 * gl_PointCoord - 1.0; gl_FragColor = vec4(1.0, 0.85, 0.25, 1.0 - dot(pc, pc)); } ` ); gl.compileShader(fragmentShader); const program = (this.program = gl.createProgram()); gl.attachShader(this.program, vertexShader); gl.attachShader(this.program, fragmentShader); gl.linkProgram(this.program); gl.useProgram(this.program); // resolution this.uResolution = gl.getUniformLocation(this.program, "uResolution"); gl.enableVertexAttribArray(this.uResolution); // canvas resize this.resize(); window.addEventListener("resize", () => this.resize(), false); return gl; }, resize() { this.width = this.elem.width = this.elem.offsetWidth; this.height = this.elem.height = this.elem.offsetHeight; for (const p of particles) p.init(); this.gl.uniform2f(this.uResolution, this.width, this.height); this.gl.viewport( 0, 0, this.gl.drawingBufferWidth, this.gl.drawingBufferHeight ); } }; const pointer = { init(canvas) { this.x = 0.1 + canvas.width * 0.5; this.y = canvas.height * 0.5; this.s = 0; ["mousemove", "touchstart", "touchmove"].forEach((event, touch) => { document.addEventListener( event, e => { if (touch) { e.preventDefault(); this.x = e.targetTouches[0].clientX; this.y = e.targetTouches[0].clientY; } else { this.x = e.clientX; this.y = e.clientY; } }, false ); }); } }; // init webGL canvas const particles = []; const gl = canvas.init({ alpha: false, stencil: true, antialias: true, depth: false }); // additive blending "lighter" gl.blendFunc(gl.SRC_ALPHA, gl.ONE); gl.enable(gl.BLEND); // init pointer pointer.init(canvas); // init particles const nParticles = 240 * 80; const posArray = new Float32Array(nParticles * 3); let k = 0; for (let i = -120; i < 120; i++) { for (let j = -40; j < 40; j++) { particles.push(new Particle(k++, i, j)); } } // create position buffer const aPosition = gl.getAttribLocation(canvas.program, "aPosition"); gl.enableVertexAttribArray(aPosition); const positionBuffer = gl.createBuffer(); // draw all particles const draw = () => { gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer); gl.vertexAttribPointer(aPosition, 3, gl.FLOAT, false, 0, 0); gl.bufferData( gl.ARRAY_BUFFER, posArray, gl.DYNAMIC_DRAW ); gl.drawArrays(gl.GL_POINTS, 0, nParticles); } // main animation loop const run = () => { requestAnimationFrame(run); for (const p of particles) p.move(); draw(); }; requestAnimationFrame(run); }
粒子
时间
文字
hover
canvas
3d
游戏
音乐
火焰
水波
轮播图
鼠标跟随
动画
css
加载动画
导航
菜单
按钮
滑块
tab
弹出层
统计图
svg
×
Close
在线代码下载提示
开通在线代码永久免费下载,需支付20jQ币
开通后,在线代码模块中所有代码可终身免费下!
您已开通在线代码永久免费下载,关闭提示框后,点下载代码可直接下载!
您已经开通过在线代码永久免费下载
对不起,您的jQ币不足!可通过发布资源 或
直接充值获取jQ币
取消
开通下载
<!doctype html> <html> <head> <meta charset="utf-8"> <title>canvas粒子动画-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号