vue如何实现一个电子签名组件?

vue如何实现一个电子签名组件?

在生活中我们使用到电子签名最多的地方可能就是银行了,每次都会让你留下大名。今天我们就要用vue实现一个电子签名的面板

想要绘制图形,第一步想到的就是使用canvas标签,在之前的文章里我们使用canvas实现了一个前端生成图形验证码的组件,被吐槽不够安全,那么这个电子签名组件想必不会被吐槽了吧~

canvas

 标签是 HTML 5 中的新标签。 标签只是图形容器,您必须使用脚本来绘制图形。

登录后复制

canvas标签本身是没有绘图能力的,所有的绘制工作必须在 JavaScript 内部完成。

使用canvas绘图有几个必要的步骤:

获取canvas元素通过canvas元素创建context对象通过context对象来绘制图形

在当前电子签名需求中,由于签名其实是由一条条线组成的,因此我们会用到以下几个方法:

立即学习“前端免费学习笔记(深入)”;

beginPath() :开始一条路径或重置当前的路径moveTo():把路径移动到画布中的指定点,不创建线条lineTo():添加一个新点,然后在画布中创建从该点到最后指定点的线条stroke():绘制已定义的路径closePath():创建从当前点回到起始点的路径

事件

想要在canvas中绘图,还需要绑定几个特定的事件,而这些事件在pc端和手机端不尽相同

pc端事件

mousedownmousemovemouseup

手机端事件

touchstarttouchmovetouchend

核心代码

初始化canvas标签并绑定事件


登录后复制

获取画笔

在mounted生命周期初始化

mounted() {    let canvas = this.$refs.canvasF;    canvas.height = this.$refs.canvasHW.offsetHeight - 100;    canvas.width = this.$refs.canvasHW.offsetWidth - 10;    this.canvasTxt = canvas.getContext("2d");    this.canvasTxt.strokeStyle = this.color;    this.canvasTxt.lineWidth = this.linewidth;  }

登录后复制

事件处理

mouseDown

//电脑设备事件    mouseDown(ev) {      ev = ev || event;      ev.preventDefault();      let obj = {        x: ev.offsetX,        y: ev.offsetY      };      this.startX = obj.x;      this.startY = obj.y;      this.canvasTxt.beginPath();//开始作画      this.points.push(obj);//记录点      this.isDown = true;    },

登录后复制

touchStart

//移动设备事件touchStart(ev) {ev = ev || event;ev.preventDefault();  if (ev.touches.length == 1) {    this.isDraw = true; //签名标记    let obj = {      x: ev.targetTouches[0].clientX,      y:        ev.targetTouches[0].clientY -        (document.body.offsetHeight * 0.5 +          this.$refs.canvasHW.offsetHeight * 0.1)    };     //y的计算值中:document.body.offsetHeight*0.5代表的是除了整个画板signatureBox剩余的高,    //this.$refs.canvasHW.offsetHeight*0.1是画板中标题的高    this.startX = obj.x;    this.startY = obj.y;    this.canvasTxt.beginPath();//开始作画    this.points.push(obj);//记录点  }},

登录后复制

mouseMove

//电脑设备事件    mouseMove(ev) {      ev = ev || event;      ev.preventDefault();      if (this.isDown) {        let obj = {          x: ev.offsetX,          y: ev.offsetY        };        this.moveY = obj.y;        this.moveX = obj.x;        this.canvasTxt.moveTo(this.startX, this.startY);//移动画笔        this.canvasTxt.lineTo(obj.x, obj.y);//创建线条        this.canvasTxt.stroke();//画线        this.startY = obj.y;        this.startX = obj.x;        this.points.push(obj);//记录点      }    },

登录后复制

touchMove

//移动设备事件    touchMove(ev) {      ev = ev || event;      ev.preventDefault();      if (ev.touches.length == 1) {        let obj = {          x: ev.targetTouches[0].clientX,          y:            ev.targetTouches[0].clientY -            (document.body.offsetHeight * 0.5 +              this.$refs.canvasHW.offsetHeight * 0.1)        };        this.moveY = obj.y;        this.moveX = obj.x;        this.canvasTxt.moveTo(this.startX, this.startY);//移动画笔        this.canvasTxt.lineTo(obj.x, obj.y);//创建线条        this.canvasTxt.stroke();//画线        this.startY = obj.y;        this.startX = obj.x;        this.points.push(obj);//记录点      }    },

登录后复制

mouseUp

//电脑设备事件    mouseUp(ev) {      ev = ev || event;      ev.preventDefault();      if (1) {        let obj = {          x: ev.offsetX,          y: ev.offsetY        };        this.canvasTxt.closePath();//收笔        this.points.push(obj);//记录点        this.points.push({ x: -1, y: -1 });        this.isDown = false;      }    },

登录后复制

touchEnd

//移动设备事件    touchEnd(ev) {      ev = ev || event;      ev.preventDefault();      if (ev.touches.length == 1) {        let obj = {          x: ev.targetTouches[0].clientX,          y:            ev.targetTouches[0].clientY -            (document.body.offsetHeight * 0.5 +              this.$refs.canvasHW.offsetHeight * 0.1)        };        this.canvasTxt.closePath();//收笔        this.points.push(obj);//记录点        this.points.push({ x: -1, y: -1 });//记录点      }    },

登录后复制

重写

发现自己写错字了,擦掉画板重新写过

//重写    overwrite() {      this.canvasTxt.clearRect(        0,        0,        this.$refs.canvasF.width,        this.$refs.canvasF.height      );      this.points = [];      this.isDraw = false; //签名标记    },

登录后复制

用到的data

data() {    return {      points: [],      canvasTxt: null,      startX: 0,      startY: 0,      moveY: 0,      moveX: 0,      endY: 0,      endX: 0,      w: null,      h: null,      isDown: false,      color: "#000",      linewidth: 3,      isDraw: false //签名标记    };  },

登录后复制

1.jpg

相关推荐:

2020年前端vue面试题大汇总(附答案)

2020年前端vue面试题大汇总(附答案)

更多编程相关知识,请访问:2020年前端vue面试题大汇总(附答案)!!

以上就是vue如何实现一个电子签名组件?的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/3023116.html

(0)
上一篇 2025年3月13日 06:03:12
下一篇 2025年2月20日 06:04:25

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 深入了解Vue自带的过滤器

    过滤器是一个通过输入数据,能够及时对数据进行处理并返回一个数据结果的简单函数。Vue有很多很便利的过滤器,本文为大家介绍了vue自带的9种过滤器,希望对大家有一定的帮助。 一、过滤器写法 {{ message | Filter}} 登录后复…

    2025年3月13日
    200
  • vue如何实现局部刷新?(代码示例)

    我们都知道,vue的组件化是他最强大的核心所在,路由也是特别可爱的一部分,但是路由适合一些大型的组件,看url路径的时候会出现变化,但是有时候我们想要一些小的局部小刷新,这个时候就需要用到它的动态组件了。 Vue 自身保留的  元素,可以将…

    2025年3月13日
    200
  • 详解vue中的数据初始化(initState)

    下面vue.js教程栏目带大家了解一下vue中的数据初始化(initstate)。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 数据初始化 Vue 实例在建立的时候会运行一系列的初始化操作,而在这些初始化操作里面,和数据…

    2025年3月13日
    200
  • 深入了解vue中的计算属性

    下面vue.js教程栏目带大家了解一下vue中的计算属性。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 一、什么是计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且…

    2025年3月13日
    200
  • 浅谈vue中axios的封装

    下面vue.js教程栏目带大家了解一下vue中axios的封装。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 vue中axios的封装 第一步还是先下载axios cnpm install axios -S 登录后复制 …

    2025年3月13日
    200
  • vue如何动态绑定class?方法介绍

    Vue.js 的核心是一个响应的数据绑定系统,它允许我们在普通 HTML 模板中使用特殊的语法将 DOM “绑定”到底层数据。 被绑定的DOM 将与数据保持同步,每当数据有改动,相应的DOM视图也会更新。基于这种特性,通过vue.js动态绑…

    2025年3月13日
    200
  • 详解Vue中动态添加类名的方法

    能够向组件添加动态类名是非常强大的功能。它使我们可以更轻松地编写自定义主题,根据组件的状态添加类,还可以编写依赖于样式的组件的不同变体。 添加动态类名与在组件中添加 prop :class=”classname”一样…

    2025年3月13日
    200
  • vue中递归组件的实现方法介绍(附实例:三级菜单)

    下面vue.js教程栏目通过实例制作一个三级菜单,来介绍vue中递归组件的实现方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 js里面有递归算法,同时,我们也可以利用props来实现vue模板的递归调用,但是前提是组…

    2025年3月13日
    200
  • vue中路由之间如何通讯?方法介绍

    下面vue.js教程栏目给大家介绍一下vue中向路由组件传递props的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 父子间的组件通讯是通过props和$emit来实现的,那么路由之间的通讯呢,往下看: 我现在再w…

    2025年3月13日 编程技术
    200
  • vue+webpack2实现路由懒加载的方法介绍

    下面vue.js教程栏目给大家介绍一下vue+webpack2实现路由的懒加载的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 当打包构建应用时,Javascript 包会变得非常大,影响页面加载。如果我们能把不同路…

    2025年3月13日
    200

发表回复

登录后才能评论