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的面向对象(二)
Nov 09 Javascript
javascript 建设银行登陆键盘
Jun 10 Javascript
js判断某个方法是否存在实例代码
Jan 10 Javascript
使用Jquery实现每日签到功能
Apr 03 Javascript
JS+JSP通过img标签调用实现静态页面访问次数统计的方法
Dec 14 Javascript
使用vue编写一个点击数字计时小游戏
Aug 31 Javascript
ES6概念 ymbol.for()方法
Dec 25 Javascript
微信小程序checkbox组件使用详解
Jan 31 Javascript
微信小程序实现长按删除图片的示例
May 18 Javascript
Node.JS获取GET,POST数据之queryString模块使用方法详解
Feb 06 Javascript
js实现无刷新监听URL的变化示例代码详解
Jun 03 Javascript
js实现随机点名器精简版
Jun 29 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
一些星际专用术语解释
2020/03/04 星际争霸
PHP4实际应用经验篇(6)
2006/10/09 PHP
PHP修改session_id示例代码
2014/01/08 PHP
php获取mysql字段名称和其它信息的例子
2014/04/14 PHP
百度地图API使用方法详解
2015/08/25 PHP
php 多文件上传的实现实例
2016/10/23 PHP
php中遍历二维数组并以表格的形式输出的方法
2017/01/03 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
PHP实现的只保留字符串首尾字符功能示例【隐藏部分字符串】
2019/03/11 PHP
使用JavaScript开发IE浏览器本地插件实例
2015/02/18 Javascript
nodejs中实现sleep功能实例
2015/03/24 NodeJs
JS代码实现table数据分页效果
2016/05/26 Javascript
基于jQuery实现歌词滚动版音乐播放器的代码
2016/09/17 Javascript
利用javascript如何随机生成一定位数的密码
2017/09/22 Javascript
JavaScript实现计算圆周率到小数点后100位的方法示例
2018/05/08 Javascript
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
nodejs微信开发之授权登录+获取用户信息
2019/03/17 NodeJs
Vue Render函数创建DOM节点代码实例
2020/07/08 Javascript
electron踩坑之remote of undefined的解决
2020/10/06 Javascript
Python学习小技巧之利用字典的默认行为
2017/05/20 Python
Python数据可视化正态分布简单分析及实现代码
2017/12/04 Python
python微信公众号之关键词自动回复
2018/06/15 Python
Python实现的绘制三维双螺旋线图形功能示例
2018/06/23 Python
python读取word文档,插入mysql数据库的示例代码
2018/11/07 Python
ML神器:sklearn的快速使用及入门
2019/07/11 Python
Python socket 套接字实现通信详解
2019/08/27 Python
python re模块常见用法例举
2021/03/01 Python
亚洲领先的旅游体验市场:Voyagin
2019/11/23 全球购物
描述RIP和OSPF区别以及特点
2015/01/17 面试题
毕业生毕业总结的自我评价范文
2013/11/02 职场文书
市场营销专科应届生求职信
2013/11/24 职场文书
水果连锁超市创业计划书
2014/01/24 职场文书
质量整改报告范文
2014/11/08 职场文书
升职自荐信怎么写
2015/03/05 职场文书
2015年七一建党节活动总结
2015/03/20 职场文书
Go 语言中 20 个占位符的整理
2021/10/16 Golang