vue使用canvas实现移动端手写签名


Posted in Javascript onSeptember 22, 2020

基于vue使用canvas实现移动端手写签名!

之前自己开发有这么一个需求,需要实现手写签名,然后以图片的形式保存生成图片的base64数据流 。自己在网上找了一堆,都不是很完美。然后参考网上的加自己的优化和修改做了一版。希望有需要的朋友可以拿来直接用。

HTML部分:

<template>
 <div class="hello" >
  <div>请输入您的签名7:</div>
    <canvas id="canvas" ref="canvasW" width="373" height="200" style="border:1px solid black" >Canvas画板</canvas>
  <img v-bind:src="url" alt="">
  <div>
    <button type="" v-on:click="clear">重写</button>
    <button v-on:click="save">保存签名</button>
  </div>
 </div>
 
</template>

为了节约时间,样式写的比较简单。凑合看吧!

script部分

<script>
var draw;
var preHandler = function(e){e.preventDefault();}
class Draw {
  constructor(el) {
    this.el = el
    this.canvas = document.getElementById(this.el)
    this.cxt = this.canvas.getContext('2d')
    this.stage_info = canvas.getBoundingClientRect()
    this.path = {
      beginX: 0,
      beginY: 0,
      endX: 0,
      endY: 0
    }
  }
  init(btn) {
    var that = this; 
    //初始化生成
    this.canvas.addEventListener('touchstart', function(event) {
      document.addEventListener('touchstart', preHandler, false); 
      that.drawBegin(event)
    })
    this.canvas.addEventListener('touchend', function(event) { 
      document.addEventListener('touchend', preHandler, false); 
      that.drawEnd()
      
    })
    this.clear(btn)
  }
  drawBegin(e) {
    var that = this;
    window.getSelection() ? window.getSelection().removeAllRanges() : document.selection.empty()
    this.cxt.strokeStyle = "#000"
    this.cxt.beginPath()
    this.cxt.moveTo(
      e.changedTouches[0].clientX - this.stage_info.left,
      e.changedTouches[0].clientY - this.stage_info.top
    )
    this.path.beginX = e.changedTouches[0].clientX - this.stage_info.left
    this.path.beginY = e.changedTouches[0].clientY - this.stage_info.top
    canvas.addEventListener("touchmove",function(ev){
      ev.preventDefault()
      that.drawing(event)
    })
  }
  drawing(e) {
    this.cxt.lineTo(
      e.changedTouches[0].clientX - this.stage_info.left,
      e.changedTouches[0].clientY - this.stage_info.top
    )
    this.path.endX = e.changedTouches[0].clientX - this.stage_info.left
    this.path.endY = e.changedTouches[0].clientY - this.stage_info.top
    this.cxt.stroke()
  }
  drawEnd() {
    document.removeEventListener('touchstart', preHandler, false); 
    document.removeEventListener('touchend', preHandler, false);
    document.removeEventListener('touchmove', preHandler, false);
  }
  clear(btn) {
    this.cxt.clearRect(0, 0, this.stage_info.width, this.stage_info.height)
    // this.cxt.clearRect(0, 0, 373, 200)
  }
  save(){
    return canvas.toDataURL("image/png")
    console.log(canvas.toDataURL("image/png"))
  }
}

export default {
 data () {
  return {
   msg: '啦啦啦',
   val:true,
   url:""
  }
 },
 mounted() {
   draw=new Draw('canvas');
   draw.init();
 },
 methods:{
  clear:function(){
    draw.clear();
    // 用于点击清除画布时,同时清除上次保存的图片
    this.save()
  },
  save:function(){
    var data=draw.save();
    this.url = data;
    // 生成图片的base64数据流 
  },
mutate(word){
    this.$emit("input", word);
  },
 }
}
</script>

css部分

<style scoped lang="less">
  .hello{
    height: 100%;
    width: 100%;
    background: #ccc;
      h1, h2 { font-weight: normal; } 
      ul { list-style-type: none; padding: 0; } 
      li { display: inline-block; margin: 0 10px; } 
      a { color: #42b983; } 
      #canvas { background: pink; cursor: default; } 
      #keyword-box { margin: 10px 0; } 
      button{font-size: 0.2rem;color: blue;}
 }

效果图:

vue使用canvas实现移动端手写签名

就到这里吧!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
学习ExtJS 访问容器对象
Oct 07 Javascript
jQuery学习笔记之jQuery的事件
Dec 22 Javascript
jquery表格内容筛选实现思路及代码
Apr 16 Javascript
从数组中随机取x条不重复数据的JS代码
Dec 24 Javascript
jQuery实现背景弹性滚动的导航效果
Jun 01 Javascript
javascript实现一个网页加载进度loading
Jan 04 Javascript
vue-cli如何添加less 以及sass
Jul 06 Javascript
基于jQuery中ajax的相关方法汇总(必看篇)
Nov 08 jQuery
JavaScript比较同一天的时间大小实例代码
Feb 09 Javascript
Vue常用的几个指令附完整案例
Nov 06 Javascript
js实现多个倒计时并行 js拼团倒计时
Feb 25 Javascript
javascript实现下拉菜单效果
Feb 09 Javascript
JSON 入门教程基础篇 json入门学习笔记
Sep 22 #Javascript
Vue+Java 通过websocket实现服务器与客户端双向通信操作
Sep 22 #Javascript
Vue实现开关按钮拖拽效果
Sep 22 #Javascript
JS如何生成动态列表
Sep 22 #Javascript
vue使用svg文件补充-svg放大缩小操作(使用d3.js)
Sep 22 #Javascript
解决Can't find variable: SockJS vue项目的问题
Sep 22 #Javascript
解决vue-router 嵌套路由没反应的问题
Sep 22 #Javascript
You might like
从零开始 教你如何搭建Discuz!4.1论坛
2006/07/07 PHP
php中根据变量的类型 选择echo或dump
2012/07/05 PHP
通过缓存数据库结果提高PHP性能的原理介绍
2012/09/05 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
2014/07/22 PHP
php不使用copy()函数复制文件的方法
2015/03/13 PHP
如何修改Laravel中url()函数生成URL的根地址
2017/08/11 PHP
jQuery入门问答 整理的几个常见的初学者问题
2010/02/22 Javascript
Javascript 实用小技巧
2010/04/07 Javascript
基于jquery实现的服务器验证控件的启用和禁用代码
2010/04/27 Javascript
情人节之礼 js项链效果
2012/02/13 Javascript
javascript针对DOM的应用分析(三)
2012/04/15 Javascript
ExtJS中文乱码之GBK格式编码解决方案及代码
2013/01/20 Javascript
javascript实现日期格式转换
2014/12/16 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
2020/09/13 Javascript
AngularJS深入探讨scope,继承结构,事件系统和生命周期
2016/11/02 Javascript
根据Bootstrap Paginator改写的js分页插件
2016/12/25 Javascript
vue-cli 如何打包上线的方法示例
2018/05/08 Javascript
Angular ElementRef简介及其使用
2018/10/01 Javascript
vue-cli 3.x配置跨域代理的实现方法
2019/04/12 Javascript
让 babel webpack vue 配置文件支持智能提示的方法
2019/06/22 Javascript
js设置默认时间跨度过程详解
2019/07/17 Javascript
python中enumerate函数遍历元素用法分析
2016/03/11 Python
浅析Python中的多条件排序实现
2016/06/07 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
Python数据结构之图的应用示例
2018/05/11 Python
python 魔法函数实例及解析
2019/09/25 Python
Pytorch学习之torch用法----比较操作(Comparison Ops)
2020/06/28 Python
如何使用python记录室友的抖音在线时间
2020/06/29 Python
浅析Python requests 模块
2020/10/09 Python
高性能装备提升营地:Kammok
2019/02/27 全球购物
毕业证丢失证明
2014/01/15 职场文书
管理专员自荐信
2014/01/26 职场文书
创意广告词
2014/03/17 职场文书
大学生创业计划书
2014/08/14 职场文书
2016年小学圣诞节活动总结
2016/03/31 职场文书
2019交通安全宣传标语集锦!
2019/06/28 职场文书