vue3+h5实现手写签名

接上
还是同一个后台
还是同一个h5页面…
先看效果
在这里插入图片描述
点击签字 跳转路由
canvas页面主要实现手写签名部分

<template>
  <div class="canvasPage">
    <van-nav-bar title="签名" left-text="返回" left-arrow @click-left="onClickLeft" />
    <div class="page sign-page">
      <div class="content">
        <div class="sign-wrap" id="signWrap">
          <canvas id="myCanvas" width="100%" height="100%" class="canvasBg"></canvas>
        </div>
      </div>
      <div class="con-btn">
        <van-button type="primary" class="staging-btn size14" @click="clearArea()"
          >清除签名</van-button
        >
        <van-button class="submit-btn size14" @click="saveSign()">确认签名</van-button>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      image: "",
      mousePressed: false,
      c: "",
      ctx: "",
      lastX: 0,
      lastY: 0,
    };
  },
  mounted() {
    this.image = "";
    this.mousePressed = false;
    var lastX, lastY;
    this.ctx = document.getElementById("myCanvas").getContext("2d");
    this.c = document.getElementById("myCanvas");
    var signWrap = document.getElementById("signWrap");
    this.c.width = signWrap.clientWidth; // 设置宽度
    this.c.height = signWrap.clientHeight; // 设置高度
    // 监听touchstart事件,touchmove事件,touchend事件等事件
    this.InitThis();
  },
  methods: {
    InitThis() {
      // 触摸屏
      var that = this;
      this.c.addEventListener(
        "touchstart",
        function (event) {
          if (event.targetTouches.length == 1) {
            event.preventDefault(); // 阻止浏览器默认事件,重要
            var touch = event.targetTouches[0];
            this.mousePressed = true;
            that.Draw(touch.pageX - this.offsetLeft, touch.pageY - this.offsetTop, false);
          }
        },
        false
      );
      this.c.addEventListener(
        "touchmove",
        function (event) {
          if (event.targetTouches.length == 1) {
            event.preventDefault(); // 阻止浏览器默认事件,重要
            var touch = event.targetTouches[0];
            if (this.mousePressed) {
              that.Draw(
                touch.pageX - this.offsetLeft,
                touch.pageY - this.offsetTop,
                true
              );
            }
          }
        },
        false
      );
      this.c.addEventListener(
        "touchend",
        function (event) {
          if (event.targetTouches.length == 1) {
            event.preventDefault(); // 阻止浏览器默认事件,防止手写的时候拖动屏幕,重要
            this.mousePressed = false;
          }
        },
        false
      );
      // 鼠标
      this.c.onmousedown = function (event) {
        this.mousePressed = true;
        that.Draw(event.pageX - this.offsetLeft, event.pageY - this.offsetTop, false);
      };
      this.c.onmousemove = function (event) {
        if (this.mousePressed) {
          that.Draw(event.pageX - this.offsetLeft, event.pageY - this.offsetTop, true);
        }
      };
      this.c.onmouseup = function (event) {
        this.mousePressed = false;
      };
    },
    Draw(x, y, isDown) {
      if (isDown) {
        this.ctx.beginPath();
        this.ctx.strokeStyle = "#000"; // 颜色
        this.ctx.lineWidth = 3; // 线宽
        this.ctx.lineJoin = "round";
        this.ctx.lineMax = 10; // 设置画笔最大线宽
        this.ctx.lineMin = 3; // 设置画笔最小线宽
        this.ctx.linePressure = 1.2; // 设置画笔笔触压力
        this.ctx.smoothness = 30; // 设置画笔笔触大小变化的平滑度
        this.ctx.moveTo(this.lastX, this.lastY);
        this.ctx.lineTo(x, y);
        this.ctx.closePath();
        this.ctx.stroke();
      }
      this.lastX = x;
      this.lastY = y;
    },
    // 清空画板
    clearArea() {
      this.ctx.setTransform(1, 0, 0, 1, 0, 0);
      this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);
    },
    // 提交签名
    saveSign() {
      this.checkEmpty(); // 调用 表单非空验证
    },
    checkEmpty() {
      var c = document.getElementById("myCanvas"); // 获取html的canvas对象,我这个id="myCanvas"
      if (this.isCanvasBlank(c)) {
        // alert("请在签名区域签名后再次确认");
        this.$notify("请在签名区域签名后再次确认");
        return;
      } else {
        var image = this.c.toDataURL("image/png"); // 得到生成后的签名base64位  url 地址
        let imageUrl = image;
        this.$router.push({
          path: "/home",
          query: {
            imageUrl: imageUrl,
          },
        });
      }
    },

    // 验证canvas画布是否为空函数
    isCanvasBlank(canvas) {
      var blank = document.createElement("canvas"); // 系统获取一个空canvas对象
      blank.width = canvas.width;
      blank.height = canvas.height;
      return canvas.toDataURL() == blank.toDataURL(); // 比较值相等则为空
    },
    onClickLeft() {
      this.$router.go(-1);
    },
  },
};
</script>

<style scoped>
.canvasPage {
  position: absolute;
  width: 100%;
  height: 100%;
  left: 0;
  top: 0;
  background: #fff;
}
.page {
  width: 100%;
}
.content {
  width: 100%;
  height: 500px;
}
.sign-wrap {
  width: 100%;
  height: 100%;
}
.con-btn {
  width: 100%;
  display: flex;
  /* align-content: center;*/
  justify-content: space-around;
  opacity: 0.75;
  margin-top: 1.25rem;
}
.con-btn span {
  /* font-size: 0.14rem; */
  width: 100%;
  /* height: 0.48rem; */
  display: flex;
  align-items: center;
  justify-content: center;
}
.staging-btn {
  color: #4154ff;
  background: #fff;
}
.submit-btn {
  color: #fff;
  background: #4154ff;
}
.canvasBg {
  background: var(--van-gray-5);
}
</style>

然后回到home页面 路由接收传递过来的base64地址

watch: {
    $route() {
      let that = this;
      if (this.$route.query.imageUrl) {
        that.img_pic = this.$route.query.imageUrl;
      }
    },

在组件中图片渲染就完成啦

<van-field   v-model="signPic"  readonly
                input-align="right"
                label="接收人签字"
                :rules="imgRules"
                name="signPic">
                <template #button>
                  <img v-if="img_pic" :src="img_pic" alt="" style="width: 100px" />
                  <a v-else style="color: var(--van-primary-color); cursor: pointer" @click="showCanvas">点击签字</a>
                </template>
              </van-field>
温柔锤
关注 关注
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
vue3-signature-pad:vue3签名板的实现
03-20
Vue3签名板 安装 待定 用法 有关更多信息,请查看文件 学分 基于HTML5画布的平滑签名绘制 -Vue2的签名板的实现 -Vue包生成器 执照 麻省理工学院:copyright:
vue3 + canvas 手写签名
weixin_45145119的博客
08-08 314
【代码】vue3 + canvas 手写签名
vue3项目引入电子签名(可横屏竖屏)
月影神社
12-20 1027
开发电子签名功能及样式。
手写签名功能(vue3)
最新发布
每一次跌倒都是为了华丽的站起来。
04-17 796
【代码】手写签名功能(vue3)
Vue3(h5)封装电子签名组件
m0_61919101的博客
12-08 738
基于vue3-signature封装电子签名组件(复制即可使用)
Vue 实现电子签名
weixin_52046784的博客
11-09 4989
我使用的是vue-cli2 1.下载插件: npm install vue-esign --save 2.全局引入: //main.js中引入: import vueEsign from ‘vue-esign’ Vue.use(vueEsign) 3.示例代码: 这是电子签名组件 1.定义数据和清空、生成事件回调 2.模板中使用组件,并属性传值 3.上传到oss并返回访问路径在模板中显示 请在下方书写电子签名 4.文件格式: 默认canvas会生成base64格式的图片
Vue项目中实现签名
weixin_45634433的博客
07-19 2234
经常在银行的业务或者是电子合同的签署是会有签名的场景,就想看一下怎么实现,但是自己对于canvas并不是熟悉的,在这里记录一下这个写法 代码配置 <template> <!-- 手写签名组件 --> <div class="page sign-page"> <div class="content"> <div class="sign-wrap" id="signWrap"> <canvas id.
Vue-电子签名(E-Signature)
热门推荐
TingLogin的博客
04-07 1万+
业务场景 用户在页面使用电子签名进行文件的签收与信息的确认 分析 考虑用户会通过手机或者PC端进行操作,因此需要在事件中考虑手机端部分 思路 通过一个对话框的形式利用Canvas生成图片并通过toDataURL()转换成Base64的形式保存下来提交给后端进行保存 最终效果 实际效果展示 实现 详情请看:Vue-电子签名(E-Signature) ...
vue实践:构建高效的电子签名功能
Shids_的博客
01-29 2956
vue实践:构建高效的电子签名功能
vue 实现签字功能
lrbtony的博客
12-13 878
imgFile = this.base64ImgtoFile(res, 'file') //得到文件格式。1、安装:npm install vue-esign --save。// 将base64,转换成图片。
vue 实现电子签名(关于vue-esign插件的使用)
耳火的博客
12-27 1594
在写一个校园类的系统时,有需求使用电子签名的功能,参考了很多不错的案例(文章后面有分享),所以就有了以下文章。 用于自用的笔记记录,写的可能有些乱,希望能帮到你。
vue签名组件-移动
06-13
此组件为单独组件,通过components引入即可使用,根据项目需求自行配置编写样式
vue+canvas实现移动端手写签名
12-28
本文实例为大家分享了vue+canvas实现移动端手写签名的具体代码,供大家参考,具体内容如下 <i class=el-icon-arrow-left click=goBack></i> 个人签名 <div class=canvasBox
vue 使用 canvas 实现手写电子签名
11-20
功能 兼容 PC 和 Mobile;...npm install vue-esign --save 使用 main.js 中引入 import vueEsign from 'vue-esign' Vue.use(vueEsign) 页面中使用 必须设置 ref ,用来调用组件的两个内置方法 reset() 和 generate
vue使用canvas实现移动端手写签名
10-14
主要为大家详细介绍了基于vue使用canvas实现移动端手写签名,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
vue3+ts+vuerouter+pinia+elementplus+ts环境模板搭建及vite打包优化
05-12
vue3+ts+vuerouter+pinia+elementplus+ts环境模板搭建及vite打包优化vue3+ts+vuerouter+pinia+elementplus+ts环境模板搭建及vite打包优化vue3+ts+vuerouter+pinia+elementplus+ts环境模板搭建及vite打包优化vue3+ts+...
Vue项目中实现手写签名
Cikayo的博客
11-10 974
Vue项目中实现手写签名,sign-canvas 组件使用
使用vue-sign插件
m0_74265396的博客
10-17 649
Vue-sign是一个基于Vue.js和Canvas的签名组件,可以轻松地在Vue应用程序中实现签名板或手写签名功能。使用它可以使用户在前端网页上直接进行手写签名实现更好的用户交互和业务需求。通过以上步骤,您将能够在Vue.js应用程序中使用Vue-sign组件来创建电子签名签名板。通过Vue.js框架进行开发,易于集成到Vue应用程序中;提供签名图片的导出、清空、撤销等功能,方便数据存储和处理;支持移动端和PC端,便于用户在不同设备上进行签名;支持自定义签名面板的大小、颜色、粗细等样式设置;
vue封装独立组件:实现手写签名功能
qq_45796592的博客
11-03 1688
vue实现手写签名功能
springboot+vue实现手写签名 生层代码
06-01
这是一个比较复杂的功能,需要前后端配合完成。以下是一个简单的示例代码,供参考: 后端(Spring Boot): 1. 首先,需要引入相关依赖...2. 然后,使用 SignaturePad 组件来进行手写签名: ``` 保存签名 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • vue中如何取消严格模式 8054
  • vue获取浏览器url参数 4431
  • vue 保留两位数字(含四舍五入 非四舍五入) 3163
  • antdesignvue数字输入框限制只能输入整数 2648
  • vue高仿小米商城项目总结(上) 2018

分类专栏

  • 笔记 5篇

最新评论

  • vue3+h5实现手写签名

    前端大斗师: 这不是Vue2吗

  • vue获取浏览器url参数

    青牛埠: 定义了两个cs

  • antdesignvue数字输入框限制只能输入整数

    十九万里: 来观摩一下大佬的文章

  • vue3+h5实现手写签名

    晚风吹心事: 总结的很不错,往后的日子里继续努力表情包

  • 面试录音(js基础、vue)面试题

    十九万里: 记录的真好

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • antdesignvue数字输入框限制只能输入整数
  • 前端解决后端返回的图片二进制文件
  • vue获取浏览器url参数
2022年6篇
2021年43篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

哆哆女性网聚生网管破解版周易预测准确度解梦查询三藏起名网公司取名三门网站制作起名雯招标设计网站国外设计感很强的网站衣服网站制作制作公司网站教程小看影三界劳改局ww4408高清免费云主机 网站建设百胜(济南)餐饮管理有限公司给家俱起名字牛仔店铺起名鼠年任姓男孩起名网络营销推广设计电视剧麦香在哪个频道播出按古诗词起名字的seo如何进行宁波排名seo优化青岛网站seo优化价格英文网站优化seoseo排名工具快速提高瓷都在线起名大全女孩缺水起什么名字好泰州seo网站优化网站建设公司意典品牌淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻不负春光新的一天从800个哈欠开始有个姐真把千机伞做出来了国产伟哥去年销售近13亿充个话费竟沦为间接洗钱工具重庆警方辟谣“男子杀人焚尸”男子给前妻转账 现任妻子起诉要回春分繁花正当时呼北高速交通事故已致14人死亡杨洋拄拐现身医院月嫂回应掌掴婴儿是在赶虫子男孩疑遭霸凌 家长讨说法被踢出群因自嘲式简历走红的教授更新简介网友建议重庆地铁不准乘客携带菜筐清明节放假3天调休1天郑州一火锅店爆改成麻辣烫店19岁小伙救下5人后溺亡 多方发声两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#青海通报栏杆断裂小学生跌落住进ICU代拍被何赛飞拿着魔杖追着打315晚会后胖东来又人满为患了当地回应沈阳致3死车祸车主疑毒驾武汉大学樱花即将进入盛花期张立群任西安交通大学校长为江西彩礼“减负”的“试婚人”网友洛杉矶偶遇贾玲倪萍分享减重40斤方法男孩8年未见母亲被告知被遗忘小米汽车超级工厂正式揭幕周杰伦一审败诉网易特朗普谈“凯特王妃P图照”考生莫言也上北大硕士复试名单了妈妈回应孩子在校撞护栏坠楼恒大被罚41.75亿到底怎么缴男子持台球杆殴打2名女店员被抓校方回应护栏损坏小学生课间坠楼外国人感慨凌晨的中国很安全火箭最近9战8胜1负王树国3次鞠躬告别西交大师生房客欠租失踪 房东直发愁萧美琴窜访捷克 外交部回应山西省委原副书记商黎光被逮捕阿根廷将发行1万与2万面值的纸币英国王室又一合照被质疑P图男子被猫抓伤后确诊“猫抓病”

哆哆女性网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化