js实现在画布上拖拽绘制元素
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
button.active{
color: #fff;
background-color: blue;
}
#canv{
width: 800px;
height: 600px;
border: 1px solid black;
}
</style>
</head>
<body>
<div style="text-align:center;">
<canvas id="canv" width="800px" height="600px"></canvas>
</div>
</body>
<script>
const canvas = document.querySelector('#canv')
const ctx = canvas.getContext('2d');
const statusConfig = {
IDLE:0,
DRAG_START:1,
DRAGGING:2,
}
const canvasInfo={
status:statusConfig.IDLE,
dragTarget :null,
lastEvtPos:{x:null,y:null},
}
const circles = []
const getDistance=(p1,p2) =>{
return Math.sqrt((p1.x-p2.x)**2+(p1.y-p2.y)**2)
}
const ifInCircle=(pos)=>{
for(let i =0;i<circles.length;i++){
if(getDistance(circles[i],pos)<circles[i].r)
{
return circles[i]
}
}
return false
}
const drawCircle = (ctx,cx,cy,r)=>{
ctx.save()
ctx.beginPath();
ctx.strokeStyle='blue';
ctx.arc(cx,cy,r,0,Math.PI*2)
ctx.stroke()
ctx.closePath();
ctx.restore();
}
drawCircle(ctx,100,100,50)
circles.push({
x:100,
y:100,
r:50,
})
drawCircle(ctx,100,100,50)
circles.push({
x:200,
y:200,
r:100,
})
drawCircle(ctx,200,200,100)
const getCanvasPosition=e=>{
return {
x:e.offsetX,
y:e.offsetY,
}
}
canvas.addEventListener('mousedown',e=>{
const canvasPostion = getCanvasPosition(e)
const circleRef = ifInCircle(canvasPostion)
if(circleRef){
canvasInfo.dragTarget = circleRef
canvasInfo.status = statusConfig.DRAG_START
canvasInfo.lastEvtPos = canvasPostion
}
})
canvas.addEventListener('mousemove',e=>{
const canvasPostion = getCanvasPosition(e)
if(canvasInfo.status == statusConfig.DRAG_START && getDistance(canvasPostion,canvasInfo.lastEvtPos) >5 ){
console.log('try to drag')
canvasInfo.status = statusConfig.DRAGGING
}else if(canvasInfo.status === statusConfig.DRAGGING){
console.log('dragging')
const { dragTarget} = canvasInfo
dragTarget.x = canvasPostion.x
dragTarget.y = canvasPostion.y
ctx.clearRect(0, 0, canvas.width, canvas.height);
circles.forEach(c=>drawCircle(ctx,c.x,c.y,c.r))
}
})
canvas.addEventListener('mouseup',e=>{
if(canvasInfo.status === statusConfig.DRAGGING){
canvasInfo.status = statusConfig.IDLE
}
})
</script>
</html>