1.创建一个canvas

<template><div><canvas id="canvas" height="300" width="300" class="canvas"></canvas><div class="btn"><el-button type="primary" plain @click="handleClear">清空</el-button><el-button type="primary" @click="handleSave">保存</el-button></div></div>
</template>

2.创建一些需要编辑的变量

     const startText = ref(false)let routeList = reactive([])let context = ref()let ctx = reactive()

3.挂载canvas签名时的函数

nextTick(() => {ctx = document.getElementById('canvas')context.value = ctx.getContext('2d')ctx.addEventListener('mousedown', (e) => {startText.value = !startText.valuecontext.value.beginPath()routeList.push({x: e.offsetX,y: e.offsetY,})})ctx.addEventListener('mousemove', (e) => {if(startText.value && routeList.length === 1) {routeList.push({x: e.offsetX,y: e.offsetY,})const line = routeList.splice(0 ,1)context.value.lineTo(line[0].x, line[0].y)context.value.stroke()context.value.save()}})ctx.addEventListener('mouseup', (e) => {startText.value = !startText.valuerouteList = []})context.value.lineWidth = 3context.value.lineWidth='#000'context.value.stroke()})

4.清空与下载的函数

function handleClear() {context.value.clearRect(0, 0, 300, 300)}function handleSave() {var link = document.createElement('a')var imgData =ctx.toDataURL({format: 'png', quality:1, width:300, height:300})var blob = dataURLtoBlob(imgData)var objurl = URL.createObjectURL(blob)link.download = 'grid1.png'link.href = objurllink.click()}function  dataURLtoBlob(dataurl) {var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n)while(n--){u8arr[n] = bstr.charCodeAt(n)}return new Blob([u8arr], {type:mime})}

5.朴实无华的样式

<style lang="less" scoped>.canvas{background-color: #aaa;}.btn{width: 300px;display: flex;justify-content: center;}
</style>

6.整体

<template><div><canvas id="canvas" height="300" width="300" class="canvas"></canvas><div class="btn"><el-button type="primary" plain @click="handleClear">清空</el-button><el-button type="primary" @click="handleSave">保存</el-button></div></div>
</template><script setup>import { nextTick, reactive, ref } from 'vue'const startText = ref(false)let routeList = reactive([])let context = ref()let ctx = reactive()nextTick(() => {ctx = document.getElementById('canvas')context.value = ctx.getContext('2d')ctx.addEventListener('mousedown', (e) => {startText.value = !startText.valuecontext.value.beginPath()routeList.push({x: e.offsetX,y: e.offsetY,})})ctx.addEventListener('mousemove', (e) => {if(startText.value && routeList.length === 1) {routeList.push({x: e.offsetX,y: e.offsetY,})const line = routeList.splice(0 ,1)context.value.lineTo(line[0].x, line[0].y)context.value.stroke()context.value.save()}})ctx.addEventListener('mouseup', (e) => {startText.value = !startText.valuerouteList = []})context.value.lineWidth = 3context.value.lineWidth='#000'context.value.stroke()})function handleClear() {context.value.clearRect(0, 0, 300, 300)}function handleSave() {var link = document.createElement('a')var imgData =ctx.toDataURL({format: 'png', quality:1, width:300, height:300})var blob = dataURLtoBlob(imgData)var objurl = URL.createObjectURL(blob)link.download = 'grid1.png'link.href = objurllink.click()}function  dataURLtoBlob(dataurl) {var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n)while(n--){u8arr[n] = bstr.charCodeAt(n)}return new Blob([u8arr], {type:mime})}
</script><style lang="less" scoped>.canvas{background-color: #aaa;}.btn{width: 300px;display: flex;justify-content: center;}
</style>

最后就是这样了

写的比较简单,算是一气呵成,有bug,如果你用到了并且还存在问题,请发我我再努力修改,谢谢。

vue3.2+js,web端canvas实现手写签名相关推荐

  1. 微信小程序Canvas实现手写签名

    微信小程序Canvas实现手写签名 功能描述 点击按钮显示弹窗,弹窗主体为签名板,底部两个按钮为清除和保存. 清除按钮:清空签名板 保存按钮:保存签名为图片,并关闭弹窗 关键点分析 Canvas实现手 ...

  2. canvas实现手写签名

    使用canvas实现手写签名,效果如下 PC端 // 实现canvas签名var canvas = document.getElementById('canvas');var ctx = canvas ...

  3. 微信 html5 识别手写签名,html5 canvas做手写签名,该如何解决

    html5 canvas做手写签名 我用HTML5做了一个手写签名,运行在手机浏览器上,但是画出来效果总是很粗糙,曲线不够平滑,想找大侠指教 HTML> PhoneGap 浏览器不支持canva ...

  4. 微信小程序使用 canvas 实现手写签名

    在使用微信小程序开发中,有的需求场景中会需要用户手写签名.或者绘制一些路径,通常会使用 canvas 来实现这种需求 在小程序的开发官方文档中我们可以查找到相关的 canvas 接口使用方法,在文档中 ...

  5. html5 移动端手写签名,H5移动端项目实现手写签名功能 vue实现手写签名

    vue 移动端实现手写签名效果,功能很完美,保存时保存为base64格式. 刚好项目用到此功能,就网上找了一下,清理了无用代码,简单方便,因为项目中多个地方需要使用,所以我将它整理为组件,通过ref和 ...

  6. H5移动端项目实现手写签名功能 vue实现手写签名

    vue 移动端实现手写签名效果,功能很完美,保存时保存为base64格式. base64转file文件格式 vue中将base64转file文件格式 刚好项目用到此功能,就网上找了一下,清理了无用代码 ...

  7. 手机手写签名 php,基于canvas实现手写签名(vue)

    最近一直在研究canvas的东西,正好之前对手写签名这块有点兴趣.就自己基于vue写了一个简易的手写签名demo. 其中原理比较简单,先生成一个canvas画布,并对canvas进行touchstar ...

  8. 用canvas实现手写签名功能

    更多文章 最近开发网站有一个需求,要求页面上有一块区域,用户能用鼠标在上面写字,并能保存成图片 base64 码放在服务器. 这样的需求用 canvas 实现是最好的. 需要用到 canvas 的以下 ...

  9. vue移动端横屏手写签名

    最近项目组要求做一个移动端手写签名的组件,效果图如下 去查了很多资料,也借鉴了很多别人写好的例子,最终完成,记录一下 因为需要横屏签名,所以有监听手机屏幕,如果是手机屏幕锁定的情况下就通过代码旋转页面 ...

最新文章

  1. java中Log4j的使用
  2. 《穿越计算机的迷雾》读书笔记三
  3. oracle学习笔记三
  4. SAP 电商云 Spartacus UI 代码提交的 commit 信息规范
  5. C语言编程对缓冲区的理解
  6. java ndc_通过slf4j/log4j的MDC/NDC 实现日志追踪
  7. STM32建好的工程为啥下载不进去程序
  8. 面试题:synchronized的底层实现(偏向锁,轻量级锁,重量级锁)
  9. [现代控制理论]6_稳定性_李雅普诺夫_Lyapunov
  10. 微信小程序自定义icon
  11. java mina 服务端_mina 框架java服务端的搭建和通信。
  12. 从0开始的技术美术之路(十)伽马校正
  13. 计算机课程总结word,大学生的计算机课程总结word.docx
  14. Holt-Winters模型分析及时间序列预测
  15. 我的RecyclerView布局ysk
  16. CSS面试须知--样式属性
  17. 敬业签:备忘录在手机哪里能找到?
  18. import pmdarima as pm时报错ModuleNotFoundError: No module named ‘statsmodels‘
  19. Xadmin文档(二)
  20. 中国 GitHub 霸榜乱象! 真是把国内程序员的脸给丢尽了!

热门文章

  1. php 反斜杠转成正斜杠,php反斜杠转义
  2. 无聊的QQ,无聊的360
  3. linux 进程调度卡死,linux进程调度之总章:一些片汤话
  4. 写代码也有本手俗手之分,而我们要善于发现妙手!
  5. CocosCreator 监听龙骨绑定的帧事件
  6. STM32CubeIDE自平衡小车教程7.MPU6050传感器数据读取
  7. B树--B+树原理及操作(插入,删除)
  8. 计算机科学与技术中英翻译,[精品]计算机科学与技术外文翻译、中英对照、英汉互译.doc...
  9. 年轻人的第一部VR一体机是怎样炼成的?全志聚力VR梦想
  10. 【Java】升级版学生管理系统项目