<!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>
网友回复
DLNA与UPnP的区别和不同?
苏超自建抢票app,通过先预约再抽签化解高并发抢票?
python如何让给电脑在局域网中伪装成电视接收手机的投屏图片视频播放?
如何结合python+js如何自己的视频编码与加密播放直播?
python如何在电脑上通过局域网将本地视频或m3u8视频投屏电视播放?
腾讯视频爱奇艺优酷vip电影电视剧视频如何通过python绕过vip收费直接观看?
有没有可免费观看全球电视台直播m3u8地址url的合集?
有没有实现观影自由的免vip影视苹果 CMS V10 API的可用url?
python如何实时检测电脑usb插入检测报警?
如何判断真人操作的鼠标移动直线轨迹与机器操作的轨迹?