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下用gb2312编码解码实现方法
Dec 31 Javascript
js利用与或运算符优先级实现if else条件判断表达式
Apr 15 Javascript
js简单实现标签云效果实例
Aug 06 Javascript
javascript实现unicode与ASCII相互转换的方法
Dec 10 Javascript
js实现功能比较全面的全选和多选
Mar 02 Javascript
JavaScript使用原型和原型链实现对象继承的方法详解
Apr 05 Javascript
ExtJs使用自定义插件动态保存表头配置(隐藏或显示)
Sep 25 Javascript
Angular 中使用 FineReport不显示报表直接打印预览
Aug 21 Javascript
js实现多个标题吸顶效果
Jan 08 Javascript
JS实现transform实现扇子效果
Jan 17 Javascript
Vue 技巧之控制父类的 slot
Feb 24 Javascript
原生JS运动实现轮播图
Jan 02 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 7的一些引人注目的新特性简单介绍
2015/11/08 PHP
php利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
Yii2.0建立公共方法简单示例
2019/01/29 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
2019/03/25 PHP
Laravel 创建指定表 migrate的例子
2019/10/09 PHP
灵活应用js调试技巧解决样式问题的步骤分享
2012/03/15 Javascript
学习从实践开始之jQuery插件开发 菜单插件开发
2012/05/03 Javascript
别了 JavaScript中的isXX系列
2012/08/01 Javascript
如何使用jquery动态加载js,css文件实现代码
2013/04/03 Javascript
纯js实现瀑布流展现照片(自动适应窗口大小)
2013/04/08 Javascript
jquery弹出框的用法示例(一)
2013/08/26 Javascript
JavaScript知识点整理
2015/12/09 Javascript
js判断某个字符出现的次数的简单实例
2016/06/03 Javascript
AngularJS 与百度地图的结合实例
2016/10/20 Javascript
jquery实时获取时间的简单实例
2017/01/26 Javascript
搭建一个Koa后端项目脚手架的方法步骤
2019/05/30 Javascript
怎么使用javascript深度拷贝一个数组
2019/06/06 Javascript
element中el-container容器与div布局区分详解
2020/05/13 Javascript
[00:58]PWL开团时刻DAY5——十人开雾0换5
2020/11/04 DOTA
python实现将pvr格式转换成pvr.ccz的方法
2015/04/28 Python
python制作websocket服务器实例分享
2016/11/20 Python
python对批量WAV音频进行等长分割的方法实现
2020/09/25 Python
基于python+selenium自动健康打卡的实现代码
2021/01/13 Python
CSS3 清除浮动的方法示例
2018/06/01 HTML / CSS
Canvas环形饼图与手势控制的实现代码
2019/11/08 HTML / CSS
网络艺术零售业的先驱者:artrepublic
2017/09/26 全球购物
100%有机精油,美容油:House of Pure Essence
2018/10/30 全球购物
Linden Leaves官网:新西兰纯净护肤品
2020/12/20 全球购物
什么是SCM(软件配置管理)
2014/08/16 面试题
大学毕业生的自我鉴定
2013/11/30 职场文书
小学母亲节活动方案
2014/03/14 职场文书
《李时珍夜宿古寺》教学反思
2014/04/09 职场文书
办公室打字员岗位职责
2014/04/16 职场文书
师范学院毕业生求职信
2014/06/24 职场文书
2014年班主任工作总结
2014/11/08 职场文书
选调生挂职锻炼工作总结
2015/10/23 职场文书