首页 > 其他分享 >html+canvas 实现签名功能

html+canvas 实现签名功能

时间:2024-07-18 11:07:23浏览次数:9  
标签:function canvas const strokes ctx html 签名 lastY

运行效果

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 handleMouseDown(e) {
            isDrawing = true;
            [lastX, lastY] = [e.clientX - canvas.offsetLeft, e.clientY - canvas.offsetTop];
            strokes.push([]); // 开始新的笔画
        }

        // 鼠标移动事件
        function handleMouseMove(e) {
            if (!isDrawing) return; // 如果鼠标没有按下,则退出函数

            const x = e.clientX - canvas.offsetLeft;
            const y = e.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 handleMouseUp() {
            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('mousedown', handleMouseDown);
        canvas.addEventListener('mousemove', handleMouseMove);
        canvas.addEventListener('mouseup', handleMouseUp);
        canvas.addEventListener('mouseout', handleMouseUp);
    </script>
</body>

</html>

标签:function,canvas,const,strokes,ctx,html,签名,lastY
From: https://www.cnblogs.com/darling331/p/18309104

相关文章

  • 爬虫之xpath模块,request-html模块,Selenium框架,
    Ⅰ爬虫之xpath模块【一】xpath引言【1】介绍xpath在Python的爬虫学习中,起着举足轻重的地位,对比正则表达式re两者可以完成同样的工作,实现的功能也差不多,但xpath明显比re具有优势,在网页分析上使re退居二线。xpath全称为XMLPathLanguage一种小型的查询语言【2】优点可......
  • useHeadSafe:安全生成HTML头部元素
    title:useHeadSafe:安全生成HTML头部元素date:2024/7/17updated:2024/7/17author:cmdragonexcerpt:摘要:“useHeadSafe”是Vue.js组合函数,用于安全生成HTML头部元素,通过限制输入值格式避免XSS等安全风险,提供了安全值白名单确保只有安全属性被添加。categories:前端开......
  • laravel11: 给接口增加签名验证
    一,添加controller/中间件/路由1,添加中间件liuhongdi@lhdpc:/data/site/gsapi$phpartisanmake:middlewareApiSignINFOMiddleware[app/Http/Middleware/ApiSign.php]createdsuccessfully.2,添加路由:在routes/api.php文件中Route::controller(VirtualControlle......
  • WebAPI公开接口请求签名验证
    前言现在的系统后端开发的时候,会公开很多API接口对于要登录认证后才能访问的接口,这样的请求验证就由身份认证模块完成但是也有些接口是对外公开的,没有身份认证的接口我们怎么保证接口的请求是合法的,有效的.这样我们一般就是对请求的合法性做签名验证.实现原理为保证接......
  • 大学生HTML期末大作业——HTML+CSS+JavaScript广东传统文化
    HTML+CSS+JS【传统文化】网页设计期末课程大作业web前端开发技术web课程设计网页规划与设计......
  • HTML2048小游戏(最新版)
    比上一篇文章的2048更好一点。控制方法:WASD键(小写)或页面上四个按钮效果图如下:         源代码在图片后面  源代码 ·HTML·<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="wid......
  • uniapp [全端兼容] - 详细实现用户电子签名 “逐字校验“ 将姓名按字拆开分别手写签署
    前言如果您需要“合同专用”签字板及展示,请访问这篇文章。在uni-app全平台兼容(H5网页网站、支付宝/微信小程序、安卓App、苹果App、nvue)项目开发中,详解完成用户进行电子签名时,将其姓名进行拆分为独立的汉字,并由系统自动生成渲染对应的单个汉字文字的签名和验证笔画......
  • HTML初学自用1
    一、HTML的概述1.1简介HTML,全称叫超文本标记语言,英文名是HyperTextMarkupLanguage,是一种标记语言。HTML是用来设计网页的布局结构的。(1)html的编辑需要拓展名为.html的文件。拓展名查看方法如下图编辑器(加粗已安装)0.VisualStudioCode1.微软电脑自带的记事本2.Sublim......
  • python接口自动化(二十八)--html测试 报告——下(详解)
    宏哥微信粉丝群:https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入1.简介五一小长假已经结束了,想必大家都吃饱喝足玩好了,那就继续学习吧。一天不学习,自己知道;两天不学习,对手知道;三天不学习,大家知道;一周不学习,智商输给猪。好了开个玩笑都逗大家一乐,但是想想还......
  • canvas快速入门(二)直线与折线的绘画
    注释很详细,直接上代码新增内容:1.直线绘制方法2.折线绘制方法3.画笔颜色调整方法4.画笔粗细调整方法项目结构:源码:index.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="......