JS canvas实现画板和签字板功能


Posted in Javascript onFebruary 23, 2021

本文实例为大家分享了JS canvas实现画板/签字板功能的具体代码,供大家参考,具体内容如下

前言

常见的电子教室里的电子黑板。

本文特点:

原生JS
封装好的模块

最简代码样例

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta http-equiv="X-UA-Compatible" content="IE=edge">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>Document</title>
</head>
<body>
 <canvas id="canvas"></canvas>
 <script>
 let c = document.getElementById('canvas');
 c.width = window.innerWidth;
 c.height = window.innerHeight;
 let ctx = c.getContext('2d');

 // draw one black board
 ctx.fillStyle = "black";
 ctx.fillRect(0,0,600,300);

 // 按下标记
 let onoff = false,
  oldx = -10,
  oldy = -10;

 // 设置颜色
 let linecolor = "white";

 // 设置线宽
 let linw = 4;

 // 添加鼠标事件
 // 按下
 c.addEventListener('mousedown', event => {
  onoff = true;
  // 位置 - 10是为了矫正位置,把绘图放在鼠标指针的顶端
  oldx = event.pageX - 10;
  oldy = event.pageY - 10;
 },false);
 // 移动
 c.addEventListener('mousemove', event => {
  if(onoff == true){
  let newx = event.pageX - 10,
   newy = event.pageY - 10;

  // 绘图
  ctx.beginPath();
  ctx.moveTo(oldx,oldy);
  ctx.lineTo(newx,newy);
  ctx.strokeStyle = linecolor;
  ctx.lineWidth = linw;
  ctx.lineCap = "round";
  ctx.stroke();
  // 每次移动都要更新坐标位置
  oldx = newx,
  oldy = newy;
  }
 }, true);
 // 弹起
 c.addEventListener('mouseup', ()=> {
  onoff = false;
 },false);
 </script>
</body>
</html>

结果展示

JS canvas实现画板和签字板功能

代码讲解

思路

1、鼠标按下,开始描画。鼠标按下事件。
2、鼠标弹起,结束描画。鼠标弹起事件。
3、鼠标按下移动,路径画线。鼠标移动事件。

代码讲解

整体思路:按下鼠标,触发移动的开关,移动后开始记录线条(用移动后的坐标-移动前的坐标,然后绘线),每次移动都会更新旧坐标。松开鼠标后,释放移动开关。

1、只有在鼠标按下,才会触发移动绘图的效果,所以需要增加一个状态判断。
2、因为鼠标指针和实际位置有一个偏移量,所以在坐标定位的时候,需要增加pagex-10从而使坐标位于指针的尖端处。
3、每次移动都要更新坐标位置,用小段的线段来模拟不规则的线。

封装模块

<canvas id="canvas"></canvas>
<script>
 class Board{
 constructor(canvasName = 'canvas', data = new Map([
  ["onoff", false],
  ["oldx", -10],
  ["oldy", -10],
  ["fillStyle", "black"],
  ["lineColor", "white"],
  ["lineWidth", 4],
  ["lineCap", "round"],
  ["canvasWidth", window.innerWidth],
  ["canvasHeight", window.innerHeight]
 ])){
  // this.data = data;
  this.c = document.getElementById(canvasName);
  this.ctx = this.c.getContext('2d');
  this.onoff = data.get("onoff");
  this.oldx = data.get("oldx");
  this.oldy = data.get("oldy");
  this.lineColor = data.get("lineColor");
  this.lineWidth = data.get("lineWidth");
  this.lineCap = data.get("lineCap");

  this.c.width = data.get("canvasWidth");
  this.c.height = data.get("canvasHeight");

  this.ctx.fillStyle = data.get("fillStyle");
  this.ctx.fillRect(0,0,600,300);
 }

 eventOperation(){
  // 添加鼠标事件
  // 按下
  this.c.addEventListener('mousedown', event => {
  this.onoff = true;
  // 位置 - 10是为了矫正位置,把绘图放在鼠标指针的顶端
  this.oldx = event.pageX - 10;
  this.oldy = event.pageY - 10;
  },false);
  // 移动
  this.c.addEventListener('mousemove', event => {
  if(this.onoff == true){
   let newx = event.pageX - 10,
   newy = event.pageY - 10;

   // 绘图
   this.ctx.beginPath();
   this.ctx.moveTo(this.oldx,this.oldy);
   this.ctx.lineTo(newx,newy);

   this.ctx.strokeStyle = this.lineColor;
   this.ctx.lineWidth = this.lineWidth;
   this.ctx.lineCap = this.lineCap;
   
   this.ctx.stroke();
   // 每次移动都要更新坐标位置
   this.oldx = newx,
   this.oldy = newy;
  }
  }, true);
  // 弹起
  this.c.addEventListener('mouseup', ()=> {
  this.onoff = false;
  },false);
 }

 }

 let board = new Board();
 board.eventOperation();
</script>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
超精准的javascript验证身份证号的具体实现方法
Nov 18 Javascript
Javascript实现倒计时(防页面刷新)实例
Dec 13 Javascript
JavaScript简单生成 N~M 之间随机数的方法
Jan 13 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
Mar 30 Javascript
Vuejs实现带样式的单文件组件新方法
May 02 Javascript
Angular4学习笔记之实现绑定和分包
Aug 01 Javascript
jquery中done和then的区别(详解)
Dec 19 jQuery
微信小程序实现无限滚动列表
May 29 Javascript
微信小程序间使用navigator跳转传值问题实例分析
Mar 27 Javascript
js函数柯里化的方法和作用实例分析
Apr 11 Javascript
在vue中配置不同的代理同时访问不同的后台操作
Sep 11 Javascript
微信小程序实现购物车小功能
Dec 30 Javascript
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
Feb 23 #Vue.js
js实现验证码干扰(动态)
Feb 23 #Javascript
js实现验证码干扰(静态)
Feb 22 #Javascript
JavaScript实现H5接金币功能(实例代码)
Feb 22 #Javascript
nestjs返回给前端数据格式的封装实现
Feb 22 #Javascript
NestJs使用Mongoose对MongoDB操作的方法
Feb 22 #Javascript
linux服务器快速卸载安装node环境(简单上手)
Feb 22 #Javascript
You might like
PHP 实现多服务器共享 SESSION 数据
2009/08/15 PHP
PHP中extract()函数的妙用分析
2012/07/11 PHP
php编写的一个E-mail验证类
2015/03/25 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
2017/01/24 PHP
JS控制表格隔行变色
2006/06/26 Javascript
javascript自适应宽度的瀑布流实现思路
2013/02/20 Javascript
jquery ajax的success回调函数中实现按钮置灰倒计时
2013/11/19 Javascript
javascript中全局对象的parseInt()方法使用介绍
2013/12/19 Javascript
iframe的onreadystatechange事件在firefox下的使用
2014/04/16 Javascript
JS动态添加选项案例分析
2016/10/17 Javascript
pc加载更多功能和移动端下拉刷新加载数据
2016/11/07 Javascript
用headjs来管理和加载js 提高网站加载速度
2016/11/29 Javascript
vue.js项目中实用的小技巧汇总
2017/11/29 Javascript
node.js中路由,中间件,ge请求和post请求的参数详解
2017/12/26 Javascript
用ES6的class模仿Vue写一个双向绑定的示例代码
2018/04/20 Javascript
jQuery实现通过方向键控制div块上下左右移动的方法【测试可用】
2018/04/26 jQuery
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
vue+koa2搭建mock数据环境的详细教程
2020/05/18 Javascript
python安装mysql-python简明笔记(ubuntu环境)
2016/06/25 Python
Django高级编程之自定义Field实现多语言
2019/07/02 Python
用python wxpy管理微信公众号并利用微信获取自己的开源数据
2019/07/30 Python
python的pyecharts绘制各种图表详细(附代码)
2019/11/11 Python
Django异步任务线程池实现原理
2019/12/17 Python
tensorflow 只恢复部分模型参数的实例
2020/01/06 Python
Python 去除字符串中指定字符串
2020/03/05 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
2020/05/12 Python
解决tensorflow读取本地MNITS_data失败的原因
2020/06/22 Python
台湾全方位线上课程与职能学习平台:TibaMe
2019/12/04 全球购物
考博专家推荐信
2014/05/10 职场文书
建筑工程造价专业自荐信
2014/07/08 职场文书
公司委托书怎么写
2014/08/02 职场文书
敬老月活动总结
2014/08/28 职场文书
教师党员个人整改措施材料
2014/09/16 职场文书
2014年班长个人工作总结
2014/11/14 职场文书
教务处干事工作总结
2015/08/14 职场文书
家庭教育培训学习心得体会
2016/01/14 职场文书