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 相关文章推荐
xtree.js 代码
Mar 13 Javascript
js中的布尔运算符使用介绍
Nov 20 Javascript
DOM基础教程之使用DOM控制表单
Jan 20 Javascript
JavaScript实现16进制颜色值转RGB的方法
Feb 09 Javascript
AngularJS模块管理问题的非常规处理方法
Apr 29 Javascript
JQueryEasyUI之DataGrid数据显示
Nov 23 Javascript
Angular2使用jQuery的方法教程
May 28 jQuery
vue组件watch属性实例讲解
Nov 07 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
Aug 27 Javascript
基于vue.js实现分页查询功能
Dec 29 Javascript
小程序绑定用户方案优化小结
May 15 Javascript
JS实现手写 forEach算法示例
Apr 29 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实现图象锐化代码
2007/06/14 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
Yii框架获取当前controlle和action对应id的方法
2014/12/03 PHP
php $_SESSION会员登录实例分享
2021/01/19 PHP
PHP使用curl制作简易百度搜索
2016/11/03 PHP
PHP中number_format()函数的用法讲解
2019/04/08 PHP
javascript+dom树型菜单类,希望朋友们一起进步
2007/05/03 Javascript
DOM下的节点属性和操作小结
2009/05/14 Javascript
斜45度寻路实现函数
2009/08/20 Javascript
js自动闭合html标签(自动补全html标记)
2012/10/04 Javascript
jQuery插件HighCharts实现的2D回归直线散点效果示例【附demo源码下载】
2017/03/09 Javascript
浅谈Vue数据绑定的原理
2018/01/08 Javascript
Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法
2018/09/15 Javascript
Vue.js实现的购物车功能详解
2019/01/27 Javascript
Python利用FFT进行简单滤波的实现
2020/02/26 Python
python sitk.show()与imageJ结合使用常见的问题
2020/04/20 Python
使用Numpy对特征中的异常值进行替换及条件替换方式
2020/06/08 Python
什么是python类属性
2020/06/10 Python
详解python程序中的多任务
2020/09/16 Python
python 用Matplotlib作图中有多个Y轴
2020/11/28 Python
eBay意大利购物网站:eBay.it
2019/09/04 全球购物
MYSQL支持事务吗
2013/08/09 面试题
计算机大学生的自我评价
2013/10/15 职场文书
法警的竞聘演讲稿
2014/01/02 职场文书
预备党员转正思想汇报
2014/01/12 职场文书
幼儿园五一活动方案
2014/02/07 职场文书
电台实习生求职信
2014/02/25 职场文书
英语教师自荐信
2014/05/26 职场文书
爱护公共设施标语
2014/06/24 职场文书
化学教育专业求职信
2014/07/08 职场文书
党的群众路线教育实践活动查摆剖析材料
2014/10/10 职场文书
2014年高三班主任工作总结
2014/12/05 职场文书
2015大一新生军训感言
2015/08/01 职场文书
医生行业员工的辞职信
2019/06/24 职场文书
python tkinter实现定时关机
2021/04/21 Python
JavaScript原型链中函数和对象的理解
2022/06/16 Javascript