当前位置: 首页 > news >正文

html+canvas 实现签名功能-手机触摸

手机上的效果图

image

需要注意,手机触摸和鼠标不是一个事件,不能通用,上一篇是关于使用鼠标的样例

相关代码

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.buttons {margin-top: 10px;}</style>
</head><body><div><canvas id="signatureCanvas" width="500" height="200" style="border:solid;"></canvas><button onclick="clearSignature()">清除</button><button onclick="undoLast()">清除上一步</button><button onclick="saveSignature()">保存</button></div><script>const canvas = document.getElementById('signatureCanvas');const ctx = canvas.getContext('2d');let isDrawing = false;let lastX, lastY;let strokes = []; // 用于存储每一步的绘制操作// 触摸开始事件function handleTouchStart(e) {e.preventDefault(); // 阻止默认的触摸事件isDrawing = true;[lastX, lastY] = [e.touches[0].clientX - canvas.offsetLeft, e.touches[0].clientY - canvas.offsetTop];strokes.push([]); // 开始新的笔画}// 触摸移动事件function handleTouchMove(e) {e.preventDefault(); // 阻止默认的触摸事件if (!isDrawing) return; // 如果没有触摸,则退出函数const x = e.touches[0].clientX - canvas.offsetLeft;const y = e.touches[0].clientY - canvas.offsetTop;ctx.beginPath();ctx.moveTo(lastX, lastY);ctx.lineTo(x, y);ctx.stroke();strokes[strokes.length - 1].push({ x: lastX, y: lastY, x2: x, y2: y }); // 记录当前笔画[lastX, lastY] = [x, y];}// 触摸结束事件function handleTouchEnd(e) {e.preventDefault(); // 阻止默认的触摸事件isDrawing = false;}// 清除签名function clearSignature() {ctx.clearRect(0, 0, canvas.width, canvas.height);strokes = []; // 清空所有笔画记录}// 撤销上一步function undoLast() {strokes.pop(); // 移除最后一个笔画redraw(); // 重新绘制画布}// 重新绘制画布function redraw() {ctx.clearRect(0, 0, canvas.width, canvas.height); // 清空画布strokes.forEach(stroke => {stroke.forEach(line => {ctx.beginPath();ctx.moveTo(line.x, line.y);ctx.lineTo(line.x2, line.y2);ctx.stroke();});});}// 保存签名function saveSignature() {const imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);// 将图片数据转换成 base64 格式const base64ImageData = canvas.toDataURL();console.log(base64ImageData);}// 绑定事件canvas.addEventListener('touchstart', handleTouchStart);canvas.addEventListener('touchmove', handleTouchMove);canvas.addEventListener('touchend', handleTouchEnd);canvas.addEventListener('touchcancel', handleTouchEnd);</script>
</body></html>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • GraphRAG+ollama+LM Studio+chainlit
  • 怎么剪辑音频文件?4款适合新的音频剪辑软件
  • Spring Boot项目中使用MyBatis Generator (MBG) 自动生成Mapper文件
  • LinuxShell编程2——shell搭建Discuzz论坛网站
  • 框架设计MVP
  • Adobe国际认证详解-网页设计认证专家行业应用场景解析
  • 数据仓库中事实表设计的关键步骤解析
  • 【Langchain大语言模型开发教程】模型、提示和解析
  • 微服务实战系列之玩转Docker(一)
  • # Redis 入门到精通(七)-- redis 删除策略
  • [SUCTF 2019]EasySQL1
  • 【C语言ffmpeg】打开第一个视频
  • Linux的热插拔UDEV机制和守护进程
  • ubuntu上通过修改grub启动参数,将串口重定向到sol
  • SQLite 事务
  • [译] 怎样写一个基础的编译器
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Apache的基本使用
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • const let
  • echarts的各种常用效果展示
  • ES6系列(二)变量的解构赋值
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Python3爬取英雄联盟英雄皮肤大图
  • React-生命周期杂记
  • 从零开始学习部署
  • 日剧·日综资源集合(建议收藏)
  • 如何进阶一名有竞争力的程序员?
  • 深入浅出Node.js
  • 思否第一天
  • 云大使推广中的常见热门问题
  • 阿里云ACE认证学习知识点梳理
  • 移动端高清、多屏适配方案
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​一些不规范的GTID使用场景
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • ###C语言程序设计-----C语言学习(6)#
  • #Linux(帮助手册)
  • #php的pecl工具#
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (2)STM32单片机上位机
  • (LeetCode C++)盛最多水的容器
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (六)DockerCompose安装与配置
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (五)Python 垃圾回收机制
  • (新)网络工程师考点串讲与真题详解
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • ./configure、make、make install 命令
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .md即markdown文件的基本常用编写语法
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .net 受管制代码
  • .net图片验证码生成、点击刷新及验证输入是否正确