前端如何实现线上签名功能?

以下是我的一个demo,想问问还有没有大神有其他实现方案

<!DOCTYPE html>
<html>
<head>
  <title>在线签名</title>
</head>
<body>
  <canvas id="signatureCanvas" width="400" height="200" style="border: 1px solid #000;"></canvas>
  <button id="clearButton">清除签名</button>
  <button id="saveButton">保存签名</button>

  <script>
    // 获取canvas元素
    const canvas = document.getElementById('signatureCanvas');
    const ctx = canvas.getContext('2d');

    // 设置画笔属性
    ctx.lineWidth = 2;
    ctx.strokeStyle = 'black';

    // 初始化签名状态
    let isDrawing = false;
    let lastX = 0;
    let lastY = 0;

    // 鼠标按下时开始签名
    canvas.addEventListener('mousedown', (e) => {
      isDrawing = true;
      [lastX, lastY] = [e.offsetX, e.offsetY];
    });

    // 鼠标移动时绘制签名
    canvas.addEventListener('mousemove', draw);

    // 鼠标抬起时停止签名
    canvas.addEventListener('mouseup', () => isDrawing = false);
    canvas.addEventListener('mouseout', () => isDrawing = false);

    // 清除签名
    const clearButton = document.getElementById('clearButton');
    clearButton.addEventListener('click', () => {
      ctx.clearRect(0, 0, canvas.width, canvas.height);
    });

    // 保存签名(生成签名图片)
    const saveButton = document.getElementById('saveButton');
    saveButton.addEventListener('click', () => {
      const signatureImage = new Image();
      signatureImage.src = canvas.toDataURL();
      document.body.appendChild(signatureImage);
    });

    // 绘制函数
    function draw(e) {
      if (!isDrawing) return;
      ctx.beginPath();
      ctx.moveTo(lastX, lastY);
      ctx.lineTo(e.offsetX, e.offsetY);
      ctx.stroke();
      [lastX, lastY] = [e.offsetX, e.offsetY];
    }
  </script>
</body>
</html>
阅读 1.6k
avatarAI BotBETA

这个代码示例使用HTML5的canvas和JavaScript来实现一个基本的在线签名功能。它有以下几个关键部分:

  1. canvas元素:用于显示签名,并可以从中生成图片。
  2. ctx对象:canvas的上下文,用于绘制线条和形状。
  3. 画笔属性:设置画笔的线条宽度和颜色。
  4. 签名状态:包括一个布尔值isDrawing来标识是否正在绘制签名,以及lastXlastY来存储上一次绘制的坐标。
  5. 事件监听器:清除和保存签名的按钮被添加了点击事件监听器。canvas元素添加了鼠标按下、移动、抬起和移出的事件监听器。

在你的代码中,当鼠标按下并移动时,会调用draw函数,它使用上一次绘制的坐标和当前坐标之间的线段来绘制签名。当鼠标抬起时,签名绘制结束。

清除签名的功能通过清除canvas的内容来实现。保存签名的功能通过将canvas的内容转换为图片(data URL)并将图片添加到body元素来实现。

对于其他实现方案,你可能想考虑使用更先进的技术,如SVG或HTML Signature,这些库专门为在线签名而设计,并且可能有更多配置项和更高级的功能。你还可以考虑将签名与后端服务器同步,以便在其他地方使用签名,或者在签名上添加更多的交互性功能,如撤销和重做操作。

3 个回答

可以用sign-canvas插件实现

新手上路,请多包涵

用vant有现成的插件

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题