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 相关文章推荐
一直复略了的一个问题,关于表单重复提交
Feb 15 Javascript
eclipse如何忽略js文件报错(附图)
Oct 30 Javascript
js实现文本框中焦点在最后位置
Mar 04 Javascript
jquery 根据name名获取元素的value值
Feb 27 Javascript
bootstrap下拉菜单使用方法解析
Jan 13 Javascript
Vue2仿淘宝实现省市区三级联动
Apr 15 Javascript
jQuery动态添加元素无法触发绑定事件的解决方法分析
Jan 02 jQuery
jquery动态添加带有样式的HTML标签元素方法
Feb 24 jQuery
vue中的数据绑定原理的实现
Jul 02 Javascript
vue中使用protobuf的过程记录
Oct 26 Javascript
Vue递归实现树形菜单方法实例
Nov 06 Javascript
实例讲解React 组件
Jul 07 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打开远程文件的方法和风险及解决方法
2013/11/12 PHP
php自定义apk安装包实例
2014/10/20 PHP
ThinkPHP内置jsonRPC的缺陷分析
2014/12/18 PHP
PHP直接修改表内容DataGrid功能实现代码
2015/09/24 PHP
PHP使用mkdir创建多级目录的方法
2015/12/22 PHP
JQuery最佳实践之精妙的自定义事件
2010/08/11 Javascript
JQERY limittext 插件0.2版(长内容限制显示)
2010/08/27 Javascript
JS 去前后空格大全(IE9亲测)
2013/07/15 Javascript
深入探究使JavaScript动画流畅的一些方法
2015/06/30 Javascript
jQuery模仿阿里云购买服务器选择购买时间长度的代码
2016/04/29 Javascript
jquery选择器中的空格与大于号&gt;、加号+与波浪号~的区别介绍
2016/06/24 Javascript
Node.js的Mongodb使用实例
2016/12/30 Javascript
Jquery-data的三种用法
2017/04/18 jQuery
jQuery 导航自动跟随滚动的实现代码
2018/05/30 jQuery
vue服务端渲染页面缓存和组件缓存的实例详解
2018/09/18 Javascript
mpvue项目中使用第三方UI组件库的方法
2018/09/30 Javascript
如何使用CSS3+JQuery实现悬浮墙式菜单
2019/06/18 jQuery
vue集成chart.js的实现方法
2019/08/20 Javascript
Python语言描述KNN算法与Kd树
2017/12/13 Python
如何在django里上传csv文件并进行入库处理的方法
2019/01/02 Python
新年快乐! python实现绚烂的烟花绽放效果
2019/01/30 Python
对Python协程之异步同步的区别详解
2019/02/19 Python
Python 实现数据结构-循环队列的操作方法
2019/07/17 Python
python pyenv多版本管理工具的使用
2019/12/23 Python
Python 线性回归分析以及评价指标详解
2020/04/02 Python
使用tensorflow根据输入更改tensor shape
2020/06/23 Python
CSS中垂直居中的简单实现方法
2015/07/06 HTML / CSS
CSS3关于z-index不生效问题的解决
2020/02/19 HTML / CSS
Laura Geller官网:美国彩妆品牌
2018/12/29 全球购物
丑小鸭教学反思
2014/02/03 职场文书
云台山导游词
2015/02/03 职场文书
市场部岗位职责
2015/02/12 职场文书
高中数学课堂教学反思
2016/02/18 职场文书
javascript拖曳互换div的位置实现示例
2021/06/28 Javascript
Window server 2012 R2 AD域的组策略相关设置
2022/04/28 Servers
Go gRPC进阶教程gRPC转换HTTP
2022/06/16 Golang