VUE使用canvas实现签名组件

 更新时间:2022年07月13日 11:01:06   作者:#麻辣小龙虾#  
这篇文章主要为大家详细介绍了VUE使用canvas实现签名组件,兼容PC移动端,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了VUE使用canvas实现签名组件的具体代码,供大家参考,具体内容如下

效果如下:

<template>
  <div class="sign">
    <div class="content">
      <canvas id="canvas" :width="width" :height="height"/>
    </div>
    <div class="btn">
      <button @click="clearCanvas()">清除</button>
      <button @click="save()">保存</button>
    </div>
  </div>
</template>
 
<script>
export default {
  name: 'App',
  data () {
    return {
    };
  },
  props: {
    // 画布宽度
    width: {
      type: Number,
      default: window.innerWidth
    },
    // 画布高度
    height: {
      type: Number,
      default: 500
    },
    // 笔触半径
    radius: {
      type: Number,
      default: 10
    },
    // 笔触颜色
    color: {
      type: String,
      default: '#000'
    },
    // 画布填充背景
    fillStyle: {
      type: String,
      default: '#ccc'
    }
  },
  created () {
  },
  mounted () {
    this.int();
  },
  methods: {
    // 绘制涂擦效果圆形
    // @param { integer } 圆心的x坐标
    // @param { integer } 圆心的y坐标
    // @param { integer } 圆心半径
    // @param { string } 填充的颜色
    fillCircle (ctx, x, y, radius, fillColor) {
      ctx.fillStyle = fillColor || this.color;
      ctx.beginPath();
      ctx.moveTo(x, y);
      ctx.arc(x, y, radius, 0, Math.PI * 2, false); // 标准画圆
      ctx.fill();
    },
    // 保存图片
    save (name = '签名图片') {
      let imgBase64 = this.canvas.toDataURL('image/png'); // 获取截图base64, 1表示质量(无损压缩)
      let a = document.createElement('a');
      a.download = name + '.png'; // 必须要设置download属性才能够直接下载base64图片
      a.href = imgBase64;
      a.click(); // 触发点击,起到下载效果
    },
    // 清除画布
    clearCanvas () {
      let canvas = this.canvas;
      canvas.getContext('2d').fillStyle = this.fillStyle;
      canvas.getContext('2d').fillRect(0, 0, this.width, this.height);
    },
    // 数据初始化
    int () {
      this.canvas = document.querySelector('#canvas');
      let ctx = this.canvas.getContext('2d');
      let move = false; // 按下标识
      ctx.fillStyle = this.fillStyle;
      ctx.fillRect(0, 0, this.width, this.height);
      // 事件兼容PC 移动端
      let eventStart = 'ontouchstart' in document ? 'touchstart' : 'mousedown';
      let eventMove = 'ontouchmove' in document ? 'touchmove' : 'mousemove';
      let eventEnd = 'ontouchend' in document ? 'touchend' : 'mouseup';
      this.canvas.addEventListener(eventStart, (e) => {
        console.log(e);
        let sx = e.touches ? e.touches[0].pageX : e.pageX;
        let sy = e.touches ? e.touches[0].pageY : e.pageY;
        move = true;
        this.fillCircle(ctx, sx, sy, this.radius);
      }, false);
      this.canvas.addEventListener(eventMove, (e) => {
        let sx = e.touches ? e.touches[0].pageX : e.pageX;
        let sy = e.touches ? e.touches[0].pageY : e.pageY;
        move && this.fillCircle(ctx, sx, sy, this.radius);
      }, false);
      this.canvas.addEventListener(eventEnd, (e) => {
        move = false;
      }, false);
    }
  }
};
</script>
<style lang="less" scoped>
.sign{
  .btn {
    padding:10px;
    button {
      height: 50px;
      width:100%;
      margin-bottom:10px;
      font-size: 20px;
    }
  }
}
</style>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • vue实现组件值的累加

    vue实现组件值的累加

    这篇文章主要为大家详细介绍了vue实现组件值的累加,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • axios上传文件错误:Current request is not a multipart request解决

    axios上传文件错误:Current request is not a multipart request

    最近工作中使用vue上传文件的时候遇到了个问题,下面这篇文章主要给大家介绍了关于axios上传文件错误:Current request is not a multipart request解决的相关资料,需要的朋友可以参考下
    2023-01-01
  • 如何使用el-table实现纯前端导出(适用于el-table任意表格)

    如何使用el-table实现纯前端导出(适用于el-table任意表格)

    我们日常做项目,特别是后台管理系统,常常需要导出excel文件,这篇文章主要给大家介绍了关于如何使用el-table实现纯前端导出的相关资料,本文适用于el-table任意表格,需要的朋友可以参考下
    2024-03-03
  • 简单聊一聊vue中data的代理和监听

    简单聊一聊vue中data的代理和监听

    这篇文章主要给大家介绍了关于vue中data的代理和监听的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用vue具有一定的参考学习价值,需要的朋友可以参考下
    2022-09-09
  • Vue脚手架学习之项目创建方式

    Vue脚手架学习之项目创建方式

    这篇文章主要给大家介绍了关于Vue脚手架学习之项目创建方式的相关资料,文中通过介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • vue与ant-tree结合伪造懒加载并可以查询

    vue与ant-tree结合伪造懒加载并可以查询

    这篇文章主要为大家介绍了vue与ant-tree结合伪造懒加载并可以查询实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • vue图片懒加载的两种方法详解

    vue图片懒加载的两种方法详解

    懒加载是一种网页优化技术,也被称为延迟加载,它的主要目的是在网页加载时,只加载当前可见区域内的内容,而延迟加载其他不可见区域的内容,从而提高网页的加载速度和性能,这篇文章主要介绍了vue图片懒加载的两种方法,需要的朋友可以参考下
    2023-07-07
  • vue使用showdown并实现代码区域高亮的示例代码

    vue使用showdown并实现代码区域高亮的示例代码

    这篇文章主要介绍了vue使用showdown并实现代码区域高亮的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • vue 项目接口管理的实现

    vue 项目接口管理的实现

    在vue开发中,会涉及到很多接口的处理,当项目足够大时,就需要定义规范统一的接口,本文就来介绍一下vue 项目接口管理,具有一定的参考价值,感兴趣的小伙伴可以一起来了解一下
    2019-01-01
  • Vue实现当前页面刷新的4种方法举例

    Vue实现当前页面刷新的4种方法举例

    我们在开发vue的页面的时候,有时候会遇到需要刷新当前页面功能,但是vue框架自带的router是不支持刷新当前页面功能,下面这篇文章主要给大家介绍了关于Vue实现当前页面刷新的4种方法,需要的朋友可以参考下
    2023-04-04

最新评论