vue使用canvas实现移动端手写签名
作者:95後开发妹纸~ 时间:2024-10-28 16:52:46
基于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;}
}
效果图:
就到这里吧!
来源:https://blog.csdn.net/weixin_47679798/article/details/108695258
标签:vue,canvas,手写签名
0
投稿
猜你喜欢
MySQL系列之redo log、undo log和binlog详解
2024-01-17 16:30:59
vue项目动态设置页面title及是否缓存页面的问题
2024-04-10 10:23:52
Django 中间键和上下文处理器的使用
2022-04-19 05:04:56
IE7 与 IE6 的模式窗口尺寸差异
2008-03-06 13:49:00
使用Python制作新型冠状病毒实时疫情图
2023-03-01 20:17:19
MySQL Workbench下载与使用教程详解
2024-01-13 18:50:26
使用Anaconda3建立虚拟独立的python2.7环境方法
2023-10-01 20:10:43
10分钟用Python快速搭建全文搜索引擎详解流程
2023-11-06 16:13:41
在VS2017中用C#调用python脚本的实现
2021-09-19 00:59:06
python列表list保留顺序去重的实例
2023-04-29 06:11:57
Python内置的字符串处理函数详细整理(覆盖日常所用)
2023-10-10 22:46:36
Python实现打乒乓小游戏
2023-07-20 04:48:53
python3 QT5 端口转发工具两种场景分析
2023-04-03 10:34:46
css把超出的部分显示为省略号的方法兼容火狐
2010-10-07 09:02:44
js判断输入字符串是否为空、空格、null的方法总结
2024-04-19 09:56:56
numpy中索引和切片详解
2022-06-07 16:19:05
sql基本查询语句介绍
2008-05-21 13:58:00
MySQL中存储的数据查询的时候如何区分大小写
2024-01-21 12:01:27
Bootstrap学习笔记之css样式设计(1)
2024-04-26 17:15:01
python贪婪匹配以及多行匹配的实例讲解
2021-12-27 20:01:04