手写输入
2024-11-25 09:56:02
html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Signature Pad</title>
<style>
canvas {
border: 1px solid #000;
width: 100%;
max-width: 600px;
height: 300px;
}
button {
margin-top: 10px;
}
</style>
</head>
<body>
<h1>Signature Pad</h1>
<canvas id="signatureCanvas"></canvas>
<br>
<button id="clearButton">清除</button>
<button id="saveButton">保存</button>
<img id="savedImage" alt="Saved Signature" style="display:none;" />
<input type="hidden" name="qm" id="qm">
<script src="jquery-3.5.1.js"></script>
<script src="signature.js"></script>
</body>
</html>
js文件
// 获取Canvas元素和2D绘图上下文
const canvas = document.getElementById('signatureCanvas');
const ctx = canvas.getContext('2d');
// 设定Canvas尺寸
canvas.width = canvas.offsetWidth;
canvas.height = canvas.offsetHeight;
// 初始化绘图状态
let drawing = false;
let lastX = 0;
let lastY = 0;
// 开始绘制
canvas.addEventListener('mousedown', (e) => {
drawing = true;
[lastX, lastY] = [e.offsetX, e.offsetY];
});
canvas.addEventListener('mousemove', (e) => {
if (!drawing) return;
ctx.beginPath();
ctx.moveTo(lastX, lastY);
ctx.lineTo(e.offsetX, e.offsetY);
ctx.stroke();
[lastX, lastY] = [e.offsetX, e.offsetY];
});
canvas.addEventListener('mouseup', () => drawing = false);
canvas.addEventListener('mouseout', () => drawing = false);
// 移动端支持
canvas.addEventListener('touchstart', (e) => {
drawing = true;
const touch = e.touches[0];
const rect = canvas.getBoundingClientRect();
[lastX, lastY] = [touch.clientX - rect.left, touch.clientY - rect.top];
});
canvas.addEventListener('touchmove', (e) => {
if (!drawing) return;
const touch = e.touches[0];
const rect = canvas.getBoundingClientRect();
ctx.beginPath();
ctx.moveTo(lastX, lastY);
ctx.lineTo(touch.clientX - rect.left, touch.clientY - rect.top);
ctx.stroke();
[lastX, lastY] = [touch.clientX - rect.left, touch.clientY - rect.top];
});
canvas.addEventListener('touchend', () => drawing = false);
// 清除Canvas
document.getElementById('clearButton').addEventListener('click', () => {
ctx.clearRect(0, 0, canvas.width, canvas.height);
});
// 保存签名为图片
document.getElementById('saveButton').addEventListener('click', () => {
const dataURL = canvas.toDataURL('image/png');
const img = document.getElementById('savedImage');
img.src = dataURL;
$("#qm").val(dataURL);
img.style.display = 'block';
});
上一篇:打印iframe 页面
下一篇:纯CSS实现立体纸张折叠动效
- 韩国宣布对朝鲜实施单边制裁,外交部回应2022-10-14
- 31省区市新增本土“223+747”2022-10-05
- 这种武器,西方为何拒绝给乌克兰?2022-10-04
- 北方多地迎来雨雪大风 气温将大范围创下半年来新低2022-10-10
- 台风“纳沙”影响广东:57个台风预警生效2022-10-16
- 上海10月8日新增本土确诊2例、本土无症状感染者19例2022-10-09
- 侠客岛:美军为啥对一块中国磁铁神经过敏?2022-10-11
- 北京通州马驹桥镇发现一管“10混1”初筛阳性2022-10-09
- 或创两年半新高 机构预测9月CPI涨幅重回“3时代”2022-10-14
- 这部电影火了!网友:值得受到更多关注2022-10-17
- 午夜更新!全国现有高中风险区695+617个,一图速览2022-10-05
- 广东10月4日新增本土确诊34例、无症状感染者24例2022-10-05
- 10月6日7时至22时 海口实行临时性全域静态管理2022-10-06
- 北京10月5日新增本土确诊2例、无症状感染者2例2022-10-06
- 北京朝阳区新增2名新冠肺炎初筛阳性人员2022-10-09
- 二十大报告亮点纷呈 众多重要表述受关注2022-10-16
- 未来中国开放的大门只会越开越大2022-10-17