canvas手写签名组件

效果图👇
在这里插入图片描述
代码不多直接粘在这里

<template><div class="border"><canvasref="canvas"width="800"height="500"class="border-success"tabindex="0"@mousedown="onMouseDown"/><footer slot="footer" class="dialog-footer text-center"><button type="danger" @click.native.prevent="clearPanel">清空</button><button type="primary" @click="confirm">确认</button></footer><img class="imgCanvas" :src="imgUrl" /></div>
</template><script>
import { defineComponent, ref, nextTick } from "vue";
export default defineComponent({name: "environAmbitus",setup() {const canvas = ref(null);const imgUrl = ref();// 开始签名function onMouseDown(e) {const el = e.target || e.srcElement; //获取事件源const ctx = el.getContext("2d"); //获取canvas的上下文ctx.lineWidth = 3; //线条宽度ctx.beginPath(); //开始路径绘制ctx.moveTo(e.offsetX, e.offsetY); //设置路径起点,坐标为(20,20)ctx.lineTo(e.offsetX, e.offsetY); //设置路径终点,坐标为(200,20)ctx.stroke(); //图形边框绘制el.onmousemove = function(e) {//鼠标移动事件if (e.which === 0) {el.onmousemove = null;el.onmouseup = null;return;}ctx.lineTo(e.offsetX, e.offsetY);ctx.stroke();};// el.onmouseup = function () {//   //鼠标抬起事件//   el.onmousemove = null;//   el.onmouseup = null;// };el.focus();}// 清空签名function clearPanel(e) {nextTick(() => {// const el = canvas;const ctx = canvas.value.getContext("2d");ctx.clearRect(0, 0, canvas.value.width, canvas.value.height);});}// 确认签名function confirm() {nextTick(() => {try {// const canvas = this.$refs["canvas"];const blank = document.createElement("canvas"); // 创建一个空canvas对象blank.width = canvas.value.width;blank.height = canvas.value.height;imgUrl.value = canvas.value.toDataURL();// 将画布上的内容导出为图片} catch (e) {console.warn(e);}});}return { onMouseDown, confirm, clearPanel, canvas, imgUrl };}
});
</script>
<style scoped>
.border {width: 800px;height: 500px;border: 1px solid skyblue;box-sizing: border-box;
}
</style>

需要注意的是 可绘制区域是canvas的height width控制的,用的话可以给他改成父组件传递的

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

二叉树题目:二叉树剪枝

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;二叉树剪枝 出处&#xff1a;814. 二叉树剪枝 难度 4 级 题目描述 要求 给定二叉树的根结点 root \texttt{root} root&#xff0c;返回移除了所有…

如何用思维导图做学习计划?

在我们不断追求个人和职业发展的过程中&#xff0c;学习计划起着至关重要的作用。然而&#xff0c;很多人在制定学习计划时常常感到困惑&#xff0c;不知道如何才能制定一份周全且可行的计划。本文将介绍一种结构化思维的方法&#xff0c;以帮助你制定一份高效的学习计划。 首先…

113. 路径总和ii

力扣题目链接(opens new window) 给定一个二叉树和一个目标和&#xff0c;找到所有从根节点到叶子节点路径总和等于给定目标和的路径。 说明: 叶子节点是指没有子节点的节点。 示例: 给定如下二叉树&#xff0c;以及目标和 sum 22&#xff0c; 在路径总和题目的基础上&…

如何使用Etherscan Remix插件验证智能合约

在Moonbeam上验证合约的方式有很多&#xff0c;使用Etherscan Remix插件是最快、最简单的方式。 此示例中&#xff0c;我们展示如何在Remix上激活Etherscan插件并验证简单的增量智能合约。开始之前&#xff0c;请准备以下内容&#xff1a; MetaMask钱包 存有DEV的账户 将验证…

Linux 线程同步(重要) 互斥量

/*三个窗口卖一百张票 */#include<stdio.h> #include<unistd.h> #include<pthread.h> #include<string.h> int tickets 0; void * sellticket(void * arg) {//卖票usleep(7000);while(tickets < 100) {printf("%ld 正在卖第 %d 张票\n",…

34.CSS魔线图标的悬停效果

效果 源码 index.html <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Icon Fill Hover Effects</title> <link rel="stylesheet" h…

基于AIOps实现智慧园区极简IT运维

随着物联网、云平台、大数据、人工智能等技术的发展&#xff0c;并逐步投入到智慧园区的建设&#xff0c;传统园区数字化转型加快。园区的形式包括产业园区、教育园区、制造业园区、科研园区、社区等等&#xff0c;园区形态不断演进和发展&#xff0c;园区网承载的对象和业务也…

通过http发送post请求的三种Content-Type分析

通过okhttp向服务端发起post网络请求&#xff0c;可以通过Content-Type设置发送请求数据的格式。 常用到的三种&#xff1a; 1&#xff09;application/x-www-form-urlencoded; charsetutf-8 2&#xff09;application/json; charsetutf-8 3&#xff09;multipart/form-dat…

go语言unsafe.Pointer与uintptr

以下内容来源go语言圣经 1、unsafe.Pointer&#xff0c;相当于c语言中的void *类型的指针&#xff0c;如果需要运算需要转成uintptr类型的指针 2. uintptr uintptr是一个无符号的整型&#xff0c;它可以保存一个指针地址。 它可以进行指针运算。 uintptr无法持有对象, GC不把…

麒麟信安组织开展国产操作系统技术赋能专题培训

近日&#xff0c;为学习国产操作系统基本概念、使用与运维知识&#xff0c;应对用户单位内部信息系统国产化需求&#xff0c;来自国营洛阳丹城无线电厂的运维工程师们走进麒麟信安&#xff0c;进行了为期一周的操作系统课程学习。 针对客户此次培训需求&#xff0c;结合学员实…

基于php的物流信息公共平台设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于php的物流信息公共平…

JAVA中使用CompletableFuture进行异步编程

JAVA中使用CompletableFuture进行异步编程 1、什么是CompletableFuture CompletableFuture 是 JDK8 提供的 Future 增强类&#xff0c;CompletableFuture 异步任务执行线程池&#xff0c;默认是把异步任 务都放在 ForkJoinPool 中执行。 在这种方式中&#xff0c;主线程不会…

nginx 多层代理 + k8s ingress 后端服务获取客户真实ip 配置

1.nginx http 七层代理 修改命令空间&#xff1a; namespace: nginx-ingress : configmap&#xff1a;nginx-configuration kubectl get cm nginx-configuration -n ingress-nginx -o yaml添加如上配置 compute-full-forwarded-for: “true” forwarded-for-header: X-Forwa…

MySQL学习笔记19

MySQL日志文件&#xff1a;MySQL中我们需要了解哪些日志&#xff1f; 常见日志文件&#xff1a; 我们需要掌握错误日志、二进制日志、中继日志、慢查询日志。 错误日志&#xff1a; 作用&#xff1a;存放数据库的启动、停止和运行时的错误信息。 场景&#xff1a;用于数据库的…

MySQL高级语句(第一部分)

MySQL高级语句(第一部分)一、MySQL进阶查询1、select ----显示表格中一个或数个字段的所有数据记录2、distinct ----不显示重复的数据记录3、where ----有条件查询4、and or ----且 或5、in ----显示已知的值的数据记录6、between ----显示两个值范围内的数据记录7、通配符8、l…

#硬件电路设计VL817-Q7(B0)芯片拓展USB3.0一转四调试心得

供电电路 基于XL4005的电源供电电路 SS34肖特基二极管 ZMM5V1稳压二极管 SMAJ15A TVS &#xff08;注意这个封装搞错5V会短接&#xff09; Vout0.8*[1(R2R3)/R1] D14 SR05静电防护器件 一路稳压两路TVS 共模电感 &#xff1a; 型号&#xff1a; SDCW2012-2-900TF 品牌&#…

OpenAI ChatGPT API 文档之 Embedding

译者注&#xff1a; Embedding 直接翻译为嵌入似乎不太恰当&#xff0c;于是问了一下 ChatGPT&#xff0c;它的回复如下&#xff1a; 在自然语言处理和机器学习领域&#xff0c;"embeddings" 是指将单词、短语或文本转换成连续向量空间的过程。这个向量空间通常被称…

高效搜索,提升编程效率

一、搜索效率 1.1魔法上网 网址&#xff1a; 一个很变态但可以让你快速学会计算机的方法…………_哔哩哔哩_bilibili 谷歌镜像&#xff1a; https://search.fuyeor.com/zh-cn/Google 谷歌学术&#xff1a; https://link.zhihu.com/?targethttps%3A//scholar.lanfanshu.cn/…

lwip开发指南2

目录 NTP 协议实验NTP 简介NTP 实验硬件设计软件设计下载验证 lwIP 测试网速JPerf 网络测速工具JPerf 网络实验硬件设计软件设计下载验证 HTTP 服务器实验HTTP 协议简介HTTP 服务器实验硬件设计下载验证 网络摄像头&#xff08;ATK-MC5640&#xff09;实验ATK-MC5640 简介SCCB …

linux权限机制,

目录 用户与组,id,passwd 查看登录用户whomi,who,w 创建用户 useradd 修改用户信息usermod 删除指定用户userdel 组 ​编辑创建修改删除组groupadd groupmod groupdel 权限 ls-l 修改文件所属用户&#xff0c;所属组 chown,chgrp(change group) 修改权限 chmod 默认权…