首页 > 其他分享 >前端canvas实现签名功能,可以横屏/竖屏签名

前端canvas实现签名功能,可以横屏/竖屏签名

时间:2023-10-07 10:57:23浏览次数:40  
标签:canvas document ctx height width tempCanvas 签名 竖屏

页面展示效果,点保存后生成图片链接

图片链接展示效果

这里只展示了竖屏签名效果,横屏自己粘贴代码测试

css

.box {width: 98%;display: flex;flex-direction: column;margin: auto;}
.canvasbox {width: 100%;border: 1px solid #bbb;margin: 0 auto;overflow: hidden;}
canvas {background: #f4f5f7;}
.box2 {width: 50%;margin: 5px auto;display: flex;justify-content: space-between;}
.btn {width: 70px;height: 30px;line-height: 30px;line-height: 30px;border: 1px solid #bbb;text-align: center;border-radius: 3px;margin-top: 10px;}

 

html

<div class="box" id="myBox">
    <div class="canvasbox" id="myDiv">
        <canvas id="signatureCanvas"></canvas>
    </div>
    <div class="box2">
        <div class="btn" onclick="clearSignature()">清除</div>
        <div class="btn" onclick="saveSignature()">保存</div>
    </div>
</div>

 

js

var myDiv = document.getElementById('myDiv');
var myBox = document.getElementById('myBox');
// var mySpan = document.getElementById('mySpan');
var screenHeight = 0, screenWidth = 0;


const canvas = document.getElementById('signatureCanvas');
const ctx = canvas.getContext('2d');

let isDrawing = false;
let lastX = 0;
let lastY = 0;

canvas.addEventListener('touchstart', startDrawing);
canvas.addEventListener('touchmove', draw);
canvas.addEventListener('touchend', stopDrawing);
canvas.addEventListener('touchcancel', stopDrawing);

function draw(e) {
        if (!isDrawing) return;
        e.preventDefault();

        const currentX = e.touches[0].clientX - e.target.offsetLeft;
        const currentY = e.touches[0].clientY - e.target.offsetTop;

        ctx.beginPath();
        ctx.moveTo(lastX, lastY);
        ctx.lineTo(currentX, currentY);
        ctx.stroke();
        [lastX, lastY] = [currentX, currentY];
}

function startDrawing(e) {
        drawCanvas = true
        isDrawing = true;
        [lastX, lastY] = [e.touches[0].clientX - e.target.offsetLeft, e.touches[0].clientY - e.target.offsetTop];
}

function stopDrawing() {
        isDrawing = false;
}

// 清除签字
function clearSignature() {
        drawCanvas = false
        ctx.clearRect(0, 0, canvas.width, canvas.height);
}

function saveSignature() {
    if (!drawCanvas) {
            alert('请手写签名')
            return
    }
    const dataURL = canvas.toDataURL('image/png');  // 转换为 PNG 格式的图像数据
        // 将 dataURL 提交给后端进行处理
        console.log(dataURL)
        // fetch('/saveSignature', {  //提交接口,随便写的(改成对应的接口)
        //     method: 'POST',
        //     headers: {
        //         'Content-Type': 'application/json'
        //     },
        //     body: JSON.stringify({ signatureDataURL: dataURL })
        // }).then(response => {
        //     // 处理响应
        // }).catch(error => {
        //     // 处理错误
        // });

}
var tempCanvas = document.createElement('canvas');
var tempCtx = tempCanvas.getContext('2d');

function orient() {
        if (window.orientation == 0 || window.orientation == 180) {
            const tempCanvas = document.createElement('canvas');
            const tempCtx = tempCanvas.getContext('2d');

            // 保存当前画布内容到临时画布
            tempCanvas.width = canvas.width;
            tempCanvas.height = canvas.height;
            tempCtx.drawImage(canvas, 0, 0);
            screenHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
            screenWidth = window.innerWidth || document.documentElement.innerWidth || document.body.innerWidth;
            myDiv.style.height = screenHeight * 0.8 + 'px';
            canvas.setAttribute("height", screenHeight * 0.8);
            canvas.setAttribute("width", screenWidth);

            ctx.translate(canvas.width / 2, canvas.height / 2); // 设置中心点
            ctx.rotate((90 * Math.PI) / 180); // 逆时针旋转90度
            ctx.drawImage(tempCanvas, -tempCanvas.width / 2, -tempCanvas.height / 2);

            // 恢复画布
            ctx.rotate((-90 * Math.PI) / 180);
            ctx.translate(-canvas.width / 2, -canvas.height / 2);
            console.log('竖屏');
            alert("竖屏")

        } else {
            const tempCanvas = document.createElement('canvas');
            const tempCtx = tempCanvas.getContext('2d');

            screenHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
            screenWidth = window.innerWidth || document.documentElement.innerWidth || document.body.innerWidth;
            myDiv.style.height = screenHeight * 0.8 + 'px';

            tempCanvas.width = canvas.width;
            tempCanvas.height = canvas.height;
            tempCtx.drawImage(canvas, 0, 0);
            canvas.setAttribute("height", screenHeight * 0.8);
            canvas.setAttribute("width", screenWidth);

            ctx.translate(canvas.width / 2, canvas.height / 2); // 设置中心点
            ctx.rotate((-90 * Math.PI) / 180); // 顺时针旋转90度
            ctx.drawImage(tempCanvas, -tempCanvas.width / 2, -tempCanvas.height / 2);

            // 恢复画布
            ctx.rotate((90 * Math.PI) / 180); // 恢复旋转角度
            ctx.translate(-canvas.width / 2, -canvas.height / 2); // 恢复绘图原点
            console.log('横屏');
            alert("横屏")
        }
        myBox.style.height = screenHeight + 'px';
    }
//页面初次加载
window.onload = function () {
    orient();
}
//页面添加转屏事件          
// window.addEventListener('orientationchange', function () {
//     console.log(2222);
//     orient();
// });
//浏览器变化
window.onresize = function () {
        orient();
};

 

标签:canvas,document,ctx,height,width,tempCanvas,签名,竖屏
From: https://www.cnblogs.com/srqsl/p/17745778.html

相关文章

  • 题解 P9697【[GDCPC2023] Canvas】
    好题。后面的操作会覆盖前面的操作,这东西不好处理,我们不妨时光倒流,将问题转化为一个位置一旦被填了数,就再也不会变了。如果解决了这个问题,只需将操作序列倒过来,就得到了原问题的解。显然,所有\(x_i=y_i=2\)的操作会最先被执行,所有\(x_i=y_i=1\)的操作会最后被执行。只需要给......
  • dockerfile 由于公钥不可用,无法验证以下签名
    报错当我在打包docker镜像时,发生了报错$sudodockerbuild-tdcgm-exporter:3.2.5.1.772Thefollowingsignaturescouldn'tbeverifiedbecausethepublickeyisnotavailable:NO_PUBKEYA4B469963BF863CC……42.77W:GPGerror:https://developer.download.......
  • HTML Canvas 画布
      HTML <canvas>画布元素用于通过脚本(通常是JavaScript)动态绘制图形。 <canvas> 画布元素只是图形的容器。您必须使用脚本来实际绘制图形。 <canvas>有几种用于绘制路径、框、圆、文本和添加图像的方法。绘制canvas<!DOCTYPEhtml><htmllang="en"><head><met......
  • python: Drawing Canvas
     #encoding:utf-8#版权所有2023涂聚文有限公司#许可信息查看:#描述:#Author:geovindu,GeovinDu涂聚文.#IDE:PyCharm2023.1python311#Datetime:2023/9/2121:28#User:geovindu#Product:PyCharm#Project:EssentialAlgor......
  • android签名检测和绕过
    PackageManagerService获取签名正常APP中获取PackageInfo中的签名信息是通过Binder通讯向PackageManagerService发送TRANSACTION_getPackageInfo请求,同时设置请求的参数的flag为GET_SIGNATURES。当PackageManagerService判断是TRANSACTION_getPackageInfo请求后会去调用PackageMa......
  • 如何在Canvas中添加事件
    如何在Canvas中添加事件作为一个前端,给元素添加事件是一件司空见惯的事情。可是在Canvas中,其所画的任何东西都是无法获取的,更别说添加事件,那么我们对其就束手无策了吗?当然不是的!我们在平时项目中肯定都用过许多Canvas的框架,我们发现事件在这些框架中已经使用的十分成熟了,而且并没......
  • 2023年最新京东app端sign签名算法与cipher加解密逆向分析(2023-09-26)
    前言:  本文仅供学习交流,只提供关键思路不会给出完整代码,严禁用于非法用途,若有侵权请联系我删除!技术交流合作请私信!一.工具的选择(抓包工具的选择,是门学问)用到工具如下:1、安卓手机一台,系统版本:android6.01;型号:小米MI4LTE  之所以要选择android6手机,原理如下:  ......
  • com.qq.weixin.mp.xml.AesException: 签名验证错误
    【已解决】AesException:签名验证错误问题原因:部分语言在url接收时会将+转化为空格导致出错的。这个问题企业微信官方客服两天也没有给个解释,突然就解决了。生气...... ......
  • RAS非对称加解密-RAS加解密和签名和验签,密钥生成器(java代码)
    RAS非对称加解密-RAS加解密和签名和验签,密钥生成器(java代码)RSA算法是一种非对称加解密算法。服务方生成一对RSA密钥,即公钥+私钥,将公钥提供给调用方,调用方使用公钥对数据进行加密后,服务方根据私钥进行解密。1.RAS密钥生成器2.RAS加解密和签名和验签代码13.RAS实现签名......
  • JS实现电子签名,并将带logo和日期时间水印的电子签名图片保存到本地
    效果如下 实现代码如下<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>电子签名</title><linkrel="icon"href="http://服务器IP/pic/xmj_logo.png"><style>......