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 相关文章推荐
在HTML代码中使用JavaScript代码的例子
Oct 16 Javascript
js实现文字跟随鼠标移动而移动的方法
Feb 28 Javascript
js+jquery常用知识点汇总
Mar 03 Javascript
不能不知道的10个angularjs英文学习网站
Mar 23 Javascript
jQuery事件绑定on()与弹窗实现代码
Apr 28 Javascript
jQuery获取当前点击的对象元素(实现代码)
May 19 Javascript
jQuery ajax MD5实现用户注册即时验证功能
Oct 11 Javascript
如何理解Vue的v-model指令的使用方法
Jul 19 Javascript
JavaScript中为事件指定处理程序的五种方式分析
Jul 27 Javascript
jQuery ajax仿Google自动提示SearchSuggess功能示例
Mar 28 jQuery
js脚本中执行java后台代码方法解析
Oct 11 Javascript
Vue过渡效果之CSS过渡详解(结合transition,animation,animate.css)
Feb 05 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获取当前时间的毫秒数的方法
2014/01/26 PHP
Laravel 5框架学习之数据库迁移(Migrations)
2015/04/08 PHP
PHP  Yii清理缓存的实现方法
2016/11/10 PHP
浅谈php中fopen不能创建中文文件名文件的问题
2017/02/06 PHP
Prototype源码浅析 Enumerable部分(二)
2012/01/18 Javascript
jQuery的attr与prop使用介绍
2013/10/10 Javascript
javascript删除option选项的多种方法总结
2013/11/22 Javascript
angularJS结合canvas画图例子
2015/02/09 Javascript
jquery图片倾斜层叠切换特效代码分享
2015/08/27 Javascript
JS实现网页Div层Clone拖拽效果
2015/09/26 Javascript
Js动态设置rem来实现移动端字体的自适应代码
2016/10/14 Javascript
jQuery实现表格与ckeckbox的全选与单选功能
2016/11/24 Javascript
基于Node.js + WebSocket打造即时聊天程序嗨聊
2016/11/29 Javascript
Jquery Easyui分割按钮组件SplitButton使用详解(17)
2016/12/18 Javascript
用js限制网页只在微信浏览器中打开(或者只能手机端访问)
2020/12/24 Javascript
浅析JavaScript 函数防抖和节流
2020/07/13 Javascript
vite2.0+vue3移动端项目实战详解
2021/03/03 Vue.js
python 循环while和for in简单实例
2016/08/16 Python
浅谈Python里面小数点精度的控制
2018/07/16 Python
python pygame实现滚动横版射击游戏城市之战
2019/11/25 Python
用pytorch的nn.Module构造简单全链接层实例
2020/01/14 Python
Python多个装饰器的调用顺序实例解析
2020/05/22 Python
Win10下用Anaconda安装TensorFlow(图文教程)
2020/06/18 Python
Python调用百度OCR实现图片文字识别的示例代码
2020/07/17 Python
用HTML5中的Canvas结合公式绘制粒子运动的教程
2015/05/08 HTML / CSS
AmazeUI 评论列表的实现示例
2020/08/13 HTML / CSS
ROSEFIELD手表荷兰官方网上商店:北欧极简设计女士腕表品牌
2018/01/24 全球购物
美国排名第一的葡萄酒俱乐部:Firstleaf Wine Club
2020/01/02 全球购物
MyBag中文网:英国著名的时尚包袋电商零售网站
2020/07/31 全球购物
介绍一下Java的事务处理
2012/12/07 面试题
八一建军节部队活动方案
2014/02/04 职场文书
乡镇干部十八大感言
2014/02/17 职场文书
邻里守望志愿服务活动方案
2014/08/15 职场文书
庆六一文艺汇演活动方案
2014/08/26 职场文书
会计岗位职责
2015/02/03 职场文书
Windows环境下实现批量执行Sql文件
2021/10/05 SQL Server