您现在的位置是:网站首页> 编程资料编程资料
手把手教你实现一个canvas智绘画板的方法JavaScript+Canvas实现自定义画板的示例代码几何画板怎么利用弧绘制三角形折叠?几何画板怎么制作旋转的正六边形课件?几何画板怎么一只飞舞的蝴蝶动画?ai怎么设置画板属性? ai画板设置属性的教程金排物理画板 V2019 中文免费安装版socket.io 和canvas 实现的共享画板功能
2023-10-08
355人已围观
简介 这篇文章主要介绍了手把手教你实现一个canvas智绘画板的方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
本文主要介绍:
- 项目介绍
- 项目效果展示
- 一步步实现项目效果
- 踩坑
一、项目介绍
名称:智绘画板
技术栈:HTML5,CSS3,JavaScript,移动端
功能描述:
- 支持PC端和移动端在线绘画功能
- 实现任意选择画笔颜色、调整画笔粗细以及橡皮檫擦除等绘画功能
- 实现在线画板的本地保存功能
- 支持撤销和返回操作
- 自定义背景颜色
二、项目效果展示
预览图
PC端的预览图:

移动端的预览图:

看完上面的预览图和体验过 智绘画板 觉得还可以的,记得点个赞哦,不管你是否十分激动,反正我是挺激动的,毕竟自己实现出现的项目效果,挺自豪的,说了一堆废话,下面就可以动起手来敲代码,实现自己想要的效果!!!
注:下面实现项目效果主要是关于JavaScript方面的,下面仅仅是提供 实现思路的代码 , 并非全部代码 。
三、一步步实现项目效果
(一)分析页面
通过 用例图 ,我们知道用户进入我们这个网站有哪些功能?
用户可以进行的操作:
- 画画
- 改变画笔的粗细
- 切换画笔的颜色
- 使用橡皮檫擦除不想要的部分
- 清空画板
- 将自己画的东西保存成图片
- 进行撤销和重做操作
- 切换画板背景颜色
- 兼容移动端(支持触摸)
(二)进行HTML布局
我书写html的同时,引入了css文件和js文件
智绘画板 选择背景颜色:
笔大小
笔颜色
不透明度
(三)用CSS美化界面
css代码可以根据个人习惯进行美化界面,所以这里就不写css的代码了,大家可以直接看 项目代码 或者从开发者工具中审查元素观看。如果有问题可以私聊我,我觉得问题不大。
(四)使用JS实现项目的具体功能
1.准备工作
首先,准备个容器,也就是画板了,前面的html已经书写好这个容器,这里纯属是废话。
然后初始化js
let canvas = document.getElementById('canvas'); let context = canvas.getContext('2d');我打算把画板做成全屏的,所以接下来设置一下 canvas 的宽高
let pageWidth = document.documentElement.clientWidth; let pageHeight = document.documentElement.clientHeight; canvas.width = pageWidth; canvas.height = pageHeight;
由于部分IE不支持 canvas ,如果要兼容IE,我们可以创建一个 canvas ,然后使用 excanvas 初始化,针对IE加上exCanvas.js,这里我们明确不考虑IE。
但是我在电脑上对浏览器的窗口进行改变,画板不会自适应的放缩。解决办法:
// 记得要执行autoSetSize这个函数哦 function autoSetSize(){ canvasSetSize(); // 当执行这个函数的时候,会先设置canvas的宽高 function canvasSetSize(){ let pageWidth = document.documentElement.clientWidth; let pageHeight = document.documentElement.clientHeight; canvas.width = pageWidth; canvas.height = pageHeight; } // 在窗口大小改变之后,就会触发resize事件,重新设置canvas的宽高 window.onresize = function(){ canvasSetSize(); } }2.实现画画的功能
实现思路:监听鼠标事件, 用 drawLine() 方法把记录的数据画出来。
- 初始化当前画板的画笔状态,
painting = false。 - 当鼠标按下时(
mousedown),把painting设为true,表示正在画,鼠标没松开。把鼠标点记录下来。 - 当按下鼠标的时候,鼠标移动(
mousemove)就 把点记录 下来并画出来。 如果鼠标移动过快,浏览器跟不上绘画速度,点与点之间会出现间隙,所以我们需要将画出的点用线连起来(lineTo())。 - 鼠标松开的时候(
mouseup),把painting设为false。
注: drawCircle 这个方法其实可以不用书写,这个只是为了让大家能够理解开始点击的位置在哪里?
function listenToUser() { // 定义一个变量初始化画笔状态 let painting = false; // 记录画笔最后一次的位置 let lastPoint = {x: undefined, y: undefined}; // 鼠标按下事件 canvas.onmousedown = function(e){ painting = true; let x = e.clientX; let y = e.clientY; lastPoint = {'x':x,'y':y}; drawCircle(x,y,5); } // 鼠标移动事件 canvas.onmousemove = function(e){ if(painting){ let x = e.clientX; let y = e.clientY; let newPoint = {'x':x,'y':y}; drawLine(lastPoint.x, lastPoint.y, newPoint.x, newPoint.y); lastPoint = newPoint; } } // 鼠标松开事件 canvas.onmouseup = function(){ painting = false; } } // 画点函数 function drawCircle(x,y,radius){ // 新建一条路径,生成之后,图形绘制命令被指向到路径上生成路径。 context.beginPath(); // 画一个以(x,y)为圆心的以radius为半径的圆弧(圆), // 从startAngle开始到endAngle结束,按照anticlockwise给定的方向(默认为顺时针)来生成。 context.arc(x,y,radius,0,Math.PI*2); // 通过填充路径的内容区域生成实心的图形 context.fill(); // 闭合路径之后图形绘制命令又重新指向到上下文中。 context.closePath(); } function drawLine(x1,y1,x2,y2){ // 设置线条宽度 context.lineWidth = 10; // 设置线条末端样式。 context.lineCap = "round"; // 设定线条与线条间接合处的样式 context.lineJoin = "round"; // moveTo(x,y)将笔触移动到指定的坐标x以及y上 context.moveTo(x1,y1); // lineTo(x, y) 绘制一条从当前位置到指定x以及y位置的直线 context.lineTo(x2,y2); // 通过线条来绘制图形轮廓 context.stroke(); context.closePath(); }3.实现橡皮擦功能
实现思路:
- 获取橡皮擦元素
- 设置橡皮擦初始状态,
eraserEnabled = false。 - 监听橡皮擦
click事件,点击橡皮擦,改变橡皮擦状态,eraserEnabled = true,并且切换class,实现 被激活 的效果。 eraserEnabled为true时,移动鼠标用context.clearRect()实现了 橡皮檫。
但是我发现canvas的API中,可以清除像素的就是clearRect方法,但是clearRect方法的清除区域矩形,毕竟大部分人的习惯中的橡皮擦都是圆形的,所以就引入了剪辑区域这个强大的功能,也就是clip方法。下面的代码是使用 context.clearRect() 实现了 橡皮檫。请看踩坑部分,了解如何更好的实现橡皮檫。
let eraser = document.getElementById("eraser"); let eraserEnabled = false; // 记得要执行listenToUser这个函数哦 function listenToUser() { // ... 代表省略了之前写的代码 // ... // 鼠标按下事件 canvas.onmousedown = function(e){ // ... if(eraserEnabled){//要使用eraser context.clearRect(x-5,y-5,10,10) }else{ lastPoint = {'x':x,'y':y} } } // 鼠标移动事件 canvas.onmousemove = function(e){ let x = e.clientX; let y = e.clientY; if(!painting){return} if(eraserEnabled){ context.clearRect(x-5,y-5,10,10); }else{ var newPoint = {'x':x,'y':y}; drawLine(lastPoint.x, lastPoint.y,newPoint.x, newPoint.y); lastPoint = newPoint; } } // ... } // 点击橡皮檫 eraser.onclick = function(){ eraserEnabled = true; eraser.classList.add('active'); brush.classList.remove('active'); }4.实现清屏功能
实现思路:
获取元素节点。
点击清空按钮清空canvas画布。
let reSetCanvas = document.getElementById("clear"); // 实现清屏 reSetCanvas.onclick = function(){ ctx.clearRect(0,0,canvas.width,canvas.height); setCanvasBg('white'); } // 重新设置canvas背景颜色 function setCanvasBg(color) { ctx.fillStyle = color; ctx.fillRect(0, 0, canvas.width, canvas.height); }5.实现保存成图片功能
实现思路:
- 获取canvas.toDateURL
- 在页面里创建并插入一个a标签
- a标签href等于canvas.toDateURL,并添加download属性
- 点击保存按钮,a标签触发click事件
let save = document.getElementById("save"); // 下载图片 save.onclick = function(){ let imgUrl = canvas.toDataURL('image/png'); let saveA = document.createElement('a'); document.body.appendChild(saveA); saveA.href = imgUrl; saveA.download = 'mypic'+(new Date).getTime(); saveA.target = '_blank'; saveA.click(); }6.实现改变背景颜色的功能
实现思路:
- 获取相应的元素节点。
- 给每一个class为bgcolor-item的标签添加点击事件,当点击事件触发时,改变背景颜色。
- 点击设置背景颜色的div之外的地方,实现隐藏那个div。
let selectBg = document.querySelector('.bg-btn'); let bgGroup = document.querySelector('.color-group'); let bgcolorBtn = document.querySelectorAll('.bgcolor-item'); let penDetail = document.getElementById("penDetail"); let activeBgColor = '#fff'; // 实现了切换背景颜色 for (let i = 0; i < bgcolorBtn.length; i++) { bgcolorBtn[i].onclick = function (e) { // 阻止冒泡 e.stopPropagation(); for (let i = 0; i < bgcolorBtn.length; i++)
相关内容
- 详解h5页面在不同ios设备上的问题总结浅谈Html5移动端ios/Android兼容性总结详解移动端HTML5页面端去掉input输入框的白色背景和边框(兼容Android
- 小程序瀑布流解决左右两边高度差距过大的问题html5实现点击弹出图片功能html5 录制mp3音频支持采样率和比特率设置html5表单的required属性使用html5调用摄像头实例代码HTML5页面音频自动播放的实现方式Html5大屏数据可视化开发的实现html实现弹窗的实例HTML5来实现本地文件读取和写入的实现方法HTML 罗盘式时钟的实现HTML5简单实现添加背景音乐的几种方法
- h5网页水印SDK的实现代码示例前端canvas水印快速制作(附完整代码)手摸手教你用canvas实现给图片添加平铺水印的实现html5 canvas实现给图片添加平铺水印canvas 下载二维码和图片加水印的方法清除网页文字水印的两种简单方法前端水印的简单实现代码示例
- html5中canvas图表实现柱状图的示例基于HTML5 Canvas的3D动态Chart图表的示例canvas如何绘制钟表的方法
- 浅谈HTML5 FileReader分布读取文件以及其方法简介HTML与XHTML、以及HTML4与HTML5标签之间的区别简介HTML5的一个显示电池状态的API简介HTML5是什么 HTML5是什么意思 HTML5简介HTML5安全介绍之内容安全策略(CSP)简介HTML5的标签的代码的简单介绍 HTML5标签的简介html5新增的定时器requestAnimationFrame实现进度条功能HTML5新增加的功能详解iPhone5和iOS6上HTML5开发的新增功能html5简介及新增功能介绍
- 如何避免常见的6种HTML5错误用法html5各种页面切换效果和模态对话框用法总结HTML5中drawImage用法分析HTML5 embed标签定义和用法详解HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常html5基础标签(html5视频标签 html5新标签用法)html5跨域通讯之postMessage的用法总结Html5新标签解释及用法
- HTML5添加禁止缩放功能解决HTML5手机端页面缩放的问题HTML5实现可缩放时钟代码可使任何HTML元素动态缩放适合父元素的js插件scalable.jsHtml5之svg可缩放矢量图形_动力节点Java学院整理HTML5全屏响应式缩放切换幻灯片代码用HTML5实现鼠标滚轮事件放大缩小图片的功能HTML5基于SVG实现可拖拽和缩放的世界地图效果源码HTML5之SVG 2D入门1—SVG(可缩放矢量图形)概述
- 基于HTML5 Canvas的3D动态Chart图表的示例html5中canvas图表实现柱状图的示例canvas如何绘制钟表的方法
- 看图猜成语 一辆汽车两边写着南北 答案是什么成语_手机游戏_游戏攻略_
- 看图猜成语一只老鼠指着一个胆字 答案是什么成语_手机游戏_游戏攻略_
点击排行
本栏推荐
