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 相关文章推荐
农历与西历对照
Sep 06 Javascript
jQuery 常见开发使用技巧总结
Dec 26 Javascript
JavaScript 代码压缩工具小结
Feb 27 Javascript
jquery text()方法取标签中的文本
Jul 25 Javascript
JS是按值传递还是按引用传递
Jan 30 Javascript
Bootstrap树形控件使用方法详解
Jan 27 Javascript
JavaScript简单验证表单空值及邮箱格式的方法
Jan 20 Javascript
JS实现购物车特效
Feb 02 Javascript
EasyUI Tree树组件无限循环的解决方法
Sep 27 Javascript
JavaScript格式化json和xml的方法示例
Jan 22 Javascript
js 实现watch监听数据变化的代码
Oct 13 Javascript
javascript实现贪吃蛇小练习
Jul 05 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
php自动跳转中英文页面
2008/07/29 PHP
关于扩展 Laravel 默认 Session 中间件导致的 Session 写入失效问题分析
2016/01/08 PHP
PHP GD库相关图像生成和处理函数小结
2016/09/30 PHP
iOS+PHP注册登录系统 PHP部分(上)
2016/12/26 PHP
js 幻灯片的实现
2011/12/06 Javascript
jquery实现奇偶行赋值不同css值
2012/02/17 Javascript
javaScript 计算两个日期的天数相差(示例代码)
2013/12/27 Javascript
如何用javascript计算文本框还能输入多少个字符
2015/07/29 Javascript
jquery调整表格行tr上下顺序实例讲解
2016/01/09 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
jQuery简单实现彩色云标签效果示例
2016/08/01 Javascript
JavaScript交换两个变量值的七种解决方案
2016/12/01 Javascript
深入理解JavaScript继承的多种方式和优缺点
2017/05/12 Javascript
JavaScript 巧学巧用
2017/05/23 Javascript
node.js基础知识小结
2018/02/26 Javascript
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
2018/09/04 Javascript
vue实现lodop打印功能的示例
2020/11/11 Javascript
[00:32]2018DOTA2亚洲邀请赛OpTic出场
2018/04/03 DOTA
Python中.join()和os.path.join()两个函数的用法详解
2018/06/11 Python
Python实现全排列的打印
2018/08/18 Python
python plotly画柱状图代码实例
2019/12/13 Python
Python实现不规则图形填充的思路
2020/02/02 Python
Python 为什么推荐蛇形命名法原因浅析
2020/06/18 Python
opencv 图像腐蚀和图像膨胀的实现
2020/07/07 Python
Django封装交互接口代码
2020/07/12 Python
Python如何发送与接收大型数组
2020/08/07 Python
详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强
2020/11/17 Python
自我鉴定书面格式
2014/01/13 职场文书
以幸福为主题的活动方案
2014/08/22 职场文书
2014年基层党支部工作总结
2014/12/04 职场文书
公务员年度考核登记表个人总结
2015/02/12 职场文书
2015年七七事变78周年纪念活动方案
2015/05/06 职场文书
幼儿园班级工作总结2015
2015/05/25 职场文书
辩论会主持词
2015/07/03 职场文书
2016年学习贯彻十八届五中全会精神心得体会
2016/01/05 职场文书
Python词云的正确实现方法实例
2021/05/08 Python