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 相关文章推荐
JavaScript基本对象
Jan 11 Javascript
学习jquery之一
Apr 27 Javascript
解决window.opener=null;window.close(),只支持IE6不支持IE7,IE8的问题
Jan 14 Javascript
当某个文本框成为焦点时即清除文本框内容
Apr 28 Javascript
js数组与字符串的相互转换方法
Jul 09 Javascript
JavaScript将数组转换成CSV格式的方法
Mar 19 Javascript
详解JS中Array对象扩展与String对象扩展
Jan 07 Javascript
浅谈Vue-cli 命令行工具分析
Nov 22 Javascript
Bootstrap导航菜单点击后无法自动添加active的处理方法
Aug 10 Javascript
Cookbook组件形式:优化 Vue 组件的运行时性能
Nov 25 Javascript
详解vue2.0 资源文件assets和static的区别
Nov 27 Javascript
vue实现数据控制视图的原理解析
Jan 07 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
如何用PHP实现插入排序?
2013/04/10 PHP
php中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
PHP CodeBase:将时间显示为&quot;刚刚&quot;&quot;n分钟/小时前&quot;的方法详解
2013/06/06 PHP
Symfony2实现从数据库获取数据的方法小结
2016/03/18 PHP
在Yii2特定页面如何禁用调试工具栏Debug Toolbar详解
2017/08/07 PHP
关于PhpStorm设置点击编辑文件自动定位源文件的实现方式
2020/12/30 PHP
Js 中debug方式
2010/02/07 Javascript
Ajax搜索结果页面下方的分页按钮的生成
2012/04/05 Javascript
JavaScript(js)设置默认输入焦点(focus)
2012/12/28 Javascript
javascript中日期转换成时间戳的小例子
2013/03/21 Javascript
解析js如何获取当前url中的参数值并复制给input
2013/06/23 Javascript
javascript实现全角转半角的方法
2016/01/23 Javascript
javascript作用域、作用域链(菜鸟必看)
2016/06/16 Javascript
JS全角与半角转化实例(分享)
2017/07/04 Javascript
jQury Ajax使用Token验证身份实例代码
2017/09/22 Javascript
JavaScript深拷贝和浅拷贝概念与用法实例分析
2018/06/07 Javascript
深入理解JavaScript的值传递和引用传递
2018/10/24 Javascript
微信小程序在其他页面监听globalData中值的变化
2019/07/15 Javascript
vue 修改 data 数据问题并实时显示操作
2020/09/07 Javascript
[14:21]VICI vs EG (BO3)
2018/06/07 DOTA
用Python实现一个简单的线程池
2015/04/07 Python
Python实现网站注册验证码生成类
2017/06/08 Python
pandas中的series数据类型详解
2019/07/06 Python
python 控制Asterisk AMI接口外呼电话的例子
2019/08/08 Python
Python3从零开始搭建一个语音对话机器人的实现
2019/08/23 Python
Window10上Tensorflow的安装(CPU和GPU版本)
2020/12/15 Python
HTML5和CSS3实例教程总结(推荐)
2016/07/18 HTML / CSS
英国著名药妆店:Superdrug
2021/02/13 全球购物
Collection和Collections的区别
2016/05/02 面试题
气象学专业个人求职信
2014/03/15 职场文书
《少年王冕》教学反思
2014/04/11 职场文书
2014年电教工作总结
2014/12/19 职场文书
淘宝文案策划岗位职责
2015/04/14 职场文书
2015年信息技术教研组工作总结
2015/07/22 职场文书
jdbc使用PreparedStatement批量插入数据的方法
2021/04/27 MySQL
Python探索生命起源 matplotlib细胞自动机动画演示
2022/04/21 Python