当前位置:首页 > JavaScript

js实现滑动验证码

2026-03-01 11:19:35JavaScript

实现滑动验证码的基本原理

滑动验证码的核心是用户通过拖动滑块完成拼图或对齐操作,服务器验证滑动轨迹是否合法。前端需实现滑块拖动、位置计算、轨迹记录等功能。

基本实现步骤

HTML结构

<div class="slider-captcha">
  <div class="slider-track"></div>
  <div class="slider-thumb"></div>
  <div class="slider-mask"></div>
</div>

CSS样式

.slider-captcha {
  position: relative;
  width: 300px;
  height: 40px;
  background: #f5f5f5;
}

.slider-track {
  height: 100%;
  background: #ddd;
}

.slider-thumb {
  position: absolute;
  width: 40px;
  height: 40px;
  background: #4CAF50;
  cursor: move;
  z-index: 2;
}

.slider-mask {
  position: absolute;
  left: 0;
  width: 0;
  height: 100%;
  background: rgba(0, 200, 0, 0.2);
}

JavaScript核心逻辑

const thumb = document.querySelector('.slider-thumb');
const mask = document.querySelector('.slider-mask');
let isDragging = false;
let startX = 0;
let thumbLeft = 0;
const maxWidth = 300 - 40; // 容器宽度减去滑块宽度

thumb.addEventListener('mousedown', (e) => {
  isDragging = true;
  startX = e.clientX;
  thumbLeft = thumb.offsetLeft;
  e.preventDefault();
});

document.addEventListener('mousemove', (e) => {
  if (!isDragging) return;

  const deltaX = e.clientX - startX;
  let newLeft = thumbLeft + deltaX;

  // 限制滑块范围
  newLeft = Math.max(0, Math.min(maxWidth, newLeft));

  thumb.style.left = `${newLeft}px`;
  mask.style.width = `${newLeft}px`;
});

document.addEventListener('mouseup', () => {
  if (!isDragging) return;
  isDragging = false;

  // 验证是否滑动到终点(可设置阈值)
  if (parseInt(thumb.style.left || 0) >= maxWidth - 5) {
    alert('验证成功');
  } else {
    thumb.style.left = '0';
    mask.style.width = '0';
  }
});

进阶功能实现

添加轨迹验证 记录用户滑动过程中的坐标和时间信息,用于后端验证:

const track = [];
let startTime = 0;

// 在mousedown事件中添加
startTime = Date.now();

// 在mousemove事件中添加
track.push({
  x: e.clientX,
  y: e.clientY,
  t: Date.now() - startTime
});

// 在mouseup事件中发送数据
console.log('滑动轨迹:', track);

添加拼图验证

<div class="puzzle-container">
  <div class="puzzle-image"></div>
  <div class="puzzle-hole"></div>
  <div class="puzzle-piece"></div>
</div>
// 随机生成拼图位置
function initPuzzle() {
  const holeSize = 50;
  const x = Math.random() * (300 - holeSize);
  const y = Math.random() * (150 - holeSize);

  document.querySelector('.puzzle-hole').style.cssText = `
    width: ${holeSize}px;
    height: ${holeSize}px;
    left: ${x}px;
    top: ${y}px;
  `;

  document.querySelector('.puzzle-piece').style.cssText = `
    width: ${holeSize}px;
    height: ${holeSize}px;
    background-position: -${x}px -${y}px;
  `;
}

安全增强措施

防止自动化工具

  • 添加随机轨迹验证,要求滑动速度变化符合人类操作
  • 设置最小滑动时间阈值(如1秒)
  • 添加二次验证(如滑动完成后弹出图形验证码)

后端验证示例逻辑

function validateTrack(track) {
  // 检查是否直线滑动
  const startX = track[0].x;
  const endX = track[track.length-1].x;
  if (Math.abs(endX - startX) < 200) return false;

  // 检查滑动时间
  const duration = track[track.length-1].t;
  if (duration < 1000 || duration > 5000) return false;

  // 检查是否有停顿
  let pauses = 0;
  for (let i = 1; i < track.length; i++) {
    if (track[i].t - track[i-1].t > 100) pauses++;
  }
  if (pauses < 2) return false;

  return true;
}

完整解决方案推荐

对于生产环境,建议使用成熟的第三方库:

js实现滑动验证码

  • 阿里云验证码服务
  • 腾讯云验证码
  • Google reCAPTCHA

这些服务提供更完善的安全防护机制,包括行为分析、设备指纹识别等高级功能,能有效防御自动化攻击。

标签: 验证码js
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedown、mousemove和mouseup。以下是实现的基本逻辑: const draggableEleme…

js实现倒计时

js实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时功能可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是几种常见的实现方式: 使用 setInterva…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

js实现同步

js实现同步

同步与异步的概念 在JavaScript中,同步代码会按照顺序执行,每一行代码必须等待上一行代码执行完成后才能运行。异步代码则允许在等待某些操作(如网络请求)完成的同时继续执行其他代码。 实现同步的…

vue.js 实现交互

vue.js 实现交互

Vue.js 交互实现方法 Vue.js 提供了多种方式实现用户交互,包括事件处理、表单绑定、动态响应等。 事件处理 通过 v-on 指令或 @ 简写绑定事件,例如点击事件: <button…

vue.js 实现登录

vue.js 实现登录

使用 Vue.js 实现登录功能 1. 创建 Vue 项目 使用 Vue CLI 初始化项目: vue create login-app 选择默认配置或手动配置(如 Babel、Router、V…