基于canvas实现手写签名(vue)


Posted in Javascript onMay 21, 2020

最近一直在研究canvas的东西,正好之前对手写签名这块有点兴趣。就自己基于vue写了一个简易的手写签名demo。

其中原理比较简单,先生成一个canvas画布,并对canvas进行touchstart和touchmove事件进行监听。当监听touchstart事件被触发时,我们开始触发canvas里的beginPath事件并且设置moveTo原始点。当监听touchmove事件则去不断去触发lineTo事件,最后stroke()。

demo里还有清除签名和保存签名的功能,分别对应了clearRect()和toDataURL()方法。

具体的demo代码如下:

<template>
  <div>
    <canvas id="canvas" width="300" height="150">

    </canvas>
    <div class="btn">
     <span @click="toClear()">清除</span>
     <span @click="toSave()">保存</span>
    </div>
  </div>
</template>

<script>
  export default {
    name: "sign-name",
    data(){
     return {
       ctx:null,
       canvas:null
     }
    },
    mounted() {
     this.initPage()
    },
    methods:{
     initPage() {
      this.canvas = document.getElementById('canvas')
      if(this.canvas.getContext){
       this.ctx = this.canvas.getContext('2d')
       let background = "#ffffff"
       this.ctx.lineCap = 'round'
       this.ctx.fillStyle = background
       this.ctx.lineWidth = 2
       this.ctx.fillRect(0,0,350,150)

       this.canvas.addEventListener("touchstart",(e)=>{
        console.log(123,e)
        this.ctx.beginPath()
        this.ctx.moveTo(e.changedTouches[0].pageX,e.changedTouches[0].pageY)
       })

       this.canvas.addEventListener("touchmove",(e)=>{
        this.ctx.lineTo(e.changedTouches[0].pageX,e.changedTouches[0].pageY)
        this.ctx.stroke()
       })

      }
     },
     toClear() {
      this.ctx.clearRect(0,0,300,150)
     },
     toSave() {
      let base64Img = this.canvas.toDataURL()
      console.log(123,base64Img)
     }
    }

  }
</script>

<style lang="scss" scoped>
 .btn {
  height: px2Vw(55);
  position: fixed;
  bottom: 0;
  line-height: px2Vw(55);
  border-top: px2Vw(1) solid #f7f8f9;
  span {
   display: inline-block;
   width: px2Vw(185);
   text-align: center;
  }
 }
 canvas {
  position: fixed;
  border: 2px dashed #cccccc;
  float: right;
 }
</style>

代码运行后的效果图如下:

基于canvas实现手写签名(vue)

基于canvas实现手写签名(vue)

这只是个简易的demo,肯定会有很多未考虑到的地方。demo的下载地址

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript调用客户端的可执行文件(示例代码)
Nov 28 Javascript
jQuery结合HTML5制作的爱心树表白动画
Feb 01 Javascript
JavaScript截取、切割字符串的技巧
Jan 07 Javascript
用JavaScript动态建立或增加CSS样式表的实现方法
May 20 Javascript
浅谈jquery中的each方法$.each、this.each、$.fn.each
Jun 23 Javascript
浅谈jquery高级方法描述与应用
Oct 04 Javascript
浅谈JavaScript中的属性:如何遍历属性
Sep 14 Javascript
对vue下点击事件传参和不传参的区别详解
Sep 15 Javascript
一文快速了解JQuery中的AJAX
May 31 jQuery
微信小程序位置授权处理方法
Jun 13 Javascript
layui 选择列表,打勾,点击确定返回数据的例子
Sep 02 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
Sep 29 Javascript
jQuery实现移动端笔触canvas电子签名
May 21 #jQuery
js cavans实现静态滚动弹幕
May 21 #Javascript
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
May 21 #Javascript
JavaScript实现HSL拾色器
May 21 #Javascript
js实现拾色器插件(ColorPicker)
May 21 #Javascript
原生js实现日期选择插件
May 21 #Javascript
vue+Element中table表格实现可编辑(select下拉框)
May 21 #Javascript
You might like
PHP写入WRITE编码为UTF8的文件的实现代码
2008/07/07 PHP
Laravel框架模板继承操作示例
2018/06/11 PHP
php微信开发之图片回复功能
2018/06/14 PHP
又一个图片自动缩小的JS代码
2007/03/10 Javascript
Array, Array Constructor, for in loop, typeof, instanceOf
2011/09/13 Javascript
javascript面向对象编程代码
2011/12/19 Javascript
Javascript算符的优先级介绍
2013/03/20 Javascript
jQuery对象的selector属性用法实例
2014/12/27 Javascript
JavaScript Math.ceil 方法(对数值向上取整)
2015/01/09 Javascript
简介JavaScript中的setTime()方法的使用
2015/06/11 Javascript
JavaScript利用Date实现简单的倒计时实例
2017/01/12 Javascript
详解基于vue-cli配置移动端自适应
2018/01/13 Javascript
nodeJS服务器的创建和重新启动的实现方法
2018/05/12 NodeJs
Nodejs 发布自己的npm包并制作成命令行工具的实例讲解
2018/05/15 NodeJs
详解wepy开发小程序踩过的坑(小结)
2019/05/22 Javascript
关于uniApp editor微信滑动问题
2021/01/15 Javascript
python有证书的加密解密实现方法
2014/11/19 Python
Python中列表、字典、元组、集合数据结构整理
2014/11/20 Python
安装ElasticSearch搜索工具并配置Python驱动的方法
2015/12/22 Python
Python切片知识解析
2016/03/06 Python
Python将多个list合并为1个list的方法
2018/06/27 Python
Python实现Dijkstra算法
2018/10/17 Python
Python设计模式之组合模式原理与用法实例分析
2019/01/11 Python
Pytorch之finetune使用详解
2020/01/18 Python
Python3 mmap内存映射文件示例解析
2020/03/23 Python
使用python+poco+夜神模拟器进行自动化测试实例
2020/04/23 Python
Python PyQt5运行程序把输出信息展示到GUI图形界面上
2020/04/27 Python
python 邮件检测工具mmpi的使用
2021/01/04 Python
adidas澳大利亚官方网站:adidas Australia
2018/04/15 全球购物
美国马匹用品和马钉购物网站:State Line Tack
2018/08/05 全球购物
影视艺术学院毕业生自荐信
2013/11/13 职场文书
就业推荐表院系意见
2015/06/05 职场文书
2016母亲节感恩话语
2015/12/09 职场文书
基于Redis过期事件实现订单超时取消
2021/05/08 Redis
深入理解mysql事务隔离级别和存储引擎
2022/04/12 MySQL
win10系统计算机图标怎么调出来?win10调出计算机图标的方法
2022/08/14 数码科技