<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Canvas拖动方块</title> </head> <body> <canvas id="canvas" width="500" height="500" style="border:1px solid red;"></canvas> <script> const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); let startX, startY; let isDrawing = false; const rects = []; let selectedSquare = null; let offsetX, offsetY; function findSquare(x, y) { for (let i = rects.length - 1; i >= 0; i--) { const square = rects[i]; if (x >= square.x && x <= square.x + square.w && y >= square.y && y <= square.y + square.h) { return square; } } return null; } canvas.addEventListener('mousedown', (e) => { const mouseX = e.clientX - canvas.getBoundingClientRect().left; const mouseY = e.clientY - canvas.getBoundingClientRect().top; selectedSquare = findSquare(mouseX, mouseY); if (selectedSquare) { console.log("drag start"); offsetX = mouseX - selectedSquare.x; offsetY = mouseY - selectedSquare.y; }else{ startX = e.offsetX; startY = e.offsetY; isDrawing = true; } }); canvas.addEventListener('mousemove', (e) => { if (selectedSquare) { console.log("drag"); const mouseX = e.clientX - canvas.getBoundingClientRect().left; const mouseY = e.clientY - canvas.getBoundingClientRect().top; selectedSquare.x = mouseX - offsetX; selectedSquare.y = mouseY - offsetY; }else{ if(!isDrawing) return; const x = e.offsetX; const y = e.offsetY; const w = x - startX; const h = y - startY; drawRect(startX, startY, w, h); } }); canvas.addEventListener('mouseup', (e) => { if(selectedSquare){ selectedSquare = null; }else{ isDrawing = false; rects.push({ x: startX, y: startY, w: e.offsetX - startX, h: e.offsetY - startY }); } }); function drawRect(x, y, w, h) { ctx.beginPath(); ctx.rect(x, y, w, h); ctx.fill(); } function update() { ctx.clearRect(0, 0, canvas.width, canvas.height); for(let rect of rects) { drawRect(rect.x, rect.y, rect.w, rect.h); } requestAnimationFrame(update); } update(); </script> </body> </html>
网友回复
python如何实现torrent的服务端进行文件分发p2p下载?
如何在浏览器中录制摄像头和麦克风数据为mp4视频保存下载本地?
go如何编写一个类似docker的linux的虚拟容器?
python如何写一个bittorrent的种子下载客户端?
ai能通过看一个网页的交互过程视频自主模仿复制网页编写代码吗?
ai先写功能代码通过chrome mcp来进行测试功能最后ai美化页面这个流程能行吗?
vue在手机端上下拖拽元素的时候如何禁止父元素及body的滚动导致无法拖拽完成?
使用tailwindcss如何去掉响应式自适应?
有没有直接在浏览器中运行的离线linux系统?
nginx如何保留post或get数据进行url重定向?