当前位置:首页 > VUE

vue实现页面签字

2026-03-08 06:19:27VUE

Vue 实现页面签字功能

使用 canvas 实现手写签字

在 Vue 项目中,可以通过 HTML5 的 canvas 元素实现手写签字功能。创建一个 Vue 组件,包含 canvas 元素和必要的交互逻辑。

<template>
  <div>
    <canvas 
      ref="signaturePad" 
      @mousedown="startDrawing" 
      @mousemove="draw" 
      @mouseup="stopDrawing"
      @touchstart="startDrawing" 
      @touchmove="draw" 
      @touchend="stopDrawing"
    ></canvas>
    <button @click="clearCanvas">清除</button>
    <button @click="saveSignature">保存</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isDrawing: false,
      lastX: 0,
      lastY: 0,
    };
  },
  mounted() {
    this.setupCanvas();
  },
  methods: {
    setupCanvas() {
      const canvas = this.$refs.signaturePad;
      canvas.width = 500;
      canvas.height = 300;
      this.ctx = canvas.getContext('2d');
      this.ctx.strokeStyle = '#000';
      this.ctx.lineWidth = 2;
      this.ctx.lineCap = 'round';
    },
    startDrawing(e) {
      this.isDrawing = true;
      const canvas = this.$refs.signaturePad;
      const rect = canvas.getBoundingClientRect();
      this.lastX = (e.clientX || e.touches[0].clientX) - rect.left;
      this.lastY = (e.clientY || e.touches[0].clientY) - rect.top;
    },
    draw(e) {
      if (!this.isDrawing) return;
      const canvas = this.$refs.signaturePad;
      const rect = canvas.getBoundingClientRect();
      const currentX = (e.clientX || e.touches[0].clientX) - rect.left;
      const currentY = (e.clientY || e.touches[0].clientY) - rect.top;

      this.ctx.beginPath();
      this.ctx.moveTo(this.lastX, this.lastY);
      this.ctx.lineTo(currentX, currentY);
      this.ctx.stroke();

      this.lastX = currentX;
      this.lastY = currentY;
    },
    stopDrawing() {
      this.isDrawing = false;
    },
    clearCanvas() {
      const canvas = this.$refs.signaturePad;
      this.ctx.clearRect(0, 0, canvas.width, canvas.height);
    },
    saveSignature() {
      const canvas = this.$refs.signaturePad;
      const image = canvas.toDataURL('image/png');
      this.$emit('save', image);
    }
  }
};
</script>

使用第三方库 signature_pad

对于更专业的签字功能,可以使用 signature_pad 库。该库提供了更丰富的功能和更好的兼容性。

安装 signature_pad:

npm install signature_pad

在 Vue 组件中使用:

<template>
  <div>
    <canvas ref="signaturePad"></canvas>
    <button @click="clear">清除</button>
    <button @click="save">保存</button>
  </div>
</template>

<script>
import SignaturePad from 'signature_pad';

export default {
  data() {
    return {
      signaturePad: null,
    };
  },
  mounted() {
    const canvas = this.$refs.signaturePad;
    canvas.width = 500;
    canvas.height = 300;
    this.signaturePad = new SignaturePad(canvas);
  },
  methods: {
    clear() {
      this.signaturePad.clear();
    },
    save() {
      if (this.signaturePad.isEmpty()) {
        alert('请先签字');
        return;
      }
      const image = this.signaturePad.toDataURL('image/png');
      this.$emit('save', image);
    }
  }
};
</script>

移动端适配

对于移动端设备,需要添加 touch 事件的支持。上述代码已经包含了 touch 事件的处理,确保在移动设备上也能正常使用。

保存签字图片

签字完成后,可以将 canvas 转换为 base64 编码的图片数据,用于保存或上传到服务器。通过调用 canvas 的 toDataURL 方法实现。

const image = canvas.toDataURL('image/png');

可以将该图片数据通过事件传递给父组件,或直接发送到后端服务器。

样式优化

为 canvas 添加边框和背景色,提升用户体验:

vue实现页面签字

canvas {
  border: 1px solid #ddd;
  background-color: #f9f9f9;
}

注意事项

  • 确保 canvas 的宽度和高度在 mounted 钩子中设置,避免渲染问题。
  • 对于移动端,考虑添加 preventDefault 以防止页面滚动干扰签字。
  • 签字数据保存前,检查是否为空,避免保存空白签字。

标签: 页面vue
分享给朋友:

相关文章

vue实现录音文件播放

vue实现录音文件播放

使用 Vue 实现录音文件播放 准备工作 确保项目中已安装必要的依赖,如 vue-audio-recorder 或原生 Web Audio API。录音文件播放通常涉及录音、存储和播放三个核心环节。…

jq 实现 vue

jq 实现 vue

jq 实现 Vue 的核心功能 jq 是一个轻量级的 JavaScript 库,主要用于 DOM 操作和事件处理。虽然它不能完全替代 Vue,但可以通过一些技巧模拟 Vue 的核心功能,如数据绑定、事…

vue实现按钮

vue实现按钮

Vue 实现按钮的方法 使用原生 HTML 按钮 在 Vue 模板中可以直接使用 HTML 的 <button> 元素,通过 v-on 或 @ 绑定点击事件。 <template&…

vue实现tab

vue实现tab

Vue 实现 Tab 切换功能 在 Vue 中实现 Tab 切换功能可以通过多种方式完成,以下是几种常见的实现方法: 使用 v-if 和 v-show 指令 通过绑定 v-if 或 v-show 来…

vue列表查询实现

vue列表查询实现

实现 Vue 列表查询功能 基础列表渲染 在 Vue 中可以通过 v-for 指令实现列表渲染,结合计算属性动态过滤数据: <template> <div> &l…

vue实现折叠组件

vue实现折叠组件

Vue 折叠组件实现方法 基于 v-show 和事件触发 通过 v-show 控制内容的显示与隐藏,结合点击事件切换状态。 <template> <div> &…