zoukankan      html  css  js  c++  java
  • js-滑块拼图登录验证

    一、为什么会有滑块登录验证

      很多网站为了防止机器人登录操作,往往会会添加一个滑块拼图验证,必须要拖拽拼成完整才能登录成功。
    

    二、案例展示

      刷新页面,即可产生随机位置的两个方块,只有图片滑块滑倒空白方块附近才能算验证成功,可以设置允许有几像素的误差;离目标较远会自动返回。
    

    三、具体实现代码

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      <style>
          .box {
               533px;
              height: 300px;
              margin: 0 auto;
              position: relative;
          }
    
          .box .main {
               100%;
              height: 100%;
              display: block;
          }
    
          .btn {
               533px;
              height: 50px;
              margin: 0 auto;
              border: 1px #000 solid;
              position: relative;
          }
    
          .btn em {
               40px;
              height: 40px;
              position: absolute;
              left: 0;
              top: 5px;
              background: #aaa;
          }
      </style>
    </head>
    
    <body>
      <div class="box">
          <img class="main" src="./images/1.jpg" alt="" srcset="">
      </div>
      <div class="btn">
          <em></em>
      </div>
    </body>
    <script src="./move.js"></script>
    <script>
      class tz {
          *constructor() {
              this.btnSpan = document.querySelector('.btn em');
              this.box = document.querySelector('.box');
              this.init();
          }*
          init() {*
              // 产生随机top值
              this.top = randomNum(0,this.box.offsetHeight-this.btnSpan.offsetHeight);
              // 产生随机left值
              this.left = randomNum(this.box.offsetWidth/2,this.box.offsetWidth-this.btnSpan.offsetWidth);
              //循环创建两个随机位置的方块,top值一致
              for(var i = 0;i<2;i++){
                  *this.createSmall(i);
              }
              *this.span = document.querySelectorAll('.box span');
              *this.btnSpan.onmousedown = (eve) => {
                 * var e = eve || event;
                  *this.obj = {
                      x: e.offsetX,
                     * y: e.offsetY
                  }
                  this.move();
                  this.up();
              }
          }
          move() {
              document.onmousemove = (eve) => {
                  var e = eve || event;
                  this.l = e.pageX - this.box.offsetLeft - this.obj.x;
                  if (this.l < 0) this.l = 0;
                  if (this.l >= this.box.offsetWidth - this.btnSpan.offsetWidth) {
                      this.l = this.box.offsetWidth - this.btnSpan.offsetWidth-1;
                  }               
                  this.span[1].style.left = this.l + 'px';
                  this.btnSpan.style.left = this.l + 'px';
                  return false;
              }
          }
          up() {
              document.onmouseup = (eve) => {
                  if(this.l<this.span[0].offsetLeft || this.l>this.span[0].offsetLeft+3){
                      move(this.btnSpan,{left:0});
                      move(this.span[1],{left:0});
                  }
                  document.onmousemove = null;
                  document.onmouseup = null;
              }
          }
          createSmall(i){
              var span = document.createElement('span');
              span.style.cssText = `40px;height:40px;position:absolute;top:${this.top}px;overflow:hidden`;
              // overflow:hidden;
              if(i==1){
                  span.style.left = 0 + 'px';
                  span.style.zIndex ='2';
                  var img = document.createElement('img');
                  img.src = './images/1.jpg';
                  img.style.cssText = `position:absolute;left:${-this.left}px;top:${-this.top}px;`;
                  span.appendChild(img);
              }else{
                  span.style.left = this.left + 'px';
                  span.style.background = 'rgba(255,255,255)';
              }
              this.box.appendChild(span);
          }
      }
      new tz;
      function randomNum(min, max) {
          if (min > max) {
              var t = max;
              max = min;
              min = t;
          }
          return Math.floor(Math.random() * (max - min + 1) + min);
      }
    </script>
    
    </html>
    
  • 相关阅读:
    Atitit. 衡量项目规模 包含的类的数量 .net java类库包含多少类 多少个api方法??
    Drawable 中getIntrinsicWidth
    js播放音乐
    Parcelable和Parcel
    标题栏和状态栏
    android振动效果的实现
    Android位置服务和Google地图API初解
    TranslateAnimation详解
    android真机调试
    常见的Android图标大小
  • 原文地址:https://www.cnblogs.com/piaoyi1997/p/13129450.html
Copyright © 2011-2022 走看看