VUE3+ts实现滑块验证

VUE3+ts实现滑块验证

示例(图):
在这里插入图片描述

需求

账号密码输入完成点击登录时需要把滑块拖到最右边完成验证才可以登录
在这里插入图片描述

在这里插入图片描述

实现思路

1.设置 可以拖动的区域
2.设置 拖动的滑块
3.使用mousedown方法进行获取鼠标事件
4.计算出滑块滑动比例
5.滑动到最右边 提示验证成功

代码

<div class="huakuia">
      <div ref="dragDiv" class="drag" v-if="!data.confirmSuccess">
        <!-- 拖动区域 -->
        <div class="handler" :style="{ left: dragLeft + 'px' }" @mousedown="mousedownFn">>></div>
        <!-- 拖动背景 -->
        <div class="drag_bg" :style="{ width: dragLeft + 'px' }"></div>
        <div class="drag_text" :style="{ color: confirmColor }">
          {{ confirmWords }}
        </div>
      </div>
    </div>
    <div class="drag_text" v-if="data.confirmSuccess">验证通过</div>
// 滑块验证
import { ref, reactive, onMounted, onUnmounted } from "vue";

const dragDiv = ref({ clientWidth: "" as any });
console.log(dragDiv);
const moveDiv = ref({ clientWidth: "" as any });
console.log(moveDiv);

let data = reactive({
  beginClientX: 0,
  mouseMoveState: false,
  maxwidth: 0,
  confirmWords: "拖动滑块验证",
  confirmSuccess: false
});
function mousedownFn(e: MouseEvent) {
  if (!data.confirmSuccess) {
    e.preventDefault && e.preventDefault();
    data.mouseMoveState = true;
    data.beginClientX = e.clientX;
  }
}
function successFunction() {
  data.confirmSuccess = true;
  data.confirmWords = "验证通过";

  document.getElementsByTagName("html")[0].removeEventListener("mousemove", mouseMoveFn);
  document.getElementsByTagName("html")[0].removeEventListener("mouseup", mouseUpFn);
}

function mouseMoveFn(e: MouseEvent) {
  if (data.mouseMoveState) {
    const width = e.clientX - data.beginClientX;
    console.log(width, data.maxwidth);
    if (width > 0 && width <= data.maxwidth) {
      document.getElementsByClassName("handler")[0].style.left = width + "px";
      document.getElementsByClassName("drag_bg")[0].style.width = width + "px";
    } else if (width > data.maxwidth) {
      successFunction();
    }
  }
}

function mouseUpFn(e: MouseEvent) {
  data.mouseMoveState = false;
  const width = e.clientX - data.beginClientX;
  if (width < data.maxwidth) {
    document.getElementsByClassName("handler")[0].style.left = "0px";
    document.getElementsByClassName("drag_bg")[0].style.width = "0px";
  }
}

onMounted(() => {
  data.maxwidth = dragDiv.value.clientWidth - moveDiv.value.clientWidth - 40;
  if (data.maxwidth <= 0) {
    data.maxwidth = 2;
  }
  document.getElementsByTagName("html")[0].addEventListener("mousemove", mouseMoveFn);
  document.getElementsByTagName("html")[0].addEventListener("mouseup", mouseUpFn);
});

onUnmounted(() => {
  document.getElementsByTagName("html")[0].removeEventListener("mousemove", mouseMoveFn);
  document.getElementsByTagName("html")[0].removeEventListener("mouseup", mouseUpFn);
});
const dragLeft = data.confirmSuccess ? data.maxwidth : 2;

const confirmColor = data.confirmSuccess ? "#fff" : "";
let confirmWords = data.confirmWords;
### 使用 Vue3 实现拖拽拼图滑块验证功能 为了实现基于 Vue3 的拖拽拼图滑块验证功能,需创建一个专门用于处理此逻辑的组件 `SliderCaptcha.vue`。该组件负责加载背景图像、检测用户交互以及判断用户的操作是否满足条件。 #### 组件结构设计 首先,在模板部分定义 HTML 结构,包括显示区域和可移动元素: ```html <template> <div class="captcha-container"> <!-- 背景图片 --> <img :src="imageSrc" alt="" class="background-image"/> <!-- 滑块 --> <div v-if="showBlock" @mousedown.prevent="startDrag($event)" @touchstart.prevent="startDrag($event)" class="slider-block"></div> <!-- 提示信息 --> <p>{{ message }}</p> </div> </template> ``` 接着设置样式以确保视觉效果良好,并使滑块能够响应触摸事件: ```css <style scoped> .captcha-container { position: relative; } .background-image, .slider-block { width: 100%; height: auto; } .slider-block { cursor: pointer; /* 设置合适的大小 */ transform-origin: top left; transition: all ease-in-out 0.2s; } </style> ``` 最后编写 JavaScript 部分来控制整个过程,这里利用 Composition API 来简化状态管理: ```javascript <script setup lang="ts"> import { ref } from &#39;vue&#39;; const imageSrc = &#39;/path/to/image&#39;; // 图片路径 let startX = 0; // 记录鼠标按下时X坐标 let moveX = 0; // 当前偏移量 const showBlock = ref(true); // 是否展示滑块 const message = ref(&#39;&#39;); // 显示的消息提示语句 function startDrag(event){ const clientX = event.clientX || (event.touches && event.touches.length ? event.touches[0].clientX : null); document.addEventListener(&#39;mousemove&#39;, onDragging); document.addEventListener(&#39;mouseup&#39;, endDrag); if(clientX !== null){ startX = clientX - moveX; } } // 处理拖动过程中发生的动作 function onDragging(event){ let currentX = event.clientX; moveX = Math.min(Math.max(currentX - startX, 0), window.innerWidth * 0.8); // 控制范围不超过容器宽度80% updatePosition(moveX); } // 完成拖动后的清理工作 function endDrag(){ document.removeEventListener(&#39;mousemove&#39;, onDragging); document.removeEventListener(&#39;mouseup&#39;, endDrag); checkResult(); } // 更新滑块位置的方法 function updatePosition(offset){ // 修改CSS属性调整滑块的位置 const sliderElement = document.querySelector(&#39;.slider-block&#39;); if(sliderElement){ sliderElement.style.transform = `translate(${offset}px)`; } } async function checkResult() { try{ // 此处应加入实际业务逻辑,比如发送请求给服务器做进一步验证... await new Promise((resolve) => setTimeout(resolve, 500)); if(/* 判断依据 */) { message.value = "验证成功"; showBlock.value = false; }else{ message.value = "验证失败,请重新尝试"; reset(); } }catch(error){ console.error("Error during verification:", error); } } // 重置方法以便于再次挑战 function reset(){ moveX = 0; updatePosition(0); message.value = &#39;&#39;; showBlock.value = true; } </script> ``` 上述代码片段展示了如何构建一个简单的拖拽式拼图验证码插件[^1]。需要注意的是,这只是一个基础版本;对于生产环境下的应用来说,还需要考虑更多细节,例如安全性增强措施、跨浏览器兼容性测试等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值