vue移动端使用canvas签名的实现


Posted in Javascript onJanuary 15, 2020

效果

vue移动端使用canvas签名的实现

canvas画板移动端 .gif

需求

  在一些项目业务中,经常会使用到画板,让用户自己去写/画一些东西做标示,比如说在线签电子合约、签名等,如果不用插件,那么如何使用h5的canvas画布来实现这一需求呢? 【本篇只讨论移动端,PC端请看上篇】

分析

  很明显,我们需要一个canvas,关于canvas的一些基本操作可以在w3school或者别的一些平台上熟悉一下,其实本例也是基础操作。本案例在vue中完成。(脱离vue也一样。)

  • 首先,需要一个canvas画布
  • 其次,考虑逻辑
  • 把逻辑实现

1. canvas画布

随意布局的一个画布,此处值得注意的是如果canvas的宽高确定,则在html>canvas中直接写宽高,如果不确定,根据别的元素变化,那么可以在js中初始化画布时写。

html

<div class="boardBox" ref="boardBox">
  <canvas ref="board"
      
  </canvas>
</div>

布局

.boardBox{
  margin: 30px auto;
  width: 90vw;
  height: 25vh;
  background: #f9f9f9;
  canvas{
    border: 1px solid #b3b3b3;
  }
}

画布初始化

let board = this.$refs.board;  // 获取DOM
board.width = this.$refs.boardBox.offsetWidth; // 设置画布宽
board.height = this.$refs.boardBox.offsetHeight;  // 设置画布高
this.ctx = board.getContext('2d');  // 二维绘图
this.ctx.strokeStyle = '#000';  // 颜色
this.ctx.lineWidth = 3; // 线条宽度

2. 逻辑分析

由于本篇只讨论移动端端,因此无非是在画布上监听三个触摸事件:touchstart、touchmove、touchend。
那么,在这三个事件中,分别需要做什么呢?

touchstart

开始滑动按下,需要做:

  • 获取触摸点做画布上的位置
  • 存为一个点坐标(起始点)
  • 以起始点建立一个路径
  • 开启画布操作

touchmove

触摸滑动时,又要做那些准备呢?

  • 判断是否开启画布操作,如果没开启就禁止绘制,因此先判断是否当前状态可绘制
  • 获取触摸点做画布上的位置
  • 上一个点到这一个点作连线
  • 绘制出来
  • 当前点存储,下一次用

touchend

滑动结束,事件结束:

  • closePath() // 停止绘制
  • 关闭画布操作的开关

好了,其实就是这三个事件,理清楚之后去代码实现就简单得多了。附上代码一份。

3. 代码

CSS略,如初始化即可,不是重点。

<div class="boardBox" ref="boardBox">
  <canvas ref="board"
      @touchstart="mStart"
      @touchmove="mMove"
      @touchend="mEnd">
  </canvas>
</div>
data() {
  return {
    ctx: null,
    point: {
      x: 0,
      y: 0
    },
    moving: false  // 是否正在绘制中且移动
  };
},
mounted() {
  let board = this.$refs.board;  // 获取DOM
  board.width = this.$refs.boardBox.offsetWidth; // 设置画布宽
  board.height = this.$refs.boardBox.offsetHeight;  // 设置画布高
  this.ctx = board.getContext('2d');  // 二维绘图
  this.ctx.strokeStyle = '#000';  // 颜色
  this.ctx.lineWidth = 3; // 线条宽度
},
methods: {
  // 触摸(开始)
  mStart (e) {
    console.log(e);
    let x = e.touches[0].clientX - e.target.offsetLeft,
      y = e.touches[0].clientY - e.target.offsetTop;  // 获取触摸点在画板(canvas)的坐标
    this.point.x = x;
    this.point.y = y;
    this.ctx.beginPath();
    this.moving = true;
  },
  // 滑动中...
  mMove (e) {
    if(this.moving) {
      let x = e.touches[0].clientX - e.target.offsetLeft,
        y = e.touches[0].clientY - e.target.offsetTop;  // 获取触摸点在画板(canvas)的坐标
      this.ctx.moveTo(this.point.x, this.point.y);  // 把路径移动到画布中的指定点,不创建线条(起始点)
      this.ctx.lineTo(x, y); // 添加一个新点,然后创建从该点到画布中最后指定点的线条,不创建线条
      this.ctx.stroke(); // 绘制
      this.point.x = x, this.point.y = y;  // 重置点坐标为上一个坐标
    }
  },
  // 滑动结束
  mEnd () {
    if(this.moving) {
      this.ctx.closePath();  // 停止绘制
      this.moving = false;  // 关闭绘制开关
    }
  },
},

思考

  1. 上一篇,在PC端完成绘制,本篇如法炮制,在移动端也顺利完成,相比pc端只是稍微的修改了一下获取坐标点的算法而已。那么PC端和移动端如何并存呢?
  2. 出错了,怎么重新绘制呢?
  3. 绘制完成后,怎么保存呢?

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

Javascript 相关文章推荐
JavaScript内核之基本概念
Oct 21 Javascript
jquery交替变换颜色的三种方法 实例代码
Nov 19 Javascript
jQuery插件ajaxFileUpload实现异步上传文件效果
Apr 14 Javascript
Javascript编程中几种继承方式比较分析
Nov 28 Javascript
浅析JavaScript Array和string的转换(推荐)
May 20 Javascript
原生javascript 学习之js变量全面了解
Jul 14 Javascript
JavaScript简单拖拽效果(1)
May 17 Javascript
JS与jQuery实现ListBox上移,下移,左移,右移操作功能示例
May 31 jQuery
Vue与Node.js通过socket.io通信的示例代码
Jul 25 Javascript
小程序tab页无法传递参数的方法
Aug 03 Javascript
基于Fixed定位的框选功能的实现代码
May 13 Javascript
浅谈微信小程序列表埋点曝光指南
Oct 15 Javascript
js实现鼠标拖拽div左右滑动
Jan 15 #Javascript
Vue数字输入框组件示例代码详解
Jan 15 #Javascript
Vue v-bind动态绑定class实例方法
Jan 15 #Javascript
JS 事件机制完整示例分析
Jan 15 #Javascript
JS实现滑动插件
Jan 15 #Javascript
JS实现滑动导航效果
Jan 14 #Javascript
解决 window.onload 被覆盖的问题方法
Jan 14 #Javascript
You might like
Laravel学习笔记之Artisan命令生成自定义模板的方法
2018/11/22 PHP
Convert Seconds To Hours
2007/06/16 Javascript
基于jquery的商品展示放大镜
2010/08/07 Javascript
javascript string字符串优化问题
2011/07/31 Javascript
js使浏览器窗口最大化实现代码(适用于IE)
2013/08/07 Javascript
window.navigate 与 window.location.href 的使用区别介绍
2013/09/21 Javascript
使用JS CSS去除IE链接虚线框的三种方法
2013/11/14 Javascript
nodejs中实现路由功能
2014/12/29 NodeJs
jQuery超酷平面式时钟效果代码分享
2020/03/30 Javascript
纯JavaScript代码实现移动设备绘图解锁
2015/10/16 Javascript
Svg.js实例教程及使用手册详解(一)
2016/05/16 Javascript
浅谈JS中的三种字符串连接方式及其性能比较
2016/09/02 Javascript
vue axios请求拦截实例代码
2018/03/29 Javascript
JS 实现分页打印功能
2018/05/16 Javascript
通过实例了解Nodejs模块系统及require机制
2020/07/16 NodeJs
python 设置文件编码格式的实现方法
2017/12/21 Python
python操作mysql代码总结
2018/06/01 Python
Python简单计算给定某一年的某一天是星期几示例
2018/06/27 Python
python将txt文件读入为np.array的方法
2018/10/30 Python
python+PyQT实现系统桌面时钟
2020/06/16 Python
用python求一重积分和二重积分的例子
2019/12/06 Python
利用Python实现某OA系统的自动定位功能
2020/05/27 Python
Python利用myqr库创建自己的二维码
2020/11/24 Python
Python 利用argparse模块实现脚本命令行参数解析
2020/12/28 Python
Python使用tkinter实现小时钟效果
2021/02/22 Python
详解HTML5通讯录获取指定多个人的信息
2016/12/20 HTML / CSS
HTML5中的音频和视频媒体播放元素小结
2016/01/29 HTML / CSS
HTML块级标签汇总(小篇)
2016/07/13 HTML / CSS
阿联酋航空丹麦官方网站:Emirates DK
2019/08/25 全球购物
优秀经理事迹材料
2014/02/01 职场文书
公务员转正鉴定材料
2014/02/11 职场文书
应届生求职信
2014/05/31 职场文书
党的群众教育实践活动实施方案
2014/06/12 职场文书
小学班主任培训心得体会
2016/01/07 职场文书
先进基层党组织事迹材料2016
2016/02/29 职场文书
Prometheus 监控MySQL使用grafana展示
2021/08/30 MySQL