日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:167日期: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.b3g6.com/bcjs/i'> <img v-show='imgUrlList.length>0' src='http://www.b3g6.com/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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
色婷婷亚洲mv天堂mv在影片| 日韩国产欧美| 久久久久久夜| 欧美日韩一区二区三区在线电影| 99成人在线| 亚洲不卡系列| 久久精品免费看| 免费观看亚洲天堂| 欧美亚洲福利| 美日韩精品视频| 亚洲精品一级| 首页国产欧美久久| 婷婷精品进入| 成人精品天堂一区二区三区| 日韩1区2区3区| 国产综合婷婷| 日韩精品不卡一区二区| 青草av.久久免费一区| 亚洲专区视频| 蜜桃av一区二区在线观看| 国产亚洲欧洲| 国产成人精品亚洲日本在线观看| 精品五月天堂| 精品精品99| 久久精品资源| 日韩激情一二三区| 久久精品99国产精品| 欧美日韩国产一区二区在线观看| 亚洲精品欧洲| 午夜在线精品偷拍| 国内精品美女在线观看| 麻豆免费精品视频| 日韩国产精品久久久久久亚洲| 在线免费观看亚洲| 蜜臀va亚洲va欧美va天堂| 水野朝阳av一区二区三区| 综合亚洲视频| 国产日韩亚洲| 国产成人免费精品| 久久久久99| 99国产精品私拍| 中文一区一区三区免费在线观| 亚洲精品一级二级三级| 国产图片一区| 国产精品毛片aⅴ一区二区三区| 国产精品久久久久久久久久白浆 | 97精品97| 久久久夜精品| 男女性色大片免费观看一区二区| 亚洲国产日韩欧美在线| 国产精品美女久久久| 三级亚洲高清视频| 欧美三级第一页| 国产精品精品| 久久国产直播| 91精品国产乱码久久久久久久 | 国产精品天堂蜜av在线播放| 日韩精品高清不卡| 久久精品72免费观看| 精品视频自拍| 久久裸体视频| 亚洲少妇诱惑| 欧美午夜网站| 欧美日韩精品免费观看视完整| 欧美日韩日本国产亚洲在线 | 国产日产精品_国产精品毛片| 麻豆精品国产91久久久久久| 欧洲在线一区| 亚洲青青久久| 免费在线亚洲欧美| 久久久久久久久丰满| 国产精品人人爽人人做我的可爱| 亚洲精品国产精品粉嫩| 精品久久福利| 影音先锋国产精品| 久久国内精品自在自线400部| 国产suv精品一区二区四区视频| 久久中文字幕av一区二区不卡| 香蕉久久久久久久av网站| 国产精品视频一区视频二区| 日韩一区自拍| 日韩av影院| 欧美日韩国产v| 午夜亚洲福利| 亚洲啊v在线| 综合色一区二区| 日韩在线观看| 91麻豆精品| 国产一区亚洲| 国产精品男女| 国产精品丝袜xxxxxxx| 国产精品sss在线观看av| 国产综合精品一区| 日韩区一区二| 久久91导航| 亚洲精品第一| 色婷婷精品视频| 91伊人久久| 自拍日韩欧美| 国产精品网在线观看| 红桃视频亚洲| 国产黄色精品| 国产亚洲网站| 天堂av在线| 日本天堂一区| 亚洲精品一区二区在线看| 国产精品v亚洲精品v日韩精品| 日韩精品一区二区三区免费观影| 久久国产精品色av免费看| 激情婷婷久久| 久久av影院| 亚洲人成亚洲精品| 美女久久久久| 最近高清中文在线字幕在线观看1| 日韩精品第二页| 久久一区二区三区喷水| 精品视频高潮| 欧美视频久久| 日韩在线观看一区二区| 亚洲天堂免费电影| 久久av超碰| 日韩av电影一区| 亚洲尤物在线| 久久久久国产| 日韩欧美不卡| 麻豆精品在线播放| 欧美日一区二区在线观看| 日韩影院精彩在线| 九色精品91| av资源中文在线天堂| 国产欧美自拍一区| 久久xxxx精品视频| 欧美激情视频一区二区三区在线播放| 亚洲少妇自拍| 久久国产电影| 成人在线视频免费看| 美女精品久久| 国产激情精品一区二区三区| 日韩精品久久久久久| 亚洲人成毛片在线播放女女| 亚洲婷婷免费| 久久亚洲专区| 91精品蜜臀一区二区三区在线 | 久久精品亚洲欧美日韩精品中文字幕| 精品国产精品国产偷麻豆| 国产精区一区二区| 国产视频网站一区二区三区| 日韩成人精品一区二区三区 | 日韩国产综合| 久久免费福利| 日韩精品视频一区二区三区| 视频一区二区三区中文字幕| 91精品福利| 日本免费一区二区三区四区| 福利欧美精品在线| 久久精品免视看国产成人| 欧美激情aⅴ一区二区三区| 欧美日本久久| 国产福利一区二区精品秒拍| 国产精品欧美在线观看| 国产日韩欧美在线播放不卡| 97精品国产99久久久久久免费| 日本中文字幕一区二区| 97精品国产99久久久久久免费| 日韩国产欧美一区二区三区| 中文字幕亚洲在线观看| 日韩一区二区三区在线看| 日韩在线观看一区二区三区| 91成人精品观看| 国产精品一线| 日韩1区2区| 性欧美xxxx免费岛国不卡电影| 欧美成人午夜| 日韩制服丝袜先锋影音| 婷婷精品在线观看| 国产精品视频一区视频二区| 精品国产乱码久久久久久樱花| 中文av在线全新| 亚洲第一精品影视| 亚洲精品网址| 午夜在线观看免费一区| 日本精品一区二区三区在线观看视频| 久久国内精品| 丁香婷婷久久| 香蕉精品久久| 亚洲区欧美区| 欧美激情网址| 美女网站视频一区| 亚洲成人免费| 日韩综合一区二区三区| 欧美a在线观看| 成人午夜国产| 蜜桃一区二区三区在线观看| 久久爱www.| 欧美日韩中文一区二区| 免费精品视频| 国产精品videossex久久发布| 神马午夜在线视频| 日韩中文字幕麻豆| 精品一区二区三区免费看|