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

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

qianMing.vue

<template>
  <!-- 容器,包含画布和清除按钮 -->
  <div class="signature-pad-container">
    <!-- 画布元素,用于用户签名 -->
    <canvas
      ref="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; // 设置绘制状态为false
      this.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>

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

效果图:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

领克杀入纯电赛道:年轻人想要一台什么样的大电轿?

‍作者 |老缅 编辑 |德新 6月12日&#xff0c;领克旗下首款纯电动车型在瑞典进行了全球首秀&#xff0c;该车正式定名为Z10。 Z10的字母「Z」&#xff0c;源自ZERO。 Zeal-激情&#xff0c;Enjoy-享受&#xff0c;Responsibility-责任&#xff0c;Original-原创&#xff0c;…

动态规划数字三角形模型——AcWing 275. 传纸条

动态规划数字三角形模型 定义 动态规划数字三角形模型是在一个三角形的数阵中&#xff0c;通过一定规则找到从顶部到底部的最优路径或最优值。 运用情况 通常用于解决具有递推关系、需要在不同路径中做出选择以达到最优结果的问题。比如计算最短路径、最大和等。 计算其他…

中国高分辨率土壤侵蚀因子K

土壤可蚀性因子&#xff08;K&#xff09;数据&#xff0c;基于多种土壤属性数据计算&#xff0c;所用数据包括土壤黏粒含量&#xff08;%&#xff09;、粉粒含量&#xff08;%&#xff09;、砂粒含量&#xff08;%&#xff09;、土壤有机碳含量&#xff08;g/kg&#xff09;、…

【新版本来袭】ONLYOFFICE桌面编辑器8.1 —— 重塑办公效率与体验

文章目录 一、功能完善的PDF编辑器&#xff1a;重塑文档处理体验编辑文本插入和修改各种对象&#xff0c;如表格、形状、文本框、图像、艺术字、超链接、方程式等添加、旋转和删除页面添加文本注释和标注 二、幻灯片版式设计&#xff1a;创意展示的无限舞台三、改进从右至左显示…

规则引擎-Aviator 表达式校验是否成立

目录 介绍特性使用更多文献支持 介绍 Aviator是一个轻量级、高性能的Java表达式执行引擎&#xff0c;它动态地将表达式编译成字节码并运行。 特性 支持绝大多数运算操作符&#xff0c;包括算术操作符、关系运算符、逻辑操作符、位运算符、正则匹配操作符(~)、三元表达式(?:…

接口防篡改+防重放攻击

接口防止重放攻击&#xff1a;重放攻击是指攻击者截获了一次有效请求(如交易请求),并在之后的时间里多次发送相同的请求&#xff0c;从而达到欺骗系统的目的。为了防止重放攻击&#xff0c;通常需要在系统中引入一种机制&#xff0c;使得每个请求都有一个唯一的标识符(如时间戳…

Go 如何使用指针灵活操作内存

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

华为的开发语言有2中,分别是ArkTS和仓颉,他们的区别是什么?

华为的开发语言有2中&#xff0c;分别是ArkTS和仓颉&#xff0c;他们的区别在哪呢&#xff1f; ArkTS和仓颉&#xff08;cangjie&#xff09;他们的区别是什么&#xff1f; 华为的仓颉和 ArkTS 是两种不同的编程语言&#xff0c;它们有以下区别&#xff1a; 设计目的&#xff1…

emoji控必备:制作一个emoji面板插件

说在前面 &#x1f4bb;在数字时代&#xff0c;emoji表情符号已成为很多人沟通的重要工具&#xff0c;但是输入法中的emoji表情包可能不太够用&#xff0c;所以很多时候我会到在线的网站去复制emoji&#xff0c;然后再回来粘贴&#xff0c;这样操作感觉有点繁琐&#xff0c;所以…

在线朋友圈系统(Java Web)

本项目是一个基于Java Web技术栈开发的在线朋友圈系统&#xff0c;提供用户注册、登录、动态发布与评论、好友发现与管理等功能。通过Spring Boot、MySQL、MyBatis、Sa-token以及LayUI等技术实现&#xff0c;确保系统具有良好的性能和扩展性。 技术栈 后端技术 Spring Boot: …

问题-python-爬虫无法爬取外网资源问题(python爬虫)

方法一&#xff1a; 这个报错通过关掉梯子就能解决&#xff0c;目前不清楚具体原理。 后续了解具体原理了&#xff0c;我会在这篇文章上更新具体分析—— 方法二&#xff1a; 也可以把这个东西打开&#xff0c;但是用完建议关掉。

红酒品鉴新手速成:一键解锁味觉密码,让你秒变品鉴达人

红酒&#xff0c;这被誉为“液体宝石”的美酒&#xff0c;承载着丰富的口感和深邃的文化。对于许多人来说&#xff0c;品鉴红酒既是一种享受&#xff0c;也是一门艺术。然而&#xff0c;对于初学者来说&#xff0c;如何开始这场美妙的味觉之旅呢&#xff1f;今天&#xff0c;就…

vite项目自定义端口号

server.port​ 类型&#xff1a; number默认值&#xff1a; 5173 指定开发服务器端口。 注意&#xff1a;如果端口已经被使用&#xff0c;Vite 会自动尝试下一个可用的端口&#xff08;5174&#xff09;&#xff0c;所以这可能不是开发服务器最终监听的实际端口。 在vite.con…

【金】02Y90-60 大数据-HivetoMysQL

1、安装 Java 程序&#xff08;jdk&#xff09; 2、添加以下JAR包 3、确认配置成自己的数据库 ....

jenkins api部署时,一直提示pending-Finished waiting

问题&#xff1a; 调用jenkins api部署时&#xff0c;一直提示pending-Finished waiting 解决方案&#xff1a; 这个问题困扰了很久&#xff0c;一直没有思路&#xff0c;后面看到调用jenkinsAPI本身会出现一段提示&#xff0c;pending in the quiet period&#xff0c;通过搜…

NAS安全存储怎样实现更精细的数据权限管控?

NAS存储&#xff0c;即网络附属存储&#xff08;Network Attached Storage&#xff09;&#xff0c;是一种专用数据存储服务器&#xff0c;其核心特点在于将数据存储设备与网络相连&#xff0c;实现集中管理数据的功能。 NAS存储具有以下明显优势&#xff0c;而被全球范围内的企…

PostgreSQL 17 Beta 1 发布!

PostgreSQL 全球开发小组宣布&#xff0c;PostgreSQL 17 的第一个测试版本现已可供下载。此版本包含 PostgreSQL 17 正式发布时将提供的所有功能的预览&#xff0c;但测试期间版本的某些细节可能会发生变化。 #PG培训#PG考试#postgresql培训#postgresql考试#postgresql认证 您…

标准立项 | 湖库沉积物微生物多样性监测规程

饮用水水源地保护是饮用水安全保障中最重要的一个环节&#xff0c;其水质状况直接关系到供水区人民群众的身体健康。我国水资源存在水质差、资源短缺、资源时间空间分布不合理等问题。而近些年由水源地污染引发的饮用水安全事件&#xff0c;给居民的生产生活造成一定程度的影响…

Linux环境下安装MySQL5.7.33(RPM方式安装)

&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;本专栏主要发表mysql实战的文章&#xff0c;文章主要包括&#xff1a; 各版本数据库的安装、备份和恢复,性能优化等内容的学习。。 &#x1f4e3; ***如果需要观看配套视频的小伙伴们&#xff0c;请…