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 相关文章推荐
JS 实现图片直接下载示例代码
Jul 22 Javascript
使用ajax+jqtransform实现动态加载select
Dec 01 Javascript
js获取会话框prompt的返回值的方法
Jan 10 Javascript
javascript字符串与数组转换汇总
May 26 Javascript
jQuery实现带分组数据的Table表头排序实例分析
Nov 24 Javascript
浅谈jQuery中的checkbox问题
Aug 10 Javascript
js移动焦点到最后位置的简单方法
Nov 25 Javascript
浅析JavaScript中的平稳退化(graceful degradation)
Jul 24 Javascript
详解webpack-dev-server 设置反向代理解决跨域问题
Apr 18 Javascript
使用jquery-easyui的布局layout写后台管理页面的代码详解
Jun 19 jQuery
React学习之受控组件与数据共享实例分析
Jan 06 Javascript
浅析JS中NEW的实现原理及重写
Feb 20 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
受疫情影响 动画《Re从零开始的异世界生活》第二季延期至7月
2020/03/10 日漫
用PHP连接Oracle for NT 远程数据库
2006/10/09 PHP
php学习之数据类型之间的转换代码
2011/05/29 PHP
php 字符串替换的方法
2012/01/10 PHP
简单谈谈PHP中strlen 函数
2016/02/27 PHP
基于thinkphp6.0的success、error实现方法
2019/11/05 PHP
JavaScrip实现PHP print_r的数功能(三种方法)
2013/11/12 Javascript
jquery实现动态操作select选中
2015/02/11 Javascript
js中for in语句的用法讲解
2015/04/24 Javascript
纯javascript实现分页(两种方法)
2015/08/26 Javascript
第一次接触神奇的Bootstrap表单
2016/07/27 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/10/05 Javascript
Bootstrap如何创建表单
2016/10/21 Javascript
jQuery EasyUI 获取tabs的实例解析
2016/12/06 Javascript
简单谈谈关于Angular Cli打包的事
2017/09/05 Javascript
浅谈JavaScript作用域和闭包
2017/09/18 Javascript
vue router 用户登陆功能的实例代码
2019/04/24 Javascript
js实现贪吃蛇游戏 canvas绘制地图
2020/09/09 Javascript
Vue实现菜单切换功能
2020/11/08 Javascript
[05:05]给小松五分钟系列 第二期介绍为什么打DOTA2
2014/07/02 DOTA
利用Celery实现Django博客PV统计功能详解
2017/05/08 Python
python虚拟环境的安装配置图文教程
2017/10/20 Python
python 简单备份文件脚本v1.0的实例
2017/11/06 Python
Python学习之Anaconda的使用与配置方法
2018/01/04 Python
Python使用pyh生成HTML文档的方法示例
2018/03/10 Python
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
2018/03/22 Python
python3读取csv和xlsx文件的实例
2018/06/22 Python
Python itertools.product方法代码实例
2020/03/27 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
前端面试必备之CSS3的新特性
2017/09/05 HTML / CSS
英国在线珠宝店:The Jewel Hut
2017/03/20 全球购物
1688平价精选商城:阿里集团旗下,工厂出厂价格直销
2017/04/24 全球购物
英国复古和经典球衣网站:Vintage Football Shirts
2018/10/05 全球购物
武汉瑞得软件笔试题
2015/10/27 面试题
公司党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
Java Spring Lifecycle的使用
2022/05/06 Java/Android