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 相关文章推荐
Convert Seconds To Hours
Jun 16 Javascript
JavaScript写的一个DIV 弹出网页对话框
Aug 14 Javascript
JS操作JSON方法总结(推荐)
Jun 14 Javascript
jQuery控制元素隐藏和显示
Mar 03 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
Mar 11 Javascript
jQuery实现简单的滑动导航代码(移动端)
May 22 jQuery
浅谈JavaScript的innerWidth与innerHeight
Oct 12 Javascript
在vue组件中使用axios的方法
Mar 16 Javascript
JS实现移动端点击按钮复制文本内容
Jul 28 Javascript
Layui tree 下拉菜单树的实例代码
Sep 21 Javascript
Vue 通过公共字段,拼接两个对象数组的实例
Nov 07 Javascript
基于Vue实现微前端的示例代码
Apr 24 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实现WEB动态网页静态
2006/10/09 PHP
PHP去掉从word直接粘贴过来的没有用格式的函数
2012/10/29 PHP
PHP写的资源下载防盗链类分享
2014/05/12 PHP
php分页函数完整实例代码
2014/09/22 PHP
初识PHP中的Swoole
2016/04/05 PHP
php7 参数、整形及字符串处理机制修改实例分析
2020/05/25 PHP
PHP vsprintf()函数格式化字符串操作原理解析
2020/07/14 PHP
学习ExtJS fit布局使用说明
2009/10/08 Javascript
editable.js 基于jquery的表格的编辑插件
2011/10/24 Javascript
主页面中的两个iframe实现鼠标拖动改变其大小
2013/04/16 Javascript
JScript分割字符串示例代码
2013/09/04 Javascript
Textarea根据内容自适应高度
2013/10/28 Javascript
javascript实现复选框超过限制即弹出警告框的方法
2015/02/25 Javascript
js jquery获取当前元素的兄弟级 上一个 下一个元素
2015/09/01 Javascript
Bootstrap基本组件学习笔记之列表组(11)
2016/12/07 Javascript
原生JS实现Ajax跨域请求flask响应内容
2017/10/24 Javascript
vue生命周期实例小结
2018/08/15 Javascript
node实现爬虫的几种简易方式
2019/08/22 Javascript
react实现移动端下拉菜单的示例代码
2020/01/16 Javascript
python读写二进制文件的方法
2015/05/09 Python
Python实现建立SSH连接的方法
2015/06/03 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
Numpy之random函数使用学习
2019/01/29 Python
python制作抖音代码舞
2019/04/07 Python
python实现PDF中表格转化为Excel的方法
2020/06/16 Python
CSS3实现歌词进度文字颜色填充变化动态效果的思路详解
2020/06/02 HTML / CSS
Tessabit美国:集世界奢侈品和设计师品牌的意大利精品买手店
2020/06/29 全球购物
教师自我反思材料
2014/02/14 职场文书
活动倡议书范文
2014/05/13 职场文书
实践论读书笔记
2015/06/29 职场文书
诚信教育主题班会
2015/08/13 职场文书
对Keras自带Loss Function的深入研究
2021/05/25 Python
js Proxy的原理详解
2021/05/25 Javascript
SpringBoot项目中控制台日志的保存配置操作
2021/06/18 Java/Android
警用民用对讲机找不同
2022/02/18 无线电
Mybatis-plus配置分页插件返回统一结果集
2022/06/21 Java/Android