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 缩图函数 (onDOMLoaded)……
Oct 23 Javascript
JavaScript 继承的实现
Jul 09 Javascript
Javascript学习笔记8 用JSON做原型
Jan 11 Javascript
浅析jQuery的链式调用之each函数
Dec 03 Javascript
jQuery Ajax()方法使用指南
Nov 19 Javascript
jquery实现平滑的二级下拉菜单效果
Aug 26 Javascript
前端js实现文件的断点续传 后端PHP文件接收
Oct 14 Javascript
Vue路由跳转问题记录详解
Jun 15 Javascript
详解node服务器中打开html文件的两种方法
Sep 18 Javascript
javascript浏览器用户代理检测脚本实现方法
Oct 27 Javascript
Vue 动态设置路由参数的案例分析
Apr 24 Javascript
解决layui弹出层layer的area过大被遮挡的问题
Sep 21 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
加速XP搜索功能堪比vista
2007/03/22 PHP
详解php用curl调用接口方法,get和post两种方式
2017/01/13 PHP
js滚动条多种样式,推荐
2007/02/05 Javascript
javascript下string.format函数补充
2010/08/24 Javascript
jquery 选择器引擎sizzle浅析
2013/02/06 Javascript
js数组转json并在后台对其解析具体实现
2013/11/20 Javascript
js动态创建上传表单通过iframe模拟Ajax实现无刷新
2014/02/20 Javascript
js中array的sort()方法使用介绍
2014/02/20 Javascript
js自动查找select下拉的菜单并选择(示例代码)
2014/02/26 Javascript
Jquery自定义button按钮的几种方法
2014/06/11 Javascript
关闭页面window.location事件未执行的原因及解决方法
2014/09/01 Javascript
ECMAScript 5中的属性描述符详解
2015/03/02 Javascript
JS 根据子网掩码,网关计算出所有IP地址范围示例
2020/04/23 Javascript
BootStrap中的Fontawesome 图标
2017/05/25 Javascript
Nodejs下使用gm圆形裁剪并合成图片的示例
2018/02/22 NodeJs
vue.js做一个简单的编辑菜谱功能
2018/05/08 Javascript
JS实现用特殊符号替换字符串的中间部分区域的实例代码
2018/07/24 Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
2018/12/11 Javascript
js实现移动端轮播图
2020/12/21 Javascript
小程序转发探索示例
2019/02/19 Javascript
Vue中的验证登录状态的实现方法
2019/03/09 Javascript
js实现图片推拉门效果代码实例
2019/05/18 Javascript
ES6 Object方法扩展的应用实例分析
2019/06/25 Javascript
vue中封装axios并实现api接口的统一管理
2020/12/25 Vue.js
[01:09:24]Ti4开幕式
2014/07/19 DOTA
python使用两种发邮件的方式smtp和outlook示例
2017/06/02 Python
Tornado Web Server框架编写简易Python服务器
2018/07/28 Python
pygame实现俄罗斯方块游戏(基础篇3)
2019/10/29 Python
Python实现FLV视频拼接功能
2020/01/21 Python
django模型类中,null=True,blank=True用法说明
2020/07/09 Python
美国最古老的精致书写工具制造商:A.T. Cross(高仕)
2018/01/30 全球购物
莫斯科高科技在线商店:KremlinStore
2019/03/13 全球购物
大学生联谊活动策划书(光棍节)
2014/10/10 职场文书
结婚老公保证书
2015/02/26 职场文书
公司酒会致辞
2015/07/30 职场文书
python字典的元素访问实例详解
2021/07/21 Python