基础画图应用核心是通过mousedown、mousemove、mouseup事件配合canvas 2D上下文实现路径绘制:按下设isDrawing为true并记录起点,移动时转换坐标并连线,抬起时停止;支持笔、线、矩形、圆等工具切换,并可扩展颜色、粗细、撤销等功能。

用 javaScript 实现一个基础画图应用,核心在于监听鼠标事件、获取坐标、在 canvas 上实时绘制路径。关键不是“画什么”,而是“怎么把鼠标的移动变成可视的线条”——这靠 mousedown、mousemove、mouseup 三者配合,再结合 Canvas 的 2D 绘图上下文。
监听鼠标按下和抬起,控制绘制开关
用户只有按住鼠标时才该画画,松开就停止。所以不能一动就画,得先判断是否处于“绘画中”状态。
- 用一个布尔变量(如
isDrawing = false)标记当前是否在绘图 -
mousedown触发时设为true,并记录起点坐标(用于后续线段起始) -
mouseup或mouseout触发时设为false,避免鼠标移出画布还继续画
捕获鼠标移动轨迹,实时绘制线段
在 mousemove 中,只要 isDrawing 为真,就从上一个点画到当前点。注意:直接用 clientX/clientY 得到的是页面坐标,需转换为 Canvas 坐标。
- 用
canvas.getBoundingClientRect()获取画布在视口中的位置 - 计算真实坐标:
x = e.clientX - rect.left,y = e.clientY - rect.top - 调用
ctx.beginPath()→ctx.moveTo(prevX, prevY)→ctx.lineTo(x, y)→ctx.stroke() - 每次画完更新
prevX和prevY为当前坐标,作为下一段的起点
支持不同图形(直线、矩形、圆形)的简易切换
不只画自由线条,还可扩展为选择工具模式。比如用一个变量 currentTool = 'pen' 控制行为:
立即学习“Java免费学习笔记(深入)”;
-
'pen':按前述方式连续画线 -
'line':mousedown记起点,mousemove临时画预览线(清空再重画),mouseup确认画最终线 -
'rect':类似,用ctx.rect(x, y, width, height),宽高由起点和当前点算出(取绝对值) -
'circle':半径为起点到当前点距离,圆心是起点,用arc()绘制
优化体验的小细节
原生 Canvas 不自带撤销、颜色、粗细等,但加几行就能提升可用性:
- 用
ctx.lineWidth、ctx.strokeStyle控制笔触粗细和颜色 - 开启抗锯齿:
ctx.lineCap = 'round'、ctx.lineJoin = 'round'让线条更顺滑 - 移动端需额外监听
touchstart/touchmove/touchend,逻辑一致,只是事件对象里取touches[0]坐标 - 若要支持撤销,可把每次完整操作(如一条线、一个矩形)存入数组,重绘整个画布即可回退
基本上就这些。不需要框架,纯 html + Canvas + 原生事件就能跑起来。重点是理清“状态管理”(画/不画)、“坐标转换”、“增量绘制”三个环节。