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 相关文章推荐
document.getElementById为空或不是对象的解决方法
Jan 24 Javascript
AngularJs 弹出模态框(model)
Apr 07 Javascript
Bootstrap导航条学习使用(二)
Feb 08 Javascript
bootstrap select下拉搜索插件使用方法详解
Nov 23 Javascript
浅谈 Vue 项目优化的方法
Dec 16 Javascript
AngularJS实现的生成随机数与猜数字大小功能示例
Dec 25 Javascript
vue的列表交错过渡实现代码示例
May 05 Javascript
uni app仿微信顶部导航条功能
Sep 17 Javascript
基于javascript处理nginx请求过程详解
Jul 07 Javascript
小程序自定义弹框效果
Nov 16 Javascript
Vertx基于EventBus发送接受自定义对象
Nov 16 Javascript
浅析VUE防抖与节流
Nov 24 Vue.js
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解析mht文件转换成html的实例
2017/03/13 PHP
php实现评论回复删除功能
2017/05/23 PHP
用js实现的页面关键字密度查询代码
2007/12/27 Javascript
jquery parent和parents的区别分析
2013/10/02 Javascript
javascript 小数取整简单实现方式
2014/05/30 Javascript
由ReactJS的Hello world说开来
2015/07/02 Javascript
js实现滚动条滚动到页面底部继续加载
2015/12/19 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
2016/02/16 Javascript
让编辑器支持word复制黏贴、截屏的js代码
2016/10/17 Javascript
JS生成随机打乱数组的方法示例
2017/12/23 Javascript
JavaScript动态添加数据到表单并提交的几种方式
2019/06/26 Javascript
Vue项目中使用WebUploader实现文件上传的方法
2019/07/21 Javascript
JavaScript的变量声明与声明提前用法实例分析
2019/11/26 Javascript
微信小程序点击保存图片到本机功能
2019/12/13 Javascript
vue-cli创建的项目中的gitHooks原理解析
2020/02/14 Javascript
javascript代码实现简易计算器
2021/01/25 Javascript
[02:41]辉夜杯现场一家三口 “我爸玩风行 我玩血魔”
2015/12/27 DOTA
[47:22]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python编程实现随机生成多个椭圆实例代码
2018/01/03 Python
pyhton列表转换为数组的实例
2018/04/04 Python
用Django写天气预报查询网站
2018/10/21 Python
从0开始的Python学习016异常
2019/04/08 Python
python+webdriver自动化环境搭建步骤详解
2019/06/03 Python
Django中提供的6种缓存方式详解
2019/08/05 Python
Django ORM实现按天获取数据去重求和例子
2020/05/18 Python
python Matplotlib模块的使用
2020/09/16 Python
Theory美国官网:后现代都市风时装品牌
2018/05/09 全球购物
德国大型箱包和皮具商店:Koffer
2019/10/01 全球购物
Oracle里面常用的数据字典有哪些
2014/02/14 面试题
中海讯通笔试题
2015/09/15 面试题
领导检查欢迎词
2014/01/14 职场文书
清明节扫墓活动方案
2014/03/02 职场文书
考试作弊检讨书怎么写?
2014/12/21 职场文书
2015共产党员公开承诺书
2015/01/22 职场文书
从QQtabBar看css命名规范BEM的详细介绍
2021/08/07 HTML / CSS
使用CSS实现六边形的图片效果
2022/08/05 HTML / CSS