Toggle navigation
在线编辑器
在线代码
文本比较
jQuery下载
前端库
在线手册
登录/注册
下载代码
html
css
js
分享到微信朋友圈
X
html
css
canvas, body { width: 100%; height: 100%; margin: 0; background-color: black; overflow: hidden; } img { visibility: hidden; display: none; } footer { color: white; position: fixed; bottom: 0; left: 0; padding: 15px; font-family: "Helvetica", "Roboto", "Sans"; } footer a { color: white; font-family: "Helvetica", "Roboto", "Sans"; }
JavaScript
const canvas = document.querySelector("canvas"); const context = canvas.getContext("2d"); const img = document.querySelector("img"); let built = false; let pixels = []; const config = { strength: 2000, easeFactor: 0.1, glow: true, stats: false, pxSize: 15 }; const mousePosition = { x: 0, y: 0 }; function resize() { canvas.width = window.innerWidth; canvas.height = window.innerHeight; buildPixelData(); } function draw() { context.clearRect(0, 0, canvas.width, canvas.height); stats.begin(); if (!built) { this.buildPixelData(); } for (let i = 0; i < pixels.length; i++) { const pixel = pixels[i]; const deltaX = pixel.x - mousePosition.x; const deltaY = pixel.y - mousePosition.y; const angle = Math.atan2(deltaY, deltaX); let distance = config.strength / Math.sqrt(deltaX * deltaX + deltaY * deltaY); if (config.glow) { pixel.r += distance; pixel.g += distance; pixel.b += distance; pixel.r += (pixel.or - pixel.r) * config.easeFactor; pixel.g += (pixel.og - pixel.g) * config.easeFactor; pixel.b += (pixel.ob - pixel.b) * config.easeFactor; context.fillStyle = `rgb(${pixel.r}, ${pixel.g}, ${pixel.b})`; } else { context.fillStyle = `rgb(${pixel.or}, ${pixel.og}, ${pixel.ob})`; } pixel.x += Math.cos(angle) * distance; pixel.y += Math.sin(angle) * distance; pixel.x += (pixel.ox - pixel.x) * config.easeFactor; pixel.y += (pixel.oy - pixel.y) * config.easeFactor; context.beginPath(); context.arc(pixel.x, pixel.y, pixel.size / 2, 0, Math.PI * 2); context.fill(); } stats.end(); window.requestAnimationFrame(draw); } function getPixels() { const data = context.getImageData(0, 0, img.width, img.height); const pxs = []; for (let x = 0; x < data.width; x += config.pxSize) { for (let y = 0; y < data.height; y += config.pxSize) { let index = x * 4 + y * 4 * img.width; let alpha = data.data[index + 3]; if (alpha > 0) { pxs.push({ x: canvas.width / 2 - img.width / 2 + x, y: canvas.height / 2 - img.height / 2 + y, ox: canvas.width / 2 - img.width / 2 + x, oy: canvas.height / 2 - img.height / 2 + y, size: config.pxSize, oSize: config.pxSize, r: data.data[index], g: data.data[index + 1], b: data.data[index + 2], or: data.data[index], og: data.data[index + 1], ob: data.data[index + 2], rgb: "rgb(" + data.data[index] + "," + data.data[index + 1] + "," + data.data[index + 2] + ")" }); } } } return pxs; } function buildPixelData() { if(img.width === 0 || img.height === 0){ return; } context.clearRect(0, 0, canvas.width, canvas.height); context.drawImage(img, 0, 0); pixels = []; pixels = getPixels(); context.clearRect(0, 0, canvas.width, canvas.height); if (pixels.length > 0) { built = true; } } function buildGUI() { const gui = new dat.GUI({ closed: true }); gui.closed = true; gui.add(config, "strength", 0, 7000); gui.add(config, "easeFactor", 0.05, 0.2); gui.add(config, "glow"); const sizeController = gui.add(config, "pxSize", 8, 80, 1); const statsController = gui.add(config, "stats"); sizeController.onFinishChange(() => { buildPixelData(); }); statsController.onChange(value => { if (value) { document.body.appendChild(stats.dom); } else { stats.dom.parentNode.removeChild(stats.dom); } }); } function onMouseMove(event) { mousePosition.x = event.clientX; mousePosition.y = event.clientY; } function touchMoveHandler(event) { mousePosition.x = event.touches[0].clientX; mousePosition.y = event.touches[0].clientY; } const stats = new Stats(); stats.showPanel(0); window.addEventListener("DOMContentLoaded", event => { buildGUI(); resize(); window.addEventListener("mousemove", onMouseMove); window.addEventListener("touchmove", touchMoveHandler); window.addEventListener("resize", resize); window.requestAnimationFrame(draw); });
粒子
时间
文字
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号