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 相关文章推荐
jQuery 使用手册(三)
Sep 23 Javascript
javascript显示用户停留时间的简单实例
Aug 05 Javascript
JQuery实现table行折叠效果以JSON做数据源
May 26 Javascript
使用HTML5+Boostrap打造简单的音乐播放器
Aug 05 Javascript
JavaScript易错知识点整理
Dec 05 Javascript
js移动端事件基础及常用事件库详解
Aug 15 Javascript
Vue中正确使用jQuery的方法
Oct 30 jQuery
使用Vue开发动态刷新Echarts组件的教程详解
Mar 22 Javascript
jQuery中可见性过滤器简单用法示例
Mar 31 jQuery
js取0-9随机取4个数不重复的数字代码实例
Mar 27 Javascript
jQuery - AJAX load() 实例用法详解
Aug 27 jQuery
JS实现图片幻灯片效果代码实例
May 21 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中的日期及时间
2006/11/23 PHP
一个PHP的远程图片抓取函数分享
2013/09/25 PHP
smarty模板引擎中自定义函数的方法
2015/01/22 PHP
PHP实现从远程下载文件的方法
2015/03/12 PHP
javascript之可拖动的iframe效果代码
2008/08/01 Javascript
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
2011/09/22 Javascript
文本有关的样式和jQuery求对象的高宽问题分别说明
2013/08/30 Javascript
基于promise.js实现nodejs的promises库
2014/07/06 NodeJs
浅谈JavaScript function函数种类
2014/12/29 Javascript
基于Jquery实现表单验证
2020/07/20 Javascript
easyui Droppable组件实现放置特效
2015/08/19 Javascript
iframe中子父类窗口调用JS的方法及注意事项
2015/08/25 Javascript
详解JS中Array对象扩展与String对象扩展
2016/01/07 Javascript
jquery悬浮提示框完整实例
2016/01/13 Javascript
基于nodejs 的多页面爬虫实例代码
2017/05/31 NodeJs
jQuery实现的两种简单弹窗效果示例
2018/04/18 jQuery
vue.js 图片上传并预览及图片更换功能的实现代码
2018/08/27 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
2020/05/28 Javascript
微信小程序 导入图标实现过程详解
2019/10/11 Javascript
原生js实现随机点名
2020/07/05 Javascript
盘点提高 Python 代码效率的方法
2014/07/03 Python
Python中将字典转换为XML以及相关的命名空间解析
2015/10/15 Python
pyqt5利用pyqtDesigner实现登录界面
2019/03/28 Python
python和php哪个更适合写爬虫
2020/06/22 Python
使用HTML5 Canvas API控制字体的显示与渲染的方法
2016/03/24 HTML / CSS
html5实现移动端适配完美写法
2017/11/16 HTML / CSS
H5最强接口之canvas实现动态图形功能
2019/05/31 HTML / CSS
美国卡车、吉普车和SUV零件网站:4 Wheel Parts
2016/11/24 全球购物
Tessabit美国:集世界奢侈品和设计师品牌的意大利精品买手店
2020/06/29 全球购物
Servlet方面面试题
2016/09/28 面试题
会计电算化专业应届大学生求职信
2013/10/22 职场文书
电子信息专业自荐书
2014/02/04 职场文书
计算机毕业生自荐信
2014/06/12 职场文书
行政专员岗位职责说明书
2014/07/30 职场文书
幼儿园教师师德师风承诺书
2015/04/28 职场文书
2015年校本培训工作总结
2015/07/24 职场文书