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.mzph.cn/pingmian/34799.shtml

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

相关文章

学习金字塔模型

学习金字塔模型由美国缅因州巴特尔教育研究所&#xff08;National Training Laboratories, Bethel, Maine&#xff09;开发&#xff0c;它展示了不同学习活动的平均知识保留率。这种方法可以帮助人们理解不同学习方式的有效性&#xff0c;从而更好地选择适合的学习方法。学习金…

关键时刻,了解可燃气体报警器探头使用年限至关重要

可燃气体报警器是工业生产、商业场所及家庭安全中不可或缺的重要设备&#xff0c;它能够实时监测环境中可燃气体&#xff08;如天然气、液化石油气等&#xff09;的浓度&#xff0c;并在浓度达到预设的阈值时发出警报&#xff0c;以预防火灾和爆炸等危险事件。 而作为报警器核…

来聊聊Redis所实现的Reactor模型

写在文章开头 我们都知道解决C10k问题的最好方案就是通过在IO多路复用的基础上通过reactor模型实现高性能的网络并发程序&#xff0c;借助这个设计&#xff0c;redis的主线程也是基于IO多路复用以reactor模型的思路实现了一个高性能的单线程内存数据&#xff0c;本文将带领读者…

一种改进最大相关峭度解卷积的滚动轴承故障诊断方法(MATLAB)

近年来&#xff0c;最大相关峭度解卷积受到了研究人员越来越多的关注&#xff0c;陆续有多篇研究论文将该方法应用于滚动轴轴承故障诊断。MCKD是由McDonald提出的一种解卷积方法&#xff0c;其算法中设计了一个新的目标函数——相关峭度&#xff0c;并以此为优化目标设计一系列…

HTML(24)——过渡

过渡 作用&#xff1a;可以为一个元素在不同的状态之间切换的时候添加过渡效果 属性名&#xff1a;transition(复合属性) 属性值&#xff1a;过渡的属性 花费时间(s) 提示&#xff1a; 过渡的属性可以是具体的CSS属性也可以为all&#xff08;两个状态属性值不同的所有属性…

HTML基础入门知识

HTML基础使用 文章目录 HTML基础使用1、什么是HTML2、web标准4、HTML语法规则5、常用的标签标题标签段落标签换行标签文本格式化标签div和span标签图片标签路径链接标签注释 1、什么是HTML 什么是网页 网站是指在因特网上根据一定的规则&#xff0c;使用 HTML 等制作的用于展示…

完美世界否认大规模裁员,存在项目和人员的正常调整

原标题&#xff1a;完美世界回应裁员传闻&#xff1a;确实存在人员调整 项目继续正常研发 易采游戏网6月25日消息&#xff1a;网络上热传完美世界进行史上最大规模裁员&#xff0c;甚至有消息称其两栋办公楼已近乎搬空&#xff0c;同时备受瞩目的游戏项目《完美新世界》和《一拳…

日立EX-PROII+系列全新升级,智慧随心控畅享新生活

随着科技的进步&#xff0c;各种智能家电也开始走入人们的生活&#xff0c;而在这个领域&#xff0c;日立用技术创新生活&#xff0c;不断为新时代注入活力&#xff0c;推出日立 EX-PROII系列家用净化中央空调&#xff0c;贯彻“小身材&#xff0c;大能量”核心设计理念&#x…

Docker编译nanopc-t4源码流程介绍

官方文档 Android系统编译 vnc加环境变量配置 https://github.com/friendlyarm/docker-cross-compiler-novnc 下载 git clone https://github.com/friendlyarm/docker-ubuntu-lxde-novnc cd docker-ubuntu-lxde-novnc docker build --no-cache -t docker-ubuntu-lxde-novnc …

【期末复习】计算机组成原理

海明码 最通俗的海明码计算方法&#xff0c;不需记公式&#xff0c;套步骤即可&#xff08;可能都不需要理解&#xff09; https://www.bilibili.com/video/BV1tL4y1h7Fd/ 接上一海明码视频&#xff08;海明码的纠错&#xff09; https://www.bilibili.com/video/BV1tf4y1A7NX/…

使用官方新工具手动升级 Quest 操作系统

Meta 近期推出了一款用于手动升级 Meta Quest 系统的工具&#xff0c;为用户提供了更多选择。本文将详细介绍如何使用这一工具进行系统升级。 优势与劣势 优势&#xff1a; 安装迅速&#xff1a;升级速度相比在线自动升级快&#xff0c;且可实时查看进度 即时升级&#xff1…

全国计算机等级考试WPS如何报名

全国计算机等级考试WPS如何报名&#xff1f; 注册并登录 全国计算机等级考试官网选择 考试服务-在线报名选择报考省份-开始报名

【Splitpanes】Vue.js 靠谱、简单并支持触摸的窗格分割器/调整器。

【Splitpanes】Vue.js 靠谱、简单并支持触摸的窗格分割器/调整器。 介绍安装使用示例与文档 介绍 Vue.js 靠谱、简单并支持触摸的窗格分割器/调整器。用于实现可调节窗口&#xff0c;支持Vue2、Vue3。 安装 Vue3 npm install splitpanesVue2 npm install splitpaneslegac…

东昂科技从创业板改道北交所:大客户依赖症明显,巨额分红又募投补流

《港湾商业观察》施子夫 黄懿 2024年6月24日&#xff0c;厦门东昂科技股份有限公司&#xff08;以下简称&#xff0c;东昂科技&#xff09;在北交所网站披露第二轮审核问询函的回复。自2024年1月IPO申请获北交所受理以来&#xff0c;东昂科技已经收到北交所下发的两轮审核问询…

项目实训-接口测试(十八)

项目实训-后端接口测试&#xff08;十八&#xff09; 文章目录 项目实训-后端接口测试&#xff08;十八&#xff09;1.概述2.测试对象3.测试一4.测试二 1.概述 本篇博客将记录我在后端接口测试中的工作。 2.测试对象 3.测试一 这段代码是一个单元测试方法&#xff0c;用于验证…

echarts+vue2实战(二)

目录 一、WebSocket【双向通信】的使用 1.1、前端 1.2、后端 二、前端组件的合并与优化 三、全屏切换 3.1、单页面切换 3.2、同页面多端联动 四、主题切换 4.1、单页面切换 4.2、同页面多端联动 一、WebSocket【双向通信】的使用 1.1、前端 在utils文件夹里创建soc…

ArkUI开发学习随机——得物卡片,京东登录界面

案例一&#xff1a;得物卡片 代码&#xff1a; Column(){Column(){Image($r("app.media.mihoyo")).width(200).height(200)Row(){Text("今晚玩这个 | 每日游戏打卡").fontWeight(700).fontSize(16).padding(4)}.width(200)Text("No.12").fontWe…

盲盒小程序开发:解锁未知,探索无限惊喜

一、开启新篇章 在追求独特与新颖的时代&#xff0c;盲盒以其神秘感与未知性&#xff0c;成为了年轻人热衷的购物新方式。为了满足这一市场需求&#xff0c;我们精心打造了一款全新的盲盒小程序&#xff0c;带您步入一个充满未知与惊喜的购物新领域。 二、产品亮点 精选商品&…

【机器学习】K-Means算法详解:从原理到实践

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 K-Means算法详解&#xff1a;从原理到实践引言1. 基本原理1.1 簇与距离度量1.2 …

JLPT历年真题刷题小程序:Navi日语社全新升级,更新至2024年真题!

Navi日语社小程序专为日语能力考试设计&#xff0c;提供全网最全的JLPT备考真题资源&#xff0c;包括日语N1-N5等级考试的历年真题&#xff0c;2024年真题将在7月底更新。无论你是日语新手准备参加N3考试练练手&#xff0c;还是准备冲刺N1最高等级&#xff0c;都能在这个小程序…