在婚戀app原始碼開發中,如何實現滑動驗證碼元件?
前言
技術實現
<div v-if="visiblity" class="slidingWrap"> <div class="slidingTitle"></div> <!-- 畫布區域 --> <div class="canvasArea"> <!-- 主要渲染整體背景及鏤空圖案 --> <canvas class="canvas-bg" :width="width" :height="height"></canvas> <canvas class="block" :height="height" :style="{ left: `${blockLeft}px` }" ></canvas> </div> <!-- 底部滑塊 --> <div :class="['sliderWrap', status]" :style="{ width: `${width}px` }" @mouseleave="handleDrapUp" > <div class="progress" :style="{ width: `${blockLeft}px` }" ></div> <div class="slider-block" ref="slider" :style="{ left: `${blockLeft}px` }" @mousedown="handleDrapDown" @mouseup="handleDrapUp" @mousemove="handleDragMove" > → </div> </div> <!-- 重新整理按鈕 --> <div class="refresh" @click="onRefreshBtnClick"></div> <!-- 載入中提示 --> <div class="loading" v-show="isLoading" :style="{ width: `${width}px`, height: `${height}px` }" > <img src=" alt="" /> 載入中... </div> </div>
props: { // 元件是否可見 visiblity: { type: Boolean, default: false }, // 元件的寬度 width: { type: Number, default: 300 }, // 元件的高度 height: { type: Number, default: 200 }, // 滑塊的長度 l: { type: Number, default: 42 }, // 滑塊的半徑 r: { type: Number, default: 9 }, // 滑塊的容錯值 tolerant: { type: Number, default: 5 }, // 成功時的回撥 onSuccess: { type: Function, default: () => {} }, // 重新整理時的回撥 onRefresh: { type: Function, default: () => {} }, // 失敗時的回撥 onFail: { type: Function, default: () => {} }, // 關閉回撥 closed: { type: Function, default: () => {} }
drawPath(x, y, l, r, ctx, operation) { ctx.beginPath(); ctx.moveTo(x, y); ctx.arc(x + l / 2, y - r + 2, r, 0.72 * Math.PI, 2.26 * Math.PI); ctx.lineTo(x + l, y); ctx.arc(x + l + r - 2, y + l / 2, r, 1.21 * Math.PI, 2.78 * Math.PI); ctx.lineTo(x + l, y + l); ctx.lineTo(x, y + l); // anticlockwise為一個布林值。為true時,是逆時針方向,否則順時針方向 ctx.arc( x + r - 2, y + l / 2, r + 0.4, 2.76 * Math.PI, 1.24 * Math.PI, true ); ctx.lineTo(x, y); ctx.lineWidth = 2; ctx.fillStyle = "rgba(255, 255, 255, 0.8)"; ctx.strokeStyle = "rgba(255, 255, 255, 0.5)"; ctx.stroke(); ctx.globalCompositeOperation = "destination-over"; // 判斷是填充還是裁切, 裁切主要用於生成圖案滑塊 operation === "fill" ? ctx.fill() : ctx.clip(); }
/** * 1. 隨機獲取到圖片 * 2. 隨機生成圖片滑塊位置 * 3. 擷取圖片並移動到初始位置 * 4. 畫出鏤空圖案 * 5. 拿到下方滑塊的初始位置 */ initCanvas() { // 拿到canvas物件 let canvas = document.getElementsByClassName("canvas-bg")[0]; let blockcanvas = document.getElementsByClassName("block")[0]; // 畫筆 let ctx = canvas.getContext("2d"); let blockCtx = blockcanvas.getContext("2d"); // 每次重新繪製圖片時,清除畫布原有內容 ctx.clearRect(0, 0, this.width, this.height); blockcanvas.width = this.width; // 生成image物件 let img = new Image(); // 解決跨域問題 img.crossOrigin = ""; img.onload = () => { ctx.drawImage(img, 0, 0); blockCtx.drawImage(img, 0, 0); this.isLoading = false; const ImageData = blockCtx.getImageData(x, y1, this.l + 2 * this.r, y); // 裁剪後重置畫布的狀態 blockCtx.restore(); blockcanvas.width = this.l + 2 * this.r; blockCtx.putImageData(ImageData, 0, y1); }; // 圖片訪問地址,後面增加時間戳,防止拿快取 img.src = `{this.width}/${ this.height }?time=${+new Date()}`; // x y 位置隨機 let { x, y } = this.getXY(); this.drawPath(x, y, this.l, this.r, ctx, "fill"); // 裁剪前儲存畫布的狀態 blockCtx.save(); this.drawPath(x, y, this.l, this.r, blockCtx, "clip"); const y1 = y - this.r * 2 - 1; }
// 隨機生成滑塊的目標位置 getXY() { let x = this.width / 3 + Math.random() * ((this.width * 3) / 4 - this.width / 3); let y = this.height / 3 + Math.random() * ((this.height * 3) / 5 - this.height / 3); this.x = x; return { x, y }; }
handleDragMove(e) { if (!this.isDrop) return false; e.preventDefault(); // 獲取滑鼠位置 const eventX = e.clientX || e.touches[0].clientX; let moveX = eventX - this.blockInitLeft - 20; // 對滑塊的位置進行風控處理 if (moveX < 0 || moveX + 40 + 2 * this.r > this.width) return false; // 設定滑塊的的位置及進度條的寬度 this.blockLeft = moveX; }, // 初始化未完成時,不可滑動 // 滑動開始時,將狀態置為等待狀態 handleDrapDown() { if (this.isLoading) return; this.isDrop = true; this.status = "wait"; }, // 拖拽動作完成之後執行 handleDrapUp() { if (!this.isDrop) return; this.isDrop = false; // 判斷是否拖拽的指定位置 let val = Math.abs(this.x - this.blockLeft); this.status = val > this.tolerant ? "fail" : "success"; // 執行相應的生命週期函式 if (this.status === "fail") { this.onFail(); } else { this.onSuccess(); } // 1s後觸發關閉回撥或者重新整理動作 setTimeout(() => { if (this.status === "success" && this.visiblity) { this.closed(); return; } this.handleRefresh(); }, 1000); }
最後
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69996194/viewspace-2795380/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 婚戀app原始碼開發,如何實現介面效能優化?APP原始碼優化
- 如何實現婚戀app原始碼移動端網頁特效?APP原始碼網頁特效
- 如何實現婚戀app原始碼中元素水平垂直居中?APP原始碼
- 婚戀交友原始碼開發,移動端滾動載入更多元件的實現原始碼元件
- 如何實現婚戀app原始碼中直播首屏載入優化?APP原始碼優化
- 婚戀app原始碼開發中,可以使用的前端除錯技巧有哪些?APP原始碼前端除錯
- 婚戀app原始碼實現多賬號統一登陸,應該如何做?APP原始碼
- 婚戀app原始碼開發,值得一看的前端加密方法APP原始碼前端加密
- 婚戀交友原始碼開發,採用連線複用實現效能優化原始碼優化
- 使用 Chapel 實現滑動驗證碼識別
- 簡單幾步實現滑動驗證碼(後端驗證)後端
- 如何在遊戲陪玩app原始碼中實現簡訊驗證碼登入?遊戲APP原始碼
- 短影片app原始碼,日常開發之RecycleView滑動APP原始碼View
- 婚戀app原始碼開發,相親直播間聊天訊息列表卡頓優化APP原始碼優化
- 夢幻婚戀交友app系統原始碼影片聊天直播過程加密原生開發APP原始碼加密
- 短視訊直播原始碼,拖動滑塊實現圖片驗證效果原始碼
- C#滑動拼圖驗證碼實現筆記C#筆記
- 使用 Seed7 實現滑動驗證碼識別
- 使用 ActionScript 實現簡單滑動驗證碼識別
- DrissionPage 過滑動驗證碼
- 婚戀交友原始碼是如何與MySQL打交道的?原始碼MySql
- 【記】滑動拼圖驗證碼在搜尋中的作用
- 影片直播原始碼,前端canvas動態驗證碼實現原始碼前端Canvas
- 基於Nuxt.js實現滑動拼圖驗證碼UXJS
- Vue.js 滑動拼圖驗證碼實現筆記Vue.js筆記
- 基於YOLO實現滑塊驗證碼破解YOLO
- 影片直播app原始碼,傳送驗證碼 驗證碼識別APP原始碼
- 直播商城原始碼,驗證方式之一,滑塊驗證原始碼
- 一對一原始碼,滑塊驗證,滑塊左右滑動顯示的位置原始碼
- C# 滑動驗證碼|拼圖驗證|SlideCaptchaC#IDEAPT
- 婚戀app原始碼設計模式六大原則有哪些?APP原始碼設計模式
- 自動化驗證碼登入如何實現?
- 如何實現直播間原始碼重要的簡訊驗證碼功能原始碼
- 仿支付寶滑動驗證碼案例
- app直播原始碼,驗證時實現獲取驗證碼並顯示倒數計時的功能APP原始碼
- php短視訊原始碼,兩種基礎的滑塊元件驗證PHP原始碼元件
- 如何在相親交友原始碼中實現正方形驗證碼輸入框?原始碼
- 婚戀系統原始碼,如何成功獲取使用者的定位原始碼