一个基于 canvas 的画板
虽然我自己的定位是做后端的,但技术主管强调要搞全栈,因此工作中也要写一些前端页面。一个产品经理找我写个画板,他更不会管我的技术定位了。目标是做个画板,具有以下功能: 可以更改画笔颜色、粗细,能擦除绘图 撤销绘图 设置画板背景色 将画板保存成图片 demo见: drawing_board 。最后的效果长这样: 所有的实现以及遇到的问题,都可以在网上找到。这里做一个总结。 画笔粗细、颜色 粗细通过 ctx.lineWidth 设置;颜色要设置 ctx.strokeStyle 和 ctx.fillStyle 这两个参数才行。 橡皮功能 ctx.globalCompositeOperation 的默认值是 "source-over" ,这时可以正常绘制图形。将其改成 "destination-out" ,这时画笔可将绘制的线条擦除。橡皮其他部分与画笔的逻辑一样,因此代码可以复用。更改 lineWidth 便可调节橡皮大小。有的实现中直接将画笔的颜色改成画板的背景色,以此达到“擦除”的效果。但画板默认是透明的,这种错误实现会导致在输出的图片有问题。 撤回功能 想要撤回就要记住历史状态。将每次画下的图形数据粗暴地存储在一个数组中,撤销时将数组最后一个元素设置为 canvas 的图形数据即可。注意这里每次记录的都是完整的数据,而不是像 git 一样记录每次的修改,因此不能无限制地记录绘画历史