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 相关文章推荐
jQuery.Autocomplete实现自动完成功能(详解)
Jul 13 Javascript
Js基础学习资料
Nov 23 Javascript
jQuery实现dialog设置focus焦点的方法
Jun 10 Javascript
JQuery点击行tr实现checkBox选中的简单实例
May 26 Javascript
javascript事件模型介绍
May 31 Javascript
如何检测JavaScript的各种类型
Jul 30 Javascript
利用JS提交表单的几种方法和验证(必看篇)
Sep 17 Javascript
JavaScript高仿支付宝倒计时页面及代码实现
Oct 21 Javascript
详解react-router 4.0 下服务器如何配合BrowserRouter
Dec 29 Javascript
JavaScript中callee和caller的区别与用法实例分析
Jun 28 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
Aug 23 Javascript
vue 实现上传组件
May 31 Vue.js
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中cookie的作用域
2008/03/27 PHP
php写的带缓存数据功能的mysqli类
2012/09/06 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
php基于Redis消息队列实现的消息推送的方法
2018/11/28 PHP
用javascript获得地址栏参数的两种方法
2006/11/08 Javascript
关于__defineGetter__ 和__defineSetter__的说明
2007/05/12 Javascript
两个DIV等高的JS的实现代码
2007/12/23 Javascript
在html页面上拖放移动标签
2010/01/08 Javascript
浅析JS中document对象的一些重要属性
2014/03/06 Javascript
Nodejs学习笔记之测试驱动
2015/04/16 NodeJs
使用Meteor配合Node.js编写实时聊天应用的范例
2015/06/23 Javascript
使用Chart.js图表库制作漂亮的响应式表单
2015/10/28 Javascript
基于javascript制作微博发布栏效果
2016/04/04 Javascript
JQuery之proxy实现绑定代理方法
2016/08/01 Javascript
jquery实现百叶窗效果
2017/01/12 Javascript
jQuery插件FusionCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/06 Javascript
BootStrap 表单控件之单选按钮水平排列
2017/05/23 Javascript
JQuery animate动画应用示例
2019/05/14 jQuery
Ant Design Vue 添加区分中英文的长度校验功能
2020/01/21 Javascript
[32:36]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第二场 12.12
2020/12/16 DOTA
python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
2014/07/09 Python
Python httplib模块使用实例
2015/04/11 Python
python用线性回归预测股票价格的实现代码
2019/09/04 Python
高尔夫球鞋、服装、手套和装备:FootJoy
2018/12/15 全球购物
男女钓鱼靴和甲板鞋:XTRATUF
2021/01/09 全球购物
Why do we need Unit test
2013/01/03 面试题
工商管理毕业生推荐信
2013/12/24 职场文书
高一化学教学反思
2014/02/05 职场文书
文明村创建实施方案
2014/03/27 职场文书
个人租房协议书样本
2014/10/01 职场文书
个人四风问题对照检查材料思想汇报
2014/10/06 职场文书
2015年教学工作总结
2015/04/02 职场文书
小学开学典礼新闻稿
2015/07/17 职场文书
《爬天都峰》教学反思
2016/02/23 职场文书
Python答题卡识别并给出分数的实现代码
2021/06/22 Python
Go web入门Go pongo2模板引擎
2022/05/20 Golang