sign-canvas 一个基于canvas开发,封装于Vue组件的通用手写签名板(电子签名板),支持pc端和移动端;

article/2025/7/2 4:32:49

写在前面 :

在项目的开发过程中可能会涉及到手写签名(电子签名)那些,在前端的思路是使用canvas 来签名,导出成图片进行保存。

此轮子是继 https://blog.csdn.net/qq_33270001/article/details/81809535之后,用于vue项目中,为了方便自己与众人和复用而开发;

相比以前:

1. 增加npm 包,可直接安装并使用,

2. 增加v-model 动态绑定,有人可能觉得有点鸡肋了,但是如果有哪种场景,也是可以适用的.

3. 增加图片一键下载的方法.可以直接导出为png 或者 jpeg的图片.

这是以前的 "注意:在移动端使用的时候, 写竖的时候, 页面会被往下拉, 手写板动了, 写字不顺畅. 建议在移动端的touchmove事件里, 加一行防止页的滑动事件, 代码是: event.preventDefault()" 现在已经处理了.

废话不多说,上项目和代码

 vue-sign-canvas项目地址: https://github.com/langyuxiansheng/vue-sign-canvas

在线演示: https://langyuxiansheng.github.io/vue-sign-canvas/

基础用法

┭┮﹏┭┮ 因为 vue-sign-canvas 的包名被占用了,只好去掉一个前缀了....假如此轮子对你有帮助,请顺手star一下吧.o(* ̄︶ ̄*)o

开始使用! 下载安装npm包

npm i sign-canvas --save
//全局注册 main.js
import SignCanvas from 'sign-canvas';Vue.use(SignCanvas);

你可以这样使用: 

组件模板使用

<template><div id="app"><h2 class="title">Vue Sign Canvas 电子签名板</h2><sign-canvas class="sign-canvas" ref="SignCanvas" :options="options" v-model="value"/><img v-if="value" class="view-image" :src="value" width="150" height="150"><div class="config"><ul class="ul-config"><li class="li-c"><span class="item-label">书写速度:</span><span class="item-content"><select name="isSign" v-model="options.isSign"><option :value="true">签名</option><option :value="false">写字</option></select></span></li><li class="li-c"><span class="item-label">显示边框/网格:</span><span class="item-content"><select name="isSign" v-model="options.isShowBorder"><option :value="true">显示</option><option :value="false">不显示</option></select></span></li><li class="li-c"><span class="item-label">下笔宽度:</span><span class="item-content"><input v-model="options.writeWidth" type="number"></span></li><li class="li-c"><span class="item-label">线条的边缘类型:</span><span class="item-content"><select name="lineCap" v-model="options.lineCap"><option value="butt">平直的边缘</option><option value="round">圆形线帽</option><option value="square">正方形线帽</option></select></span></li><li class="li-c"><span class="item-label">线条交汇时边角的类型:</span><span class="item-content"><select name="lineCap" v-model="options.lineJoin"><option value="bevel">创建斜角</option><option value="round">创建圆角</option><option value="miter">创建尖角</option></select></span></li><li class="li-c"><span class="item-label">画笔颜色:</span><span class="item-content"><input type="color" v-model="options.writeColor"></span></li><li class="li-c"><span class="item-label">背景色:</span><span class="item-content"><input type="color" v-model="options.bgColor"></span></li></ul></div><div class="sign-btns"><span id="clear" @click="canvasClear()">清空</span><span id="save" @click="saveAsImg()">保存</span><span id="save" @click="downloadSignImg()">下载</span></div></div>
</template>
<script>
export default {data(){return {value: null,options:{lastWriteSpeed: 1,  //书写速度 [Number] 可选lastWriteWidth: 2,  //下笔的宽度 [Number] 可选lineCap: 'round',   //线条的边缘类型 [butt]平直的边缘 [round]圆形线帽 [square]	正方形线帽lineJoin: 'round',  //线条交汇时边角的类型  [bevel]创建斜角 [round]创建圆角 [miter]创建尖角。canvasWidth: 600, //canvas宽高 [Number] 可选canvasHeight: 600,  //高度  [Number] 可选isShowBorder: true, //是否显示边框 [可选]bgColor: '#fcc', //背景色 [String] 可选 注:这背景色仅仅只是canvas背景,保存的图片仍然是透明的borderWidth: 1, // 网格线宽度  [Number] 可选borderColor: "#ff787f", //网格颜色  [String] 可选writeWidth: 5, //基础轨迹宽度  [Number] 可选maxWriteWidth: 30, // 写字模式最大线宽  [Number] 可选minWriteWidth: 5, // 写字模式最小线宽  [Number] 可选writeColor: '#101010', // 轨迹颜色  [String] 可选isSign: false, //签名模式 [Boolean] 默认为非签名模式,有线框, 当设置为true的时候没有任何线框imgType:'png'   //下载的图片格式  [String] 可选为 jpeg  canvas本是透明背景的}}},methods:{/*** 清除画板*/canvasClear(){this.$refs.SignCanvas.canvasClear();},/*** 保存图片*/saveAsImg(){const img = this.$refs.SignCanvas.saveAsImg();alert(`image 的base64:${img}`);},/*** 下载图片*/downloadSignImg(){this.$refs.SignCanvas.downloadSignImg();},}
}
</script>
<style lang="less">
* {margin: 0;padding: 0;
}
.title{padding: 20px;text-align: center;
}
.sign-canvas{display: block;margin: 20px auto;
}
.view-image{display: block;margin: 20px auto;
}
.config{width: 350px;margin: 20px auto;.ul-config{.li-c{display: flex;align-items: center;padding: 4px 10px;.item-label{font-size: 14px;}.item-content{margin-left: 10px;}}}
}
.sign-btns{display: flex;justify-content: space-between;#clear,#clear1,#save {display: inline-block;padding: 5px 10px;width: 76px;height: 40px;line-height: 40px;border: 1px solid #eee;background: #e1e1e1;border-radius: 10px;text-align: center;margin: 20px auto;cursor: pointer;}
}
</style>

功能与配置

props:{options: {  //配置项required: false,type: [Object],default: () => null}
}// 1. options [Object] 可选,非必传// 2. v-model [String] 可选,非必传
  1. 配置项 options 属性
{lastWriteSpeed: 1,  //书写速度 [Number] 可选lastWriteWidth: 2,  //下笔的宽度 [Number] 可选lineCap: 'round',   //线条的边缘类型 [butt]平直的边缘 [round]圆形线帽 [square]	正方形线帽lineJoin: 'round',  //线条交汇时边角的类型  [bevel]创建斜角 [round]创建圆角 [miter]创建尖角。canvasWidth: 600, //canvas宽高 [Number] 可选canvasHeight: 600,  //高度  [Number] 可选isShowBorder: true, //是否显示边框 [可选]   当签名模式处于false的时候此选项才生效bgColor: '#fcc', //背景色 [String] 可选borderWidth: 1, // 网格线宽度  [Number] 可选borderColor: "#ff787f", //网格颜色  [String] 可选writeWidth: 5, //基础轨迹宽度  [Number] 可选maxWriteWidth: 30, // 写字模式最大线宽  [Number] 可选minWriteWidth: 5, // 写字模式最小线宽  [Number] 可选writeColor: '#101010', // 轨迹颜色  [String] 可选isSign: false, //签名模式 [Boolean] 默认为非签名模式,有线框, 当设置为true的时候没有任何线框imgType:'png'   //下载的图片格式  [String] 可选为 jpeg  canvas本是透明背景的
}
  1. 内置方法
//清除画布 无返回值 [Void]
this.$refs.SignCanvas.canvasClear(); //清除画布 返回图片的base64编码 [String]
this.$refs.SignCanvas.saveAsImg();//调用内置的下载图片方法,默认将图片保存为png格式
this.$refs.SignCanvas.downloadSignImg();

二次开发 下载项目

git clone https://github.com/langyuxiansheng/vue-sign-canvas.git

Project setup

cd vue-sign-canvasnpm install

Compiles and hot-reloads for development

npm run dev

Compiles and minifies for production

npm run build

Lints and fixes files

npm run lint

缺陷 & 后期计划

目前还没有撤销回到上一步的操作,一旦输入错了就只有清除重写了(这个是之前去银行的时候,那个签名板是这样设计的); 如果有需要还是可以考虑加上回到上一步的方法.

 

如果您有什么好的建议请留言

项目截图展示:

初始化的非签名模式,

书写展示

保存的base64展示 

 导出的图片展示

 签名模式下的展示

 

 


http://chatgpt.dhexx.cn/article/29O5i1Wd.shtml

相关文章

无纸化手写电子签名是现今不可或缺的技术

说到手写电子签名&#xff0c;相信不少人都有所耳闻。在21世纪的今天&#xff0c;移动信息时代&#xff0c;在国家政策指引与倡导下&#xff0c;“无纸化”已成为一种趋势&#xff0c;手写电子签名技术正快速在各行各业推行&#xff0c;不仅节约了纸张资源&#xff0c;助力环境…

VB.net调用蒙恬Write2Go笔迹手写板进行电子签名

最近的项目需要用到手写电子签名的功能,挑来挑去最后选择了蒙恬Write2Go这款手写板设备,因为手写板上面直接就有一块电子油墨显示屏,所写即所得,还可以看到写的笔迹 安装完蒙恬的驱动及自带应用程序之后,经过测试发现,其工作原理是利用了windows剪切板作为中间桥梁来交换图片数…

uni-app - 电子签字板组件(签名专用写字画板,支持调整写字板 “横纵“ 方向,可调整线条粗细颜色等,Canvas 绘制非常丝滑流畅)完美兼容 H5 APP 小程序,最好用的画板签字教程插件源码

前言 网上的教程代码非常乱且都有 BUG 存在,非常难移植到自己的项目中,本文代码干净整洁注释详细。 本文实现了 全端兼容,签名专用的写字板组件,真机流畅丝滑且无 BUG, 您直接复制组件源码,按照详细示例+超详细的注释轻松几分钟完成, 如下图 真机测试,您还可以通过组件…

H5手写板电子签名开发

如图所示:前端实现H5canvas手写板电子签名:<!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0, maximum-scale1.0, user-scala…

uniapp - 实现微信小程序电子签名板,横屏手写姓名签名专用写字画板(详细运行示例,一键复制开箱即用)

效果图 实现了在uniapp项目中,微信小程序平台流畅的写字签名板(也可以绘图)功能源码,复制粘贴,改改样式几分钟即可搞定! 支持自动横屏、持预览,真机运行测试非常流畅不卡顿。 基础模板 如下代码所示。 <template><view class=

Vue Canvas 实现电子签名 手写板

直接上代码 <template><section class"signature"><div class"signatureBox"><div class"canvasBox" ref"canvasHW"><canvas ref"canvasF" touchstarttouchStart touchmovetouchMove touchendt…

锁---一些锁学习

1、java锁之公平锁和非公平锁 公平锁 是指多个线程按照申请的顺序来获取&#xff0c;类似排队打饭&#xff0c;先来后到。 非公平锁 是指多个线程获取锁的顺序并不是按照申请锁的顺序&#xff0c;有可能后申请的线程比先申请的线程优先获取锁&#xff0c;在高并发的情况下&a…

C# 实现锁屏

首先&#xff0c;将窗体的FormBorderStyle设置为none&#xff0c;WindowState设为Maximized 让窗体占据整个页面。 form窗体代码&#xff1a; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using …

win11中睡眠唤醒后如何禁止锁屏界面及登录界面

第一步禁止锁屏界面 gpedit.msc 不显示锁屏-》已启用 第二步&#xff1a;不显示登陆框 netplwiz 经过以上设置以后&#xff0c;打开笔记本就可以直接显示桌面了。

办公计算机锁屏方法,电脑快速锁屏,办公室神技能,再也不怕别人看我的电脑了!...

原标题&#xff1a;电脑快速锁屏&#xff0c;办公室神技能&#xff0c;再也不怕别人看我的电脑了&#xff01; 现在快节奏的社会&#xff0c;电脑的更方面性能与功能是非常之大&#xff0c;我们对电脑的使用频率也越来越高&#xff0c;可见它对我们生活越来越重要。在我们平时使…

Android锁屏的解锁(九个点),使用画的方式,大致的步骤

这篇博客是全部代码(没有解释,纯代码): https://blog.csdn.net/weixin_44614751/article/details/103101104 效果: 第一步:添加背景 第二步:创建九个点 先读取每一个点的图片: creatDot 创建九个点: initNin

ubuntu 18.04取消自动锁屏功能

有时候几分钟不用Ubuntu&#xff0c;系统就自动锁屏了&#xff0c;这是一种安全措施&#xff0c;防止别人趁你不在时使用你的系统。但对于大部分人而言&#xff0c;这是没有必要的&#xff0c;尤其是Ubuntu虚拟机&#xff0c;里面没啥重要的东西&#xff0c;每次锁屏后需要重新…

Android 通知栏,锁屏播放音乐,类似音乐播放器

项目中需要用到播放音频的功能&#xff0c;想做一个类似酷狗、酷我这样的音频播放功能&#xff0c;在通知栏和锁屏时都可以操控音乐&#xff0c;开发中发现oppo reno手机在锁屏时不显示通知栏&#xff0c;研究了整整一天终于解决&#xff0c;特作记录&#xff0c;给遇到同样问题…

Android自定义锁屏实现----仿正点闹钟滑屏解锁

本文原创&#xff0c;转载请注明出处&#xff1a;http://blog.csdn.net/qinjuning 前几周看了下解锁的框架&#xff0c;基本上算是弄了个脸熟。看着别人花哨的解锁界面&#xff0c;心里也很痒痒的。于是&#xff0c;画了一天时间&#xff0c; 捣鼓出了这个成果----仿正点闹钟解…

易安卓打开Android系统中的解锁方式选择页面(锁屏方式选择)

感谢名单 感谢fylfyl2写的https://blog.csdn.net/fyilun/article/details/21257595 E4A打开锁屏方式页面 Intent intent new Intent(); ComponentName cm new ComponentName("com.android.settings","com.android.settings.ChooseLockGeneric"); inte…

Android锁屏的解锁(九个点),使用画的方式

一、效果展示: 这篇博客有解释大概的步骤: https://blog.csdn.net/weixin_44614751/article/details/103101199 二、代码部分: MainActivity.java中的代码: package com.example.drawunlock1;import androidx.appcompat.app.AppCompatActivity;import android.content.re…

让电脑不被锁屏的方法,亲测有效

通过JS来控制键盘&#xff0c;定时按下SCROLLLOCK键&#xff0c;达到电脑不会被锁屏的效果。 通常公司电脑都会自动锁屏&#xff0c;只是时间有长短。有时候闲着了不用电脑&#xff0c;但是却不想让电脑锁屏。那么可以用js代码来控制键盘的按键循环按下实现不锁屏的效果&#x…

android 强制锁屏app,自制力app强制锁屏

自制力app强制锁屏非常适合在学习工作中没有自律性的用户们&#xff0c;当打开app后开启锁屏状态&#xff0c;手机就打不开了&#xff0c;重启也不可能解除锁屏&#xff1b;在此期间&#xff0c;就可以免于手机的打扰&#xff0c;专注学习&#xff1b;感兴趣的小伙伴们快来下载…

android系统密码设置功能,手机锁屏密码怎么设置 三种安卓手机锁屏方式推荐

手机中有很多应用都是与金钱挂钩&#xff0c;特别是微信与支付宝等等既涉及到隐私又与财产关联&#xff0c;这是后手机的安全就尤为重要的&#xff0c;而手机的锁屏密码就是一道最基本的防护措施&#xff0c;那么手机锁屏密码怎么设置?来看看小编推荐的三种安卓手机锁屏方式吧…

Mac锁屏的几种方式

刚换了工作&#xff0c;公司里给配了MacBook&#xff0c;第一次使用&#xff0c;很多常见操作都不知道快捷键&#xff0c;今天来记录下锁屏的几种方式&#xff1a;电脑为MacBook Pro&#xff0c;OS为MacOS Sierra 10.12.3 1. ctrl shift 右上角开关机键 2. option comm…