电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

vue+canvas實現移動端手寫簽名

瀏覽:56日期:2023-01-19 11:20:55

本文實例為大家分享了vue+canvas實現移動端手寫簽名的具體代碼,供大家參考,具體內容如下

<template> <div class='sign'> <div class='header'> <i @click='goBack'></i> <span class='title'>個人簽名</span> </div> <section class='signature'> <div class='signatureBox'> <div ref='canvasHW'><canvas ref='canvasF' @touchstart=’touchStart’ @touchmove=’touchMove’ @touchend=’touchEnd’ @mousedown='mouseDown' @mousemove='mouseMove' @mouseup='mouseUp'></canvas> </div> </div> </section> <div class='btnBox'> <div @click='overwrite' class='btn1'>重置</div> <div @click='commit' class='btn1'>確定</div> </div> <div :style='imgUrlList.length>0 ? ’border: 1px solid #d9d9d9;’ : ’’'> <img v-for='i in imgUrlList' :src='http://www.hdgsjgj.cn/bcjs/i'> <img v-show='imgUrlList.length>0' src='http://www.hdgsjgj.cn/assets/img/signdelete.png' @click='deleteAll'> </div> <div class='tijiao-box'> <button @click='commitAll' class='tijiao'>提 交</button> </div> </div></template><script>import { Bus } from ’@/utils’export default { name:’personsign’, data() { return { stageInfo:’’, imgUrl:’’, imgUrlList:[], client: {}, points: [], canvasTxt: null, startX: 0, startY: 0, moveY: 0, moveX: 0, endY: 0, endX: 0, w: null, h: null, isDown: false, isViewAutograph: this.$route.query.isViews > 0, contractSuccess: this.$route.query.contractSuccess, } }, mounted() { let canvas = this.$refs.canvasF canvas.height = this.$refs.canvasHW.offsetHeight -0 canvas.width = this.$refs.canvasHW.offsetWidth - 0 this.canvasTxt = canvas.getContext(’2d’) this.canvasTxt.lineWidth = 4 this.stageInfo = canvas.getBoundingClientRect() }, methods: { goBack(){ this.$router.go(-1) // session.clear() }, //mobile touchStart(ev) { ev = ev || event ev.preventDefault() if (ev.touches.length == 1) { let obj = { x: ev.targetTouches[0].clienX, y: ev.targetTouches[0].clientY, } this.startX = obj.x this.startY = obj.y this.canvasTxt.beginPath() this.canvasTxt.moveTo(this.startX, this.startY) this.canvasTxt.lineTo(obj.x, obj.y) this.canvasTxt.stroke() this.canvasTxt.closePath() this.points.push(obj) } }, touchMove(ev) { ev = ev || event ev.preventDefault() if (ev.touches.length == 1) { let obj = { x: ev.targetTouches[0].clientX - this.stageInfo.left, y: ev.targetTouches[0].clientY - this.stageInfo.top } this.moveY = obj.y this.moveX = obj.x this.canvasTxt.beginPath() this.canvasTxt.moveTo(this.startX, this.startY) this.canvasTxt.lineTo(obj.x, obj.y) this.canvasTxt.stroke() this.canvasTxt.closePath() this.startY = obj.y this.startX = obj.x this.points.push(obj) } }, touchEnd(ev) { ev = ev || event ev.preventDefault() if (ev.touches.length == 1) { let obj = { x: ev.targetTouches[0].clientX - this.stageInfo.left, y: ev.targetTouches[0].clientY - this.stageInfo.top } this.canvasTxt.beginPath() this.canvasTxt.moveTo(this.startX, this.startY) this.canvasTxt.lineTo(obj.x, obj.y) this.canvasTxt.stroke() this.canvasTxt.closePath() this.points.push(obj) } }, //pc mouseDown(ev) { ev = ev || event ev.preventDefault() if (1) { let obj = { x: ev.offsetX, y: ev.offsetY } this.startX = obj.x this.startY = obj.y this.canvasTxt.beginPath() this.canvasTxt.moveTo(this.startX, this.startY) this.canvasTxt.lineTo(obj.x, obj.y) this.canvasTxt.stroke() // this.canvasTxt.strokeRect(20,20,80,100); this.canvasTxt.closePath() this.points.push(obj) this.isDown = true } }, mouseMove(ev) { ev = ev || event ev.preventDefault() if (this.isDown) { let obj = { x: ev.offsetX, y: ev.offsetY } this.moveY = obj.y this.moveX = obj.x this.canvasTxt.beginPath() this.canvasTxt.moveTo(this.startX, this.startY) this.canvasTxt.lineTo(obj.x, obj.y) this.canvasTxt.stroke() this.canvasTxt.closePath() this.startY = obj.y this.startX = obj.x this.points.push(obj) } }, mouseUp(ev) { ev = ev || event ev.preventDefault() if (1) { let obj = { x: ev.offsetX, y: ev.offsetY } this.canvasTxt.beginPath() this.canvasTxt.moveTo(this.startX, this.startY) this.canvasTxt.lineTo(obj.x, obj.y) this.canvasTxt.stroke() this.canvasTxt.closePath() this.points.push(obj) this.points.push({x: -1, y: -1}) this.isDown = false } }, //重寫 overwrite() { this.canvasTxt.clearRect(0, 0, this.$refs.canvasF.width, this.$refs.canvasF.height) this.points = [] }, //確定簽名 commit() { this.imgUrl=this.$refs.canvasF.toDataURL(); this.imgUrlList.push(this.imgUrl) if(this.imgUrlList.length>0){ this.canvasTxt.clearRect(0, 0, this.$refs.canvasF.width, this.$refs.canvasF.height) this.points = [] } }, deleteAll(){ this.imgUrlList = [] }, // 提交簽名給前一頁 commitAll(){ // 用canvas合并多張圖片的base64為一張圖的base64 var canvas = document.createElement('canvas'); canvas.width = 75*this.imgUrlList.length; canvas.height = 100; var context = canvas.getContext('2d'); context.rect(0 , 0 , canvas.width , canvas.height); context.fillStyle = '#fff'; context.fill(); var myImage = new Image(); myImage.crossOrigin = ’Anonymous’; // 當簽名列表有值時 if(this.imgUrlList.length>0){ for(let i = 0;i<this.imgUrlList.length;i++){ myImage.src = this.imgUrlList[i] // 多張圖片繪制成一張圖片 context.drawImage(myImage , 50*i , 0 , 75 , 75); //context.drawImage(img,x,y,width,height); // context.font = '60px Courier New'; // context.fillText('我是文字',350,450); } var base64 = canvas.toDataURL('image/jpg'); //'image/jpg' 這里注意一下 this.$router.go(-1) //要在bus之前寫不然值傳不回去 setTimeout(() => { Bus.$emit(’signImage’,base64) //簽名base64傳給前一頁 }, 300) } } }, beforeDestroy(){ // 銷毀bus Bus.$off() }}</script><style scoped lang='scss'>// 簽名樣式很重要,會影響觸點位置.sign{ width: 100%; min-height: 100vh; position: relative; .header{ margin-bottom: 20px; } .tijiao-box{ width: 100%; text-align: center; } .tijiao{ width: 90%; height: 84px; color: #fff; border-radius: 2px; background: #fa4b31; box-shadow: 0 0 0px 1px #fa4b31; font-size: 30px; }}.signature{ width: 100%; height: 50vh;}.imglist-box{ width: 90%; margin: 0 auto; margin-bottom: 20px; position: relative;}.imgCanvas{ width: 150px; height: 150px;}.resign{ width: 14%; position: absolute; top: 0; right: 0;} .signatureBox { width: 90%; margin: 0 auto; height: calc(100% - 50px); box-sizing: border-box; overflow: hidden; background: #fff; z-index: 100; display: flex; flex-direction: column; align-items: center; } .canvasBox { width: 100%; align-items: center; box-sizing: border-box; flex: 1; } canvas { background-image: url(’../../assets/img/signbg.png’); background-position: center center; background-repeat: no-repeat; background-origin: border-box; background-size: 100% 100%; } .btnBox{ width: 90%; margin: 0 auto; display: flex; justify-content: space-between; margin-bottom: 20px; .btn1{ width: 46%; height: 84px; line-height: 84px; color: #fa4b31; border-radius: 2px; background: #fff; border: 1px solid #fa4b31; box-shadow: 0 0 0px 1px #fa4b31; font-size: 30px; text-align: center; }} .btnBox button:first-of-type { background: transparent; border-radius: 4px; height: 40px; width: 80px; font-size: 14px; } .btnBox button:last-of-type { background: #71b900; color: #fff; border-radius: 4px; height: 40px; width: 80px; font-size: 14px; }</style>

vue+canvas實現移動端手寫簽名

vue+canvas實現移動端手寫簽名

vue+canvas實現移動端手寫簽名

重置就是清除田字格當前字,確定就將字保存為一張圖片base64排列在列表。

重簽就是刪除列表所有圖片,提交就是將多張圖合并為一張且傳給前一頁顯示。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Vue
相關文章:
主站蜘蛛池模板: 云南外加剂,云南速凝剂,云南外加剂代加工-普洱澜湄新材料科技有限公司 | 污水处理设备维修_污水处理工程改造_机械格栅_过滤设备_气浮设备_刮吸泥机_污泥浓缩罐_污水处理设备_污水处理工程-北京龙泉新禹科技有限公司 | 东莞市踏板石餐饮管理有限公司_正宗桂林米粉_正宗桂林米粉加盟_桂林米粉加盟费-东莞市棒子桂林米粉 | 自动钻孔机-全自动数控钻孔机生产厂家-多米(广东)智能装备有限公司 | 合肥卓创建筑装饰,专业办公室装饰、商业空间装修与设计。 | 广州各区危化证办理_危险化学品经营许可证代办 | 挨踢网-大家的导航! | TPM咨询,精益生产管理,5S,6S现场管理培训_华谋咨询公司 | 有机废气处理-rto焚烧炉-催化燃烧设备-VOC冷凝回收装置-三梯环境 | 自动化生产线-自动化装配线-直流电机自动化生产线-东莞市慧百自动化有限公司 | 刺绳_刀片刺网_刺丝滚笼_不锈钢刺绳生产厂家_安平县浩荣金属丝网制品有限公司-安平县浩荣金属丝网制品有限公司 | 幂简集成 - 品种超全的API接口平台, 一站搜索、试用、集成国内外API接口 | 2025黄道吉日查询、吉时查询、老黄历查询平台- 黄道吉日查询网 | 春腾云财 - 为企业提供专业财税咨询、代理记账服务 | cnc精密加工_数控机械加工_非标平键定制生产厂家_扬州沃佳机械有限公司 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 网优资讯-为循环资源、大宗商品、工业服务提供资讯与行情分析的数据服务平台 | 气动球阀_衬氟蝶阀_调节阀_电动截止阀_上海沃托阀门有限公司 | 油冷式_微型_TDY电动滚筒_外装_外置式电动滚筒厂家-淄博秉泓机械有限公司 | 辐射仪|辐射检测仪|辐射巡测仪|个人剂量报警仪|表面污染检测仪|辐射报警仪|辐射防护网 | 苏商学院官网 - 江苏地区唯一一家企业家自办的前瞻型、实操型商学院 | 硫化罐-胶管硫化罐-山东鑫泰鑫智能装备有限公司 | 齿轮减速机电机一体机_齿轮减速箱加电机一体化-德国BOSERL蜗轮蜗杆减速机电机生产厂家 | 培训中心-海南香蕉蛋糕加盟店技术翰香原中心官网总部 | 渗透仪-直剪仪-三轴仪|苏州昱创百科 | 合肥钣金加工-安徽激光切割加工-机箱机柜加工厂家-合肥通快 | 千斤顶,液压千斤顶-力良企业,专业的液压千斤顶制造商,shliliang.com | 焊锡丝|焊锡条|无铅锡条|无铅锡丝|无铅焊锡线|低温锡膏-深圳市川崎锡业科技有限公司 | 国产频谱分析仪-国产网络分析仪-上海坚融实业有限公司 | 外观设计_设备外观设计_外观设计公司_产品外观设计_机械设备外观设计_东莞工业设计公司-意品深蓝 | ET3000双钳形接地电阻测试仪_ZSR10A直流_SXJS-IV智能_SX-9000全自动油介质损耗测试仪-上海康登 | 天命文免费算命堂_自助算命_自由算命系统_长文周易 | 南京PVC快速门厂家南京快速卷帘门_南京pvc快速门_世界500强企业国内供应商_南京美高门业 | 郑州水质检测中心_井水检测_河南废气检测_河南中环嘉创检测 | PC构件-PC预制构件-构件设计-建筑预制构件-PC构件厂-锦萧新材料科技(浙江)股份有限公司 | 湖北省煤炭供应链综合服务平台| 北京三友信电子科技有限公司-ETC高速自动栏杆机|ETC机柜|激光车辆轮廓测量仪|嵌入式车道控制器 | ORP控制器_ORP电极价格-上优泰百科 | 河南中整光饰机械有限公司-抛光机,去毛刺抛光机,精密镜面抛光机,全自动抛光机械设备 | 储气罐,真空罐,缓冲罐,隔膜气压罐厂家批发价格,空压机储气罐规格型号-上海申容压力容器集团有限公司 | 东莞螺丝|东莞螺丝厂|东莞不锈钢螺丝|东莞组合螺丝|东莞精密螺丝厂家-东莞利浩五金专业紧固件厂家 |