<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>绘图板</title> <style> body { margin: 0; padding: 0; } </style> </head> <body> <button onclick="setCanvasType('pen')">笔</button> <button onclick="setCanvasType('eraser')">橡皮擦</button> <button onclick="setColor('#ff0000')">红色</button> <button onclick="setCanvasType('circle')">圆形</button> <canvas id="canvas">您的浏览器不支持canvas</canvas> <script> window.onload = function () { let canvas = document.getElementById('canvas') canvas.height = window.innerHeight canvas.width = window.innerWidth let ctx = canvas.getContext('2d') let canvasType = 'pen' let draw = false let lastX, lastY window.addEventListener('mousemove', e => { if (draw) { switch (canvasType) { case 'pen': penDraw(e.x, e.y) break; case 'circle': // circleDraw(e.x, e.y) break; case 'eraser': eraserDraw(e.x, e.y) break; default: break; } } }) function penDraw(x, y) { ctx.lineTo(x, y) ctx.stroke() } function circleDraw(x, y) { let circleX, circleY, r circleX = Math.round(Math.abs(x + lastX) / 2) circleY = Math.round(Math.abs(y + lastY) / 2) //勾股定理 r = Math.round(Math.sqrt(Math.pow(Math.abs(x - lastX), 2) + Math.pow(Math.abs(y - lastY), 2)) / 2) console.log(circleX, circleY, r) ctx.beginPath(); ctx.arc(circleX, circleY, r, 0, Math.PI * 2, true); ctx.closePath(); ctx.fill(); } let a = 50 function eraserDraw(x, y) { ctx.save() ctx.beginPath() ctx.arc(x, y, a, 0, 2 * Math.PI); ctx.clip() ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.restore(); } canvas.addEventListener('mousedown', e => { ctx.moveTo(e.x, e.y) if (canvasType === 'circle') { lastX = e.x lastY = e.y } draw = true }) canvas.addEventListener('mouseup', e => { draw = false if (canvasType == 'circle') { circleDraw(e.x, e.y) lastX = null lastY = null } }) setCanvasType = function (e) { canvasType = e } setColor = function (color) { if (canvasType !== 'pen') { canvasType = 'pen' } ctx.strokeStyle = color } } </script> </body> </html>