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 相关文章推荐
用js实现手把手教你月入万刀(转贴)
Nov 07 Javascript
Textbox控件注册回车事件及触发按钮提交事件具体实现
Mar 04 Javascript
javascript里使用php代码实例
Dec 13 Javascript
Javascript获取统一管理的提示语(message)
Feb 03 Javascript
BootStrap入门教程(三)之响应式原理
Sep 19 Javascript
jquery dataview数据视图插件使用方法
Dec 23 Javascript
bootstrap如何让dropdown menu按钮式下拉框长度一致
Apr 10 Javascript
JS给按钮添加跳转功能类似a标签
May 30 Javascript
在vue里面设置全局变量或数据的方法
Mar 09 Javascript
node+express框架中连接使用mysql(经验总结)
Nov 10 Javascript
layer.alert自定义关闭回调事件的方法
Sep 27 Javascript
js实现批量删除功能
Aug 27 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
ThinkPHP之M方法实例详解
2014/06/20 PHP
ThinkPHP入口文件设置及相关注意事项分析
2014/12/05 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
2015/08/21 PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
2017/07/10 PHP
PHP实现基于3DES算法加密解密字符串示例
2018/08/24 PHP
PHP命名空间与自动加载类详解
2018/09/04 PHP
微信公众平台开发教程⑥ 微信开发集成类的使用图文详解
2019/04/10 PHP
JavaScript自定义事件介绍
2013/08/29 Javascript
javascript中使用new与不使用实例化对象的区别
2015/06/22 Javascript
js中对函数设置默认参数值的3种方法
2015/10/23 Javascript
jquery实现表单验证简单实例演示
2015/11/23 Javascript
HTML页面,测试JS对C函数的调用简单实例
2016/08/09 Javascript
微信小程序 Storage API实例详解
2016/10/02 Javascript
Bootstrap中datetimepicker使用小结
2016/12/28 Javascript
canvas滤镜效果实现代码
2017/02/06 Javascript
node.js 核心http模块,起一个服务器,返回一个页面的实例
2017/09/11 Javascript
React Native模块之Permissions权限申请的实例相机
2017/09/28 Javascript
Vue 菜单栏点击切换单个class(高亮)的方法
2018/08/22 Javascript
微信小程序自定义弹窗wcPop插件
2018/11/19 Javascript
微信小程序显示倒计时功能示例【测试可用】
2018/12/03 Javascript
浅谈Fetch 数据交互方式
2018/12/20 Javascript
jQuery实现合并表格单元格中相同行操作示例
2019/01/28 jQuery
Vue+elementui 实现复杂表头和动态增加列的二维表格功能
2019/09/23 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
Python内置的字符串处理函数整理
2013/01/29 Python
pyv8学习python和javascript变量进行交互
2013/12/04 Python
python基础教程之基本内置数据类型介绍
2014/02/20 Python
python实现数独算法实例
2015/06/09 Python
详解字典树Trie结构及其Python代码实现
2016/06/03 Python
Tensorflow使用支持向量机拟合线性回归
2018/09/07 Python
Python实现监控Nginx配置文件的不同并发送邮件报警功能示例
2019/02/26 Python
keras 自定义loss model.add_loss的使用详解
2020/06/22 Python
python 读取串口数据的示例
2020/11/09 Python
英国排名第一的冲浪店:Ann’s Cottage
2020/06/21 全球购物
一道Delphi上机题
2012/06/04 面试题
产品质量保证书范本
2015/02/27 职场文书