vue+canvas画布实现网页签名效果

1、签名自定义组件代码示例:

qianMing.vue

<template><!-- 容器,包含画布和清除按钮 --><div class="signature-pad-container"><!-- 画布元素,用于用户签名 --><canvasref="canvas" <!-- 用于获取canvas DOM元素的引用 -->class="signature-pad" <!-- 自定义类名,便于样式控制 -->@mousedown="startDrawing" <!-- 鼠标按下时开始绘图 -->@mousemove="draw" <!-- 鼠标移动时持续绘图 -->@mouseup="stopDrawing" <!-- 鼠标抬起时停止绘图 -->@mouseleave="stopDrawing" <!-- 鼠标离开画布时停止绘图 -->@touchstart.prevent="startDrawing" <!-- 触摸屏幕开始绘图,阻止默认行为 -->@touchmove.prevent="draw" <!-- 触摸滑动时绘图,阻止默认行为 -->@touchend="stopDrawing" <!-- 触摸结束时停止绘图 -->></canvas><!-- 清除画布按钮 --><button @click="clearCanvas">Clear</button></div>
</template><script>
export default {// 数据属性定义data() {return {isDrawing: false, // 绘制状态标志,true为正在绘制context: null, // 2D渲染上下文,用于操作画布lastX: 0, // 上一次鼠标或触摸点的X坐标lastY: 0 // 上一次鼠标或触摸点的Y坐标};},// 挂载后执行,用于初始化画布mounted() {const canvas = this.$refs.canvas; // 获取canvas元素canvas.width = canvas.offsetWidth; // 设置画布宽度为元素显示宽度canvas.height = canvas.offsetHeight; // 设置画布高度为元素显示高度this.context = canvas.getContext('2d'); // 获取2D渲染上下文this.context.strokeStyle = '#000'; // 设置线颜色为黑色this.context.lineWidth = 2; // 设置线条宽度为2},// 方法集合methods: {// 开始绘图的处理函数startDrawing(event) {this.isDrawing = true; // 设置绘制状态为true// 获取事件坐标const { offsetX, offsetY } = this.getEventCoords(event);this.lastX = offsetX; // 记录起始点X坐标this.lastY = offsetY; // 记录起始点Y坐标this.context.beginPath(); // 开始一条新的路径this.context.moveTo(this.lastX, this.lastY); // 移动到起始点},// 绘图过程中的处理函数draw(event) {// 如果不是绘制状态则返回if (!this.isDrawing) return;// 获取当前坐标const { offsetX, offsetY } = this.getEventCoords(event);// 从上一点画直线到当前位置this.context.lineTo(offsetX, offsetY);this.context.stroke(); // 绘制路径// 更新最后的位置坐标this.lastX = offsetX;this.lastY = offsetY;},// 停止绘图的处理函数stopDrawing() {this.isDrawing = false; // 设置绘制状态为falsethis.context.closePath(); // 结束当前路径},// 清除画布的方法clearCanvas() {const canvas = this.$refs.canvas; // 获取canvas元素// 清除整个画布this.context.clearRect(0, 0, canvas.width, canvas.height);},// 获取事件坐标的方法,兼容触控和鼠标事件getEventCoords(event) {// 如果是触控事件,则计算相对于canvas的位置if (event.touches && event.touches.length > 0) {const rect = this.$refs.canvas.getBoundingClientRect(); // 获取canvas元素的边界信息return {offsetX: event.touches[0].clientX - rect.left, // 触摸点相对画布左边界的X坐标offsetY: event.touches[0].clientY - rect.top // 触摸点相对画布上边界的Y坐标};} else { // 否则是鼠标事件return {offsetX: event.offsetX, // 鼠标事件直接提供相对于元素内部的坐标offsetY: event.offsetY};}}}
};
</script><style scoped>
/* 容器样式 */
.signature-pad-container {position: relative; /* 使子元素可以绝对定位 */width: 100%; /* 宽度充满父容器 */height: 100px; /* 高度固定 */border: 1px solid #ccc; /* 边框样式 */border-radius: 15px; /* 边框圆角 */
}/* 画布样式 */
.signature-pad {width: 100%; /* 宽度充满容器 */height: 100%; /* 高度充满容器 */cursor: crosshair; /* 鼠标指针为十字准星 */touch-action: none; /* 禁止浏览器对触摸事件的默认处理 */
}/* 清除按钮样式 */
button {position: absolute; /* 绝对定位 */top: 10px; /* 距离顶部距离 */right: 10px; /* 距离右侧距离 */z-index: 10; /* 确保按钮在最上层 */
}
</style>

2、在script中引入自定义组件

<script>
import qianMing from "@/components/qianMing.vue";
export default {name: 'App',data() { return {}},methods: {},components: {qianMing}
}
</script>

完成上述步骤即可实现网页签名效果。

效果图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/365005.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++旋转点坐标计算

/// 获取A点绕B点旋转P度后的新坐标/// </summary>/// <param name"Angle">角度</param>/// <param name"CirPoint">圆心坐标</param>/// <param name"MovePoint">移动点的坐标</param>/// <param…

成为画图大师,用图表讲故事

这些问题你是否遇到过: 项目总结会上&#xff0c;如果用数据呈现你做的价值&#xff1f; 完善详尽的数据分析得出了让人信服的结论&#xff0c;如何呈现在BOSS面前? 我们要的不是数据&#xff0c;而是数据告诉我们的事实 数据很重要&#xff0c;但只是原料&#xff0c;所以…

微服务之服务保护策略【持续更新】

文章目录 线程隔离一、滑动窗口算法二、漏桶算法三、令牌桶算法 面试题1、Sentinel 限流和Gateway限流的区别 线程隔离 两种实现方式 线程池隔离&#xff08;Hystix隔离&#xff09;&#xff0c;每个被隔离的业务都要创建一个独立的线程池&#xff0c;线程过多会带来额外的CPU…

大模型笔记1: Longformer环境配置

论文: https://arxiv.org/abs/2004.05150 首先保证电脑上配置了git. git环境配置: https://blog.csdn.net/Andone_hsx/article/details/87937329 3.1、找到git安装路径中bin的位置&#xff0c;如&#xff1a;D:\Program Files\Git\bin 找到git安装路径中git-core的…

Windows应急响应靶机 - Web3

一、靶机介绍 应急响应靶机训练-Web3 前景需要&#xff1a;小苕在省护值守中&#xff0c;在灵机一动情况下把设备停掉了&#xff0c;甲方问&#xff1a;为什么要停设备&#xff1f;小苕说&#xff1a;我第六感告诉我&#xff0c;这机器可能被黑了。 这是他的服务器&#xff…

Java 并发编程常见问题

1、线程状态它们之间是如何扭转的&#xff1f; 1、谈谈对于多线程的理解&#xff1f; 1、对于多核CPU&#xff0c;多线程可以提升CPU的利用率&#xff1b; 2、对于多IO操作的程序&#xff0c;多线程可以提升系统的整体性能及吞吐量&#xff1b; 3、使用多线程在一些场景下可…

浅谈区块链

区块链是一种分布式数据库技术&#xff0c;也被称为分布式账本技术。它的本质是一个去中心化的数据库&#xff0c;使用密码学相关联产生的数据块串连而成&#xff0c;用于验证其信息的有效性&#xff08;防伪&#xff09;和生成下一个区块。区块链具有“不可伪造”“全程留痕”…

模板方法模式在金融业务中的应用及其框架实现

引言 模板方法模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它在一个方法中定义一个算法的框架&#xff0c;而将一些步骤的实现延迟到子类中。模板方法允许子类在不改变算法结构的情况下重新定义算法的某些步骤。在金融业务中&#xff…

DataV大屏组件库

DataV官方文档 DataV组件库基于Vue &#xff08;React版 (opens new window)&#xff09; &#xff0c;主要用于构建大屏&#xff08;全屏&#xff09;数据展示页面即数据可视化&#xff0c;具有多种类型组件可供使用&#xff1a; 源码下载

一文带你了解乐观锁和悲观锁的本质区别!

文章目录 悲观锁是什么&#xff1f;乐观锁是什么&#xff1f;如何实现乐观锁&#xff1f;什么是CAS应用局限性ABA问题是什么&#xff1f; 悲观锁是什么&#xff1f; 悲观锁它总是假设最坏的情况&#xff0c;它会认为共享资源在每次被访问的时候就会出现线程安全问题&#xff0…

AI陪伴产品的情感设计:从孤独感到恋爱感评分:9/10

本文主要阐述三个话题&#xff1a; 1. 市面上有哪些AI陪伴产品&#xff1f; 2. 我们团队要怎么做&#xff1f; 3. 为什么要做&#xff1f; 市面上有哪些陪伴类产品&#xff1f; Role-play&#xff08;角色扮演&#xff09; 在当前市场上&#xff0c;有不少以角色扮演为核心的…

qt文件如何打包成一个独立的exe文件

QT官方给我们安装好了打包软件&#xff0c;就在你QT安装的位置 把这个在cmd打开C:\Qt\6.7.1\mingw_64\bin\windeployqt6.exe&#xff08;或复制地址&#xff09; 然后把要打包项目的exe复制到新的空文件夹&#xff0c;再复制他的地址 按回车后生成新文件 再下载打包软件&#…

Coursera耶鲁大学金融课程:Financial Markets 笔记Week 03

Financial Markets 本文是学习 https://www.coursera.org/learn/financial-markets-global这门课的学习笔记 这门课的老师是耶鲁大学的Robert Shiller https://en.wikipedia.org/wiki/Robert_J._Shiller Robert James Shiller (born March 29, 1946)[4] is an American econom…

【地理库 Turf.js】

非常全面的地理库 &#xff0c; 这里枚举一些比较常用&#xff0c;重点的功能&#xff0c; 重点功能 提供地理相关的类&#xff1a;包括点&#xff0c;线&#xff0c;面等类。 测量功能&#xff1a;点到线段的距离&#xff0c;点和线的关系等。 判断功能&#xff1a; 点是否在…

西点领导力:卓越是怎样练成的

今天刚看了一个美国西点军校第50任校长&#xff1a;罗伯克卡斯伦的《为什么跟西点军校学领导力培养》这个演讲。从中受益良多&#xff0c;于是我就去了解了一下这位校长以及西点军校。 西点军校 西点军校&#xff08;United States Military Academy, USMA&#xff09;&#…

C++感受12-Hello Object 派生版

不变的功能&#xff0c;希望直接复用原有代码&#xff1b;变化的功能&#xff0c;希望在分开的代码里实现。 派生的基本概念和目的如何定义派生类以及创建派生对象派生对象的生死过程 0. 课堂视频 ff14-HelloObject-派生版 1. 派生的基本概念与目的 编程&#xff0c;或者说软…

Linux线程同步【拿命推荐版】

目录 &#x1f6a9;引言 &#x1f6a9;听故事&#xff0c;引概念 &#x1f6a9;生产者消费者模型 &#x1f680;再次理解生产消费模型 &#x1f680;挖掘特点 &#x1f6a9;条件变量 &#x1f680;条件变量常用接口 &#x1f680;条件变量的原理 &#x1f6a9;引言 上一篇…

解锁横向招聘:创新您的人才搜索

技能差距仍然是面试官面临的问题之一。在这些空缺职位中&#xff0c;很难找到合适的技能候选人&#xff0c;特别是高级职位或以上职位。另一方面&#xff0c;申请人也发现很难找到一份适合自己的工作&#xff0c;因为他们抱怨工作要求太窄或太具体。在具有挑战性的职位招聘环境…

魔行观察-烤匠麻辣烤鱼-开关店监测-时间段:2011年1月 至 2024年6月

今日监测对象&#xff1a;烤匠麻辣烤鱼&#xff0c;监测时间段&#xff1a;2011年1月 至 2024年6月 本文用到数据源获取地址 魔行观察http://www.wmomo.com/ 品牌介绍&#xff1a; 2013年&#xff0c;第一家烤匠在成都蓝色加勒比广场开业&#xff0c;随后几年成都国金中心店…

Qt开发 | Qt界面布局 | 水平布局 | 竖直布局 | 栅格布局 | 分裂器布局 | setLayout使用 | 添加右键菜单 | 布局切换与布局删除重构

文章目录 一、Qt界面布局二、Qt水平布局--QHBoxLayout三、Qt竖直布局四、Qt栅格布局五、分裂器布局代码实现六、setLayout使用说明七、布局切换与布局删除重构1.如何添加右键菜单2.布局切换与布局删除重构 一、Qt界面布局 Qt的界面布局类型可分为如下几种 水平布局&#xff08;…