微信小程序纯前端拼图验证

1、先看效果图


123.gif

2、创建组件(puzzle-verify-simple)

// index.html
<view class="back" wx:if="{{show}}"></view>
<view class="container" wx:if="{{show}}">
  <view class="slidebox">
    <view class="slidetitle">
      <text class="header-title">安全验证</text>
      <text class="header-tip">拖动下方滑块完成拼图</text>
    </view>
    <view class="inner">
      <view class="box" style="width:{{box.width}}px;height:{{box.height}}px;background-image: url({{box.back}});">
        <view class="block" style="left:{{position.left}}px;top:{{position.top}}px;"></view>
        <view class="block real" style="left:{{position.left2}}px;top:{{position.top}}px;background-image: url({{box.back}});background-size: {{box.width}}px {{box.height}}px;background-position:-{{position.left}}px -{{position.top}}px;"></view>
      </view>
      <!-- <view class="sliderCont">
        <view style="left:{{position.left2}}px;" class="blueCont" bindtouchstart="startClick" bindtouchmove="moveClick" bindtouchend="endClick">
          | | |
        </view>
      </view>
      <view class="error1" wx:if="{{status==0}}">请控制拼图块对齐缺口</view>
      <view class="success1" wx:if="{{status==1}}">验证成功</view> -->
      <view class="tool" bindtouchstart="startClick" bindtouchmove="moveClick" bindtouchend="endClick">
        <view class="result" wx:if="{{status>=0}}">
          <view class="error" wx:if="{{status==0}}">
            <icon type="warn"></icon>
            请控制拼图块对齐缺口
          </view>
          <view class="success" wx:if="{{status==1}}">
            <icon type="success"></icon>
            验证成功
          </view>
        </view>
        <block wx:else>
          <view class="slideback {{isMove?'active':''}}" style="width:{{position.left2}}px;"></view>
          <view class="slidebtn" style="left:{{position.left2}}px;">
            <view class="icon"></view>
          </view>
          向右滑动填充图片
        </block>
      </view>
    </view>
    <view class="bot">
      <view class="closebtn" bindtap="refereshClick">
        <van-icon size="24" name="replay" />
      </view>
      <view class="closebtn1" bindtap="closeClick" wx:if="{{enableClose}}">
        <van-icon size="24" name="close" />
      </view>
    </view>
  </view>
</view>
// index.wxss
/* 样式定义 */
.back {
    position: fixed;
    z-index: 10;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    background: rgba(0, 0, 0, 0.2);
}
 
.slidebox {
    position: fixed;
    z-index: 11;
    width: calc(100% - 20px);
    background: white;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
    border-radius: 10px;
    overflow: hidden;
    opacity: 0;
    animation: runOne 0.5s ease-in forwards;
}
 
/*头部*/
.slidetitle {
    padding: 10px;
    /* height: 40px;
    line-height: 40px;
    text-indent: 10px;
    background: #07c160;
    color: white;
    font-size: 14px;
    letter-spacing: 1px; */
}
.header-title {
    display: block;
    font-size: 32rpx;
    font-weight: bold;
    color: #333;
    margin-bottom: 10rpx;
  }
  
  .header-tip {
    font-size: 24rpx;
    color: #666;
  }
.bot{
    padding: 10px;
    display: flex;
    justify-content:flex-end;
    align-items: center;
}
.closebtn1 {
    margin-left: 20rpx;
}
 
.slidetitle .close {
    width: 20px;
    height: 20px;
    background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAEAYAAAD6+a2dAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAA1JJREFUeNrtnElOw0AQRTErboLYsUGIcccgkIAEEgizGMOM4BYgToKIxE3YcQ4GMdPFouKFlSbu7tgu2/lvU0IEd9X/38ZJbHd0AAAAAAAAAAAAAAAAAABuEBERdXZyvbzkWquRIkVqYUG6v7TBuvT3c725Yb3m5qT7ch+IiIi2tkiLUjzo6al0n9KwHsUi168vvV6zs9J92g+mSJG6uqKm+EE4PpbuN3F9jIwnYn2ur6X7dRywu5vr01NoEIiI6PBQuu9kdDEw3v+9IkWqr0+67xYHHhiwC8LRkXTf8ehgYTwRERUK0n1HLMDgINfn53Y5IrS98XpBbINwcCDdt9ucMD5EoKGhvAUBxtsKpkiRGh5mIV5ezIJQrUr33TAHjG8N6yAoUqT298X7hvHRwsaOjJgF4feX68ZG4n3C+HjhIIyOcn19DQ2CIkVqfT32vmB8srCxY2Ms5Ntbc8F/fvj1a2uR9wHjZQkG4f3dLAirqy2vC+PTBRs7Pm4cBCIiWlmxXgfGpxsOwsSEXRCWl0O3C+OzBRswOWkXhEpFvx0Yn1mCQfj4MAvC0hKMzxls0MwM189PM0NNjS8WpecDhrBhU1NmRwTs8bmFDZyetgtC+xjfKd1AMnR11cc1nNd/nf93IHP4Vx+b/Y//D/O3jyAlsGHlMtfv72hOAv3tlMvS84F/4D2+VLIzvlCwO0eI7iNmEBFue3zjyZ1bEKL/0gkYwkYsLrZqvH67tkGI/2toUIeF9z/Bi854/ToWQSAiiQtT2oakjNevaxoEuSuUcgsLWqkE97T4jdf3YRuEzU1p/TILC+jfXOoLmrzx+r5Mg5Cdy9lTQ1qN1/dpG4Ts3+kUGyzQ9nbajdf3jSA4w2+jdnayZnzDHE5ByN9NsOaCKVKkdnezbnzDXLZBaLfnI/Dge3vBPSH7xuvntD0inJxI9x2fIPVbufJufMPcTkeEHD06hwerVtvNeL0OtkeEszPpvt0HDnw7Z2p8/q+58+cMzh0WhPl56b4dB63VYHwzfUwfEnV3J92v44AXFzDeRKewIJyfx7W+F+9gXn37pRLXnh6u9/ee53me9/AQ1/pZg/Xq7eWf/OcCPj5yvb1lvYik+wQAAAAAAAAAAAAAAACQOf4Al4KQEGeQdWsAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjItMTAtMTZUMTU6NTM6NDYrMDg6MDCr8mCYAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIyLTEwLTE2VDE1OjUzOjQ2KzA4OjAw2q/YJAAAAEd0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hZG1pbi9pY29uLWZvbnQvdG1wL2ljb25fbDU2MWF5eWUwbi9jbG9zZS5zdmdIplUhAAAAAElFTkSuQmCC);
    background-size: contain;
}
 
.slidetitle .closebtn:active {
    opacity: 0.8;
    background: rgba(0, 0, 0, 0.2);
}
 
.referesh {
    width: 20px;
    height: 20px;
    background: url(data:image/png;base64,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);
    background-size: contain;
}
 
/*图片展示*/
.inner {
    padding: 10px;
}
 
.box {
    background: rgba(0, 0, 0, 0.1);
    width: 100%;
    height: 100px;
    background: url(http://beijing.gongjuji.net/imgdata/big/d25ccb7f-e455-4f61-b596-bfefcefd77f9.jpg);
    background-size: contain;
    position: relative;
}
 
.box .block {
    width: 50px;
    height: 40px;
    border: 1px solid rgba(255, 255, 255, 0.5);
    position: absolute;
    /* left: 100px;
    top: 50%;
    transform: translate(0, -50%); */
    background: rgba(0, 0, 0, 0.8);
    box-sizing: border-box;
}
 
.box .real {
    left: 0;
    background: url(随机图片中的一张,https);
    /* background-size: 336px 100px;
    background-position: -236px -50px; */
}
.sliderCont{
    position: relative;
    margin-top: 15px;
    width: 100%;
    height: 20rpx;
    border-radius: 30rpx;
    background: linear-gradient(90deg, #e8e8e8, #f5f5f5);
    transition: all 0.3s ease;
}
.blueCont{
  position: absolute;
  left: 0;
  top: -70%;
  width: 120rpx;
  height: 60rpx;
  background: blue;
  border-radius: 30rpx;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 2rpx 8rpx rgba(33, 150, 243, 0.3);
  border: 2rpx solid rgba(255, 255, 255, 0.5);
  /* 移除过渡动画,使用硬件加速优化性能 */
  will-change: transform;
  transform: translateZ(0);
  backface-visibility: hidden;
  color: #fff;
}
.error1 {
    margin-top: 40rpx;
    font-size: 24rpx;
    color: red;
}
 
.success1 {
    margin-top: 40rpx;
    font-size: 24rpx;
    color: green;
}
/*底部滑块*/
.tool {
    background: rgba(0, 0, 0, 0.1);
    width: 100%;
    height: 40px;
    margin-top: 15px;
    position: relative;
    line-height: 40px;
    text-align: center;
    font-size: 15px;
}
 
.slideback {
    position: absolute;
    left: 0;
    top: 0;
    border: 1px solid rgba(0, 0, 0, 0.1);
    height: 100%;
    width: 100px;
    box-sizing: border-box;
}
 
.slidebtn {
    position: absolute;
    z-index: 2;
    width: 50px;
    height: 40px;
    background: white;
    box-sizing: border-box;
    border: 1px solid #ddd;
    box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.1);
}
 
.slidebtn .icon {
    width: 30px;
    height: 30px;
    background: url(data:image/png;base64,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);
    background-size: contain;
    margin-top: 4px;
    margin-left: 5px;
}
 
.slidebtn:active {
    background: rgba(255, 255, 255, 0.1);
}
 
.slideback.active {
    border: 1px solid #07c160;
    background: rgba(0, 255, 0, 0.1);
}
 
.result {
    height: 100%;
}
 
.error {
    background: rgba(255, 0, 0, 0.1);
    height: 100%;
}
 
.success {
    background: rgba(0, 255, 0, 0.1);
    height: 100%;
}
 
.result icon {
    position: relative;
    top: 5px;
}
 
/**动画**/
@keyframes runOne{
    from{
        opacity: 0;
    }
    to{
opacity: 1;
    }
}
// index.js
var oldX = 0;
Component({
    /**
     * 组件的属性列表
     */
    properties: {
        //是否允许关闭
        enableClose: {
            type: Boolean,
            value: true
        },
        show: {
          type: Boolean,
          value: false
        }
    },
    /**
     * 组件的初始数据
     */
    data: {
        backImg: [
          'xxx',
          'xxx',
          'xxx',
          'xxx',
          'xxx',
          'xxx',
          'xxx',
          'xxx',
          'xxx',
          'xxx'
        ], //十张图片,后续刷新随机展示
        backIndex: 0,
        isMove: false, //是否移动中
        status: -1, //状态 -1 初始值,1,成功,0 失败
        box: {
            width: 100,
            height: 100,
            back:''
        }, //背景框大小
        position: {
            left: 200,
            top: 29,
            left2: 0,
        } //滑块位置
    },
    /**
     * 组件的方法列表
     */
    methods: {
        //事件绑定
        //滑块事件
        startClick(e) {
            this.setData({
                isMove: true
            });
            if (e.touches.length > 0) {
                oldX = e.touches[0].pageX;
            }
        },
        moveClick(e) {
            var _this = this;
            var newX = 0;
            if (e.touches.length > 0) {
                newX = e.touches[0].pageX;
            }
            var span = newX - oldX;
            span = Math.max(span, 0);
            span = Math.min(span, _this.data.box.width - 50);
            _this.setData({
                'position.left2': span
            });
        },
        endClick() {
            var _this = this;
            //处理结果判断
            var position = _this.data.position;
            var span = Math.abs(position.left2 - position.left);
            // console.info(span);
            if (span > 3) {
                _this.setData({
                    isMove: false,
                    status: 0
                });
                setTimeout(() => {
                    _this.refereshClick();
                }, 1000);
                //触发失败
                _this.triggerEvent('onerror', {}, {
                    bubbles: false,
                    composed: false
                });
            } else {
                _this.setData({
                    isMove: false,
                    status: 1
                });
                //1秒后关闭
                setTimeout(() => {
                  this.triggerEvent('onClose');
                }, 1000);
                //触发成功
                _this.triggerEvent('onsuccess', {}, {
                    bubbles: false,
                    composed: false
                });
            }
        },
        //刷新
        refereshClick() {
            var _this = this;
            var box = this.data.box;
            //随机宽度,高度
            var left = Math.round(Math.random() * (box.width - 100)) + 50;
            var top = Math.round(Math.random() * (box.height - 60)) + 20;
            const random = Math.round(Math.random() * 10);
            _this.setData({
                'position.left': left,
                'position.top': top,
                'position.left2': 0,
                status: -1,
                isMove: false,
                'box.back':_this.data.backImg[random]
            });
        },
        //关闭
        closeClick() {
            this.setData({
                isShow: false
            });
            this.triggerEvent('onClose');
        }
    },
    lifetimes: {
        ready() {
            var _this = this;
            //获取系统信息计算图片宽度高度
            wx.getSystemInfo({
                success: (result) => {
                    var width = result.screenWidth - 20 - 20;
                    var height = width / 16 * 9;
                    _this.setData({
                        box: {
                            width: width,
                            height: height
                        }
                    });
                    //随机初始化位置
                    _this.refereshClick();
                },
            })
        }
    },
    observers: {
      'show': function(show) {
        if (show) {
          var _this = this;
            //获取系统信息计算图片宽度高度
            wx.getSystemInfo({
                success: (result) => {
                    var width = result.screenWidth - 20 - 20;
                    var height = width / 16 * 9;
                    _this.setData({
                        box: {
                            width: width,
                            height: height
                        }
                    });
                    //随机初始化位置
                    _this.refereshClick();
                },
            })
        }
      }
    }
})
// index.json
{
  "component": true,
  "usingComponents": {}
}

3、页面中引入

{
    "usingComponents": {
        "puzzle-verify-simple": "/components/puzzle-verify-simple/index"
      }
}

4、页面中使用

<view class="contaier">
    <button bind:tap="onSearch">打开</button>
</view>
<!-- 滑动验证组件 -->
<puzzle-verify-simple enable-close="{{true}}" bind:onClose="onVerifyClose" show="{{showVerify}}" bind:onsuccess="onVerifySuccess" bind:onerror="onVerifyError"></puzzle-verify-simple>

5、子向父事件处理

// pages/sliderCode/index.js
Page({

    /**
     * 页面的初始数据
     */
    data: {
        showVerify: false, 
    },

    /**
     * 生命周期函数--监听页面加载
     */
    onLoad(options) {

    },
    onSearch() {
        // 显示滑动验证
        this.setData({
          showVerify: true,
        });
      },
    // 验证成功
  onVerifySuccess() {
    const { currentBatch } = this.data;
    
    wx.showLoading({
      title: '查询中...'
    });
    
    // 这里调用查询API
    setTimeout(() => {
      wx.hideLoading();
      wx.showToast({
        title: '查询成功',
      });
      this.setData({
        showVerify: false,
      });
    }, 2000);
  },
    onVerifyError() { },
    // 关闭验证
    onVerifyClose() {
        this.setData({
            showVerify: false,
        });
    },

    /**
     * 生命周期函数--监听页面初次渲染完成
     */
    onReady() {

    },

    /**
     * 生命周期函数--监听页面显示
     */
    onShow() {

    },

    /**
     * 生命周期函数--监听页面隐藏
     */
    onHide() {

    },

    /**
     * 生命周期函数--监听页面卸载
     */
    onUnload() {

    },

    /**
     * 页面相关事件处理函数--监听用户下拉动作
     */
    onPullDownRefresh() {

    },

    /**
     * 页面上拉触底事件的处理函数
     */
    onReachBottom() {

    },

    /**
     * 用户点击右上角分享
     */
    onShareAppMessage() {

    }
})
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容