vue2滑塊驗證

純 Vue 2 實現的滑塊拖動驗證組件

效果說明

  • 拖動滑塊到最右側判定為驗證成功

  • 支持自定義寬度、高度、顏色、提示文字

  • 可擴展軌跡分析或后端驗證邏輯

Vue 2 滑塊驗證組件代碼

SliderVerify.vue

注意:icon圖標使用的是Element ui圖標

<template><div class="slider-container" :style="{ width: width + 'px', height: height + 'px' }"><div class="slider-track" :style="{ backgroundColor: trackColor, width: trackWidth + 'px' }"></div><divclass="slider-button":style="{ left: buttonLeft + 'px', backgroundColor: buttonColor }"@mousedown="startDrag"><span v-if="!isPassed"> <i class="el-icon-d-arrow-right"></i></span><span v-else><i class="el-icon-check"></i></span></div><div class="slider-text">{{ isPassed ? successText : text }}</div></div>
</template><script>
export default {name: 'SliderVerify',props: {width: { type: Number, default: 300 },height: { type: Number, default: 40 },text: { type: String, default: '請將滑塊拖動到右側' },successText: { type: String, default: '驗證成功' },trackColor: { type: String, default: '#4caf50' },buttonColor: { type: String, default: '#fff' }},data() {return {isDragging: false,startX: 0,buttonLeft: 0,trackWidth: 0,isPassed: false}},methods: {startDrag(e) {if (this.isPassed) returnthis.isDragging = truethis.startX = e.clientX - this.buttonLeftdocument.addEventListener('mousemove', this.onDrag)document.addEventListener('mouseup', this.endDrag)},onDrag(e) {if (!this.isDragging) returnlet moveX = e.clientX - this.startXconst maxX = this.width - this.heightmoveX = Math.max(0, Math.min(moveX, maxX))this.buttonLeft = moveXthis.trackWidth = moveX + this.height},endDrag() {this.isDragging = falsedocument.removeEventListener('mousemove', this.onDrag)document.removeEventListener('mouseup', this.endDrag)const maxX = this.width - this.heightif (this.buttonLeft >= maxX - 5) {this.isPassed = truethis.$emit('pass')} else {this.buttonLeft = 0this.trackWidth = 0}}}
}
</script><style scoped>
.slider-container {position: relative;background: #d3d3d3;border-radius: 4px;user-select: none;
}
.slider-track {position: absolute;top: 0;left: 0;height: 100%;transition: width 0.2s;border-radius: 4px;
}
.slider-button {position: absolute;top: 0;width: 40px;height: 100%;text-align: center;line-height: 40px;font-size: 18px;cursor: pointer;border-radius: 4px;box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);z-index: 2;
}
.slider-text {position: absolute;top: 0;left: 0;width: 100%;height: 100%;line-height: 40px;text-align: center;font-size: 14px;color: #666;z-index: 1;
}
</style>

使用方式

在父組件中:

<SliderVerify @pass="handleVerifySuccess" />
<script>
import SliderVerify from "@/components/Login/SliderVerify.vue";
export default {components: {SliderVerify},data() {return {};},methods: {handleVerifySuccess() {console.log('驗證通過!')// 可執行登錄、提交等操作}},
};
</script>

可擴展方向(以下內容僅提供思路)

  • ? 加入拖動軌跡分析(防機器人)

  • ? 拖動完成后調用后端接口驗證

  • ? 添加“重置”按鈕或自動重置邏輯

  • ? 支持移動端觸摸事件(touchstart, touchmove, touchend

1. 加入拖動軌跡分析(防機器人)

目的:判斷用戶是否是人類,通過拖動軌跡的“自然性”來識別。

實現思路:
  • onDrag 方法中記錄每一次拖動的時間戳和位置:

    data() {return {dragTrace: [] // [{x: 123, time: 123456789}]}
    },
    methods: {onDrag(e) {const now = Date.now()this.dragTrace.push({ x: e.clientX, time: now })// 原有拖動邏輯...}
    }
    
  • 拖動完成后分析軌跡:

    endDrag() {// 軌跡分析:速度是否過快、是否有停頓、是否線性過于完美const isHumanLike = this.analyzeTrace(this.dragTrace)if (!isHumanLike) {alert('行為異常,請重試')this.resetSlider()return}// 原有驗證邏輯...
    },
    analyzeTrace(trace) {if (trace.length < 5) return falseconst speeds = []for (let i = 1; i < trace.length; i++) {const dx = Math.abs(trace[i].x - trace[i - 1].x)const dt = trace[i].time - trace[i - 1].timespeeds.push(dx / dt)}const avgSpeed = speeds.reduce((a, b) => a + b, 0) / speeds.lengthreturn avgSpeed < 2 && speeds.some(s => s < 0.5) // 有停頓、有波動
    }
    

2. 拖動完成后調用后端接口驗證

目的:讓后端參與驗證,提升安全性。

實現方式:
  • endDrag 中加入 API 請求:
    async endDrag() {const maxX = this.width - this.heightif (this.buttonLeft >= maxX - 5) {try {const res = await fetch('/api/verify-slider', {method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({ trace: this.dragTrace })})const result = await res.json()if (result.success) {this.isPassed = truethis.$emit('pass')} else {alert('驗證失敗,請重試')this.resetSlider()}} catch (err) {console.error('驗證接口異常', err)this.resetSlider()}} else {this.resetSlider()}
    }
    

3. 添加“重置”按鈕或自動重置邏輯

目的:用戶拖錯了可以重新嘗試。

實現方式:
  • 添加按鈕:

    <button v-if="!isPassed" @click="resetSlider" class="reset-btn">重置</button>
    
  • 方法定義:

    methods: {resetSlider() {this.buttonLeft = 0this.trackWidth = 0this.dragTrace = []this.isPassed = false}
    }
    
  • 自動重置(比如 3 秒后):

    if (!this.isPassed) {setTimeout(() => this.resetSlider(), 3000)
    }
    

4. 支持移動端觸摸事件(touchstart, touchmove, touchend

目的:讓組件在手機上也能正常使用。

實現方式:
  • 添加事件監聽:

    <divclass="slider-button"@mousedown="startDrag"@touchstart="startTouch"@touchmove="onTouchMove"@touchend="endTouch"
    >
    
  • 方法定義:

    methods: {startTouch(e) {this.isDragging = truethis.startX = e.touches[0].clientX - this.buttonLeft},onTouchMove(e) {if (!this.isDragging) returnconst moveX = e.touches[0].clientX - this.startXconst maxX = this.width - this.heightthis.buttonLeft = Math.max(0, Math.min(moveX, maxX))this.trackWidth = this.buttonLeft + this.heightthis.dragTrace.push({ x: e.touches[0].clientX, time: Date.now() })},endTouch() {this.isDragging = falsethis.endDrag() // 復用原有邏輯}
    }

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95552.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95552.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95552.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

74、在昇騰服務器 800I A2上遷移伏羲1.0/2.0大模型,并對比cpu和npu的精度

基本思想&#xff1a;在昇騰服務器上遷移github公開鏈接的的伏羲1.0/2.0大模型&#xff0c;但是由于伏羲2.0模型沒有權重&#xff0c;這里使用自己造的的權重進行推理模型測試&#xff0c;在之前遷移過這個網站問海大模型和問天大模型人工智能天氣預報模型示范計劃AIM-FDP支撐平…

如何高效比對不同合同版本差異,避免法律風險?

智能文檔比對系統通過自動化、高精度的差異比對與結構化報告&#xff0c;鎖定合同修改、防止核心條款誤刪并實現版本清晰追溯&#xff0c;解決證券基金公司在合同范本管理中的操作風險、審核效率與歸檔難題。 如何防止業務人員誤改或誤刪合同條款&#xff1f; 這是一個典型的操…

快手Keye-VL 1.5開源128K上下文+0.1秒級視頻定位+跨模態推理,引領視頻理解新標桿

人工智能和多模態學習領域&#xff0c;視頻理解技術的突破為各類應用提供了強大的支持。快手近期開源了其創新性的大型多模態推理模型——Keye-VL 1.5&#xff0c;該模型具備超長的上下文窗口、0.1秒級的視頻時序定位能力&#xff0c;并支持視頻與文本之間的跨模態推理。這一技…

【前端教程】JavaScript 實現圖片鼠標懸停切換效果與==和=的區別

圖片鼠標懸停切換效果 功能說明 頁面展示4張默認圖片&#xff0c;當鼠標移動到任意一張圖片上時&#xff0c;該圖片會切換為對應的特定圖片&#xff08;詩、書、畫、唱&#xff09;&#xff1b;當鼠標移出時&#xff0c;圖片恢復為默認圖片。 和的區別 在講解案例前&#xff0c…

ss 原理

SSR&#xff08;服務端渲染&#xff09;技術文檔 一、SSR 概述 SSR&#xff08;Server-Side Rendering&#xff0c;服務端渲染&#xff09;是一種在服務端生成完整 HTML 頁面&#xff0c;再發送給客戶端渲染的前端渲染模式。與 CSR&#xff08;客戶端渲染&#xff0c;如 React/…

chrome 瀏覽器開發者工具技巧

$0 我們在開發者工具里面選中了哪個元素&#xff0c;他后面都會跟一個$0 ,則表示 $0 就是選擇這個標簽元素 如圖&#xff1a;

GJOI 9.4 題解

1.CF1801B Buy Gifts / 洛谷 P13532 買禮物 題意 n≤2105n\le 2\times 10^5n≤2105。 思路 神秘卡常題&#xff0c;如果等待提交記錄久一點就能知道自己 A 掉…… 題目問 A 的最大值&#xff0c;減去 B 的最大值&#xff0c;求差值最小值。但是怎么選到兩個最大值呢&#x…

Git 工具的「安裝」及「基礎命令使用」

- 第 119 篇 - Date: 2025 - 09 - 05 Author: 鄭龍浩&#xff08;仟墨&#xff09; Git 工具的「安裝」及「基礎命令使用」 學習課程&#xff1a;https://www.bilibili.com/video/BV1MU4y1Y7h5?spm_id_from333.788.player.switch&vd_source2683707f584c21c57616cc6ce8454e…

2025高教社數學建模國賽A題 - 煙幕干擾彈的投放策略(完整參考論文)

基于模擬遺傳退火的煙幕彈投遞方式的研究 摘要 煙幕干擾彈作為一種具有成本低、效費比高等優點的典型防御手段,主要通過化學燃燒或爆炸分散形成氣溶膠云團,在目標前方特定空域形成有效遮蔽,從而干擾敵方導彈攻擊路徑。隨著精確投放技術的發展,現可利用無人機實現煙幕干擾…

[源力覺醒 創作者計劃]_文心一言 4.5開源深度解析:性能狂飆 + 中文專精

文章目錄[源力覺醒 創作者計劃]_文心一言 4.5開源深度解析:性能狂飆 中文專精一. 部署實戰&#xff1a;單卡環境的極速落地1.1 &#x1f5a5;? 環境配置の手把手教程 &#x1f4dd;部署準備&#xff1a;硬件與鏡像依賴安裝&#xff1a;一行代碼搞定1.2 &#x1f680; 模型啟動…

開發微服務的9個最佳實踐

微服務架構是一種演進的模式&#xff0c;從根本上改變了服務器端代碼的開發和管理方式。這種架構模式涉及將應用程序設計和開發為松散耦合服務的集合&#xff0c;這些服務通過定義良好的輕量級 API 進行交互以滿足業務需求。它旨在通過促進持續交付和開發來幫助軟件開發公司加速…

Karmada v1.15 版本發布

Karmada 是開放的多云多集群容器編排引擎&#xff0c;旨在幫助用戶在多云環境下部署和運維業務應用。憑借兼容 Kubernetes 原生 API 的能力&#xff0c;Karmada 可以平滑遷移單集群工作負載&#xff0c;并且仍可保持與 Kubernetes 周邊生態工具鏈協同。 Karmada v1.15 版本現已…

[GYCTF2020]Ezsqli

文章目錄測試過濾找注入點布爾盲注無列名盲注總結測試過濾 xor for distinct information handler binary floor having join pg_sleep bp測試出來禁用了這些。 找注入點 查詢回顯推斷1Nu1Labool(false)1’bool(false)1’#bool(false)不是單引號包裹1"#bool(false)沒有引…

Agno 多 Agent 協作框架 - 手把手從零開始教程

本教程將帶你從零開始&#xff0c;一步步構建一個完整的多 Agent 協作系統。每一步都有詳細的代碼示例和解釋&#xff0c;讓你真正理解 Agno 框架的工作原理。第一步&#xff1a;創建你的第一個 Agent 讓我們從最簡單的開始 - 創建一個能回答問題的 Agent。 1.1 創建基礎文件 首…

數據庫查詢優化

這篇文章適合剛剛入手項目的小伙伴&#xff0c;為大家如何提高數據庫查詢效率提供一些建議。1.添加索引1.1 索引是什么對于索引基礎薄弱的同學&#xff0c;我們可以從 “索引是什么” 簡單類比&#xff1a;索引就像書籍的目錄&#xff0c;能幫數據庫快速定位到需要的數據&#…

安徽大學概率論期末試卷及答案解析

本文還有配套的精品資源&#xff0c;點擊獲取 簡介&#xff1a;安徽大學的概率論課程圍繞隨機現象的規律性&#xff0c;覆蓋了多個核心概念&#xff0c;如隨機事件的概率、條件概率、獨立事件、概率分布、期望值、方差、大數定律和中心極限定理。本資源包含期末試卷及答案&a…

HarmonyOS應用開發之界面列表不刷新問題Bug排查記:從現象到解決完整記錄

Bug排查在軟件開發過程中扮演著至關重要的角色&#xff0c;本文采用日記形式記錄了Bug排查的全過程&#xff0c;通過這種方式可以更加真實、詳細地記錄問題&#xff0c;便于后續追溯和經驗沉淀。 Bug背景 在使用HarmonyOS的ArkUI框架開發一個卡片管理應用時&#xff0c;遇到了…

FastVLM-0.5B 模型解析

模型介紹 FastVLM&#xff08;Fast Vision-Language Model&#xff09;是蘋果團隊于2025年在CVPR會議上提出的高效視覺語言模型&#xff0c;專為移動設備&#xff08;如iPhone、iPad、Mac&#xff09;優化&#xff0c;核心創新在于通過全新設計的 FastViTHD混合視覺編碼器 解決…

集成學習 | MATLAB基于CNN-LSTM-Adaboost多輸入單輸出回歸預測

集成學習 | MATLAB基于CNN-LSTM-Adaboost多輸入單輸出回歸預測 一、主要功能 該代碼使用 CNN 提取特征,LSTM 捕捉時序依賴,并通過 AdaBoost 集成多個弱學習器(每個弱學習器是一個 CNN-LSTM 網絡),最終組合成一個強預測器,用于回歸預測任務。代碼完成了從數據預處理、模型…

關于Homebrew:Mac快速安裝Homebrew

關于macOS 安裝HomebrewHomebrewHomebrew介紹Homebrew 官網地址Homebrew 能安裝什么&#xff1f;Mac上安裝Homebrew主要步驟&#xff1a;打開終端&#xff0c;執行官網安裝腳本注意遇到問題①&#xff1a;腳本在克隆 Homebrew 核心倉庫時&#xff0c;??無法連接 GitHub??&a…