当前位置:首页 > 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核心逻辑

js实现滑动验证码

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);

添加拼图验证

js实现滑动验证码

<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;
}

完整解决方案推荐

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

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

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

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

相关文章

js实现倒计时

js实现倒计时

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

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

php 实现验证码

php 实现验证码

使用 PHP 生成验证码 验证码(CAPTCHA)用于防止自动化脚本提交表单,以下是几种常见的 PHP 实现方法。 使用 GD 库生成图片验证码 GD 库是 PHP 的图像处理扩展,可用于生成验证码…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似: fu…