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代码
May 22 Javascript
js浮点数保留两位小数点示例代码(四舍五入)
Dec 26 Javascript
纯JS实现动态时间显示代码
Feb 08 Javascript
javascript实现百度地图鼠标滑动事件显示、隐藏
Apr 02 Javascript
javascript与Python快速排序实例对比
Aug 10 Javascript
JavaScript在网页中画圆的函数arc使用方法
Nov 13 Javascript
javascript数据结构之二叉搜索树实现方法
Nov 25 Javascript
用AngularJS来实现监察表单按钮的禁用效果
Nov 02 Javascript
bootstrap table实现单击单元格可编辑功能
Mar 28 Javascript
vue-cli之router基本使用方法详解
Oct 17 Javascript
详解基于vue-cli3快速发布一个fullpage组件
Mar 08 Javascript
vue自定义指令实现仅支持输入数字和浮点型的示例
Oct 30 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
phplock(php进程锁) v1.0 beta1
2009/11/24 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
2015/12/25 PHP
php array_merge_recursive 数组合并
2016/10/26 PHP
静态html文件执行php语句的方法(推荐)
2016/11/21 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
仿校内登陆框,精美,给那些很厉害但是没有设计天才的程序员
2008/11/24 Javascript
jQuery库与其他JS库冲突的解决办法
2010/02/07 Javascript
网页加载时页面显示进度条加载完成之后显示网页内容
2012/12/23 Javascript
js控制的回到页面顶端goTop的代码实现
2013/03/20 Javascript
当某个文本框成为焦点时即清除文本框内容
2014/04/28 Javascript
一个JavaScript递归实现反转数组字符串的实例
2014/10/14 Javascript
手机开发必备技巧:javascript及CSS功能代码分享
2015/05/25 Javascript
AngularJS教程 ng-style 指令简单示例
2016/08/03 Javascript
JS判断来路是否是百度等搜索索引进行弹窗或自动跳转的实现代码
2016/10/09 Javascript
js监听键盘事件的方法_原生和jquery的区别详解
2016/10/10 Javascript
Bootstrap table右键功能实现方法
2017/02/20 Javascript
Node.js自定义实现文件路由功能
2017/09/22 Javascript
vue2.x select2 指令封装详解
2017/10/12 Javascript
Vue2.5学习笔记之如何在项目中使用和配置Vue
2018/09/26 Javascript
vue地址栏直接输入路由无效问题的解决
2018/11/15 Javascript
微信小程序实现搜索功能并跳转搜索结果页面
2019/05/18 Javascript
解决axios post 后端无法接收数据的问题
2019/10/29 Javascript
JavaScript链式调用原理与实现方法详解
2020/05/16 Javascript
[07:03]显微镜下的DOTA2第九期——430圣堂刺客杀戮秀
2014/06/20 DOTA
Python中暂存上传图片的方法
2015/02/18 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
2017/06/07 Python
python 实现求解字符串集的最长公共前缀方法
2018/07/20 Python
python3.4 将16进制转成字符串的实例
2019/06/12 Python
简单的Python调度器Schedule详解
2019/08/30 Python
python链表类中获取元素实例方法
2021/02/23 Python
香港艺人陈冠希创办的潮流品牌:JUICESTORE
2021/03/04 全球购物
学生周末回家住宿长期请假条
2014/02/15 职场文书
志愿者活动总结
2014/04/28 职场文书
社区义诊通知
2015/04/24 职场文书
mysql 8.0.24 安装配置方法图文教程
2021/05/12 MySQL
python中取整数的几种方法
2021/11/07 Python