仿支付寶滑塊驗證碼效果的手機端實現

爲了增強驗證功能,減小APP的被攻擊。隊長要求作一個支付寶的滑塊驗證效果。除了它外觀和用戶體驗上的優秀外,它的安全性並未下降,經過對用戶行爲的分析保證了安全校驗。 javascript

經過查找大多數案例都是PC端展現效果,在手機端並不能友好展現。因而參考一位CSND博主的文章進行了一些修改。css

原文連接 CSDN-仿支付寶滑塊驗證碼效果的前端實現html

展現效果圖:前端

clipboard.png

clipboard.png

clipboard.png

滑塊效果的前端實現。涵蓋的內容主要: 滑塊前端樣式(html排版),滑塊的閃光移動效果(CSS3 動畫),以及滑塊滑動腳本的編寫(javascript 按住,拖動,離開事件的編寫。)java

備註: 本實例HTML、CSS並沒有改動,只有 JS 的修改。jquery

HTMl代碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>滑動</title>
    <link rel="stylesheet" href="css/drag.css">
    <script src="http://code.jquery.com/jquery-1.12.3.min.js"></script>
    <script src="js/drag.js"></script>
    <style type="text/css">
        .slidetounlock{
            font-size: 12px;
            background:-webkit-gradient(linear,left top,right top,color-stop(0,#4d4d4d),color-stop(.4,#4d4d4d),color-stop(.5,#fff),color-stop(.6,#4d4d4d),color-stop(1,#4d4d4d));
            -webkit-background-clip:text;
            -webkit-text-fill-color:transparent;
            -webkit-animation:slidetounlock 3s infinite;
            -webkit-text-size-adjust:none
        }
        @-webkit-keyframes slidetounlock{0%{background-position:-200px 0} 100%{background-position:200px 0}}

    </style>
</head>
<body>
<div id="wrapper" style="position: relative;top: 300px;left:300px;">
    <div id="drag">
        <div class="drag_bg"></div>
        <div class="drag_text slidetounlock" onselectstart="return false;" unselectable="on">
            請按住滑塊,拖動到最右邊
        </div>
        <div class="handler handler_bg"></div>
    </div>
</div>

    <!--<a href="#" class="img"><img src="img/Lighthouse.jpg"/></a>-->
<script>
    $('#drag').drag();
</script>
</body>
</html>
CSS代碼
#drag{
    position: relative;
    background-color: #e8e8e8;
    width: 300px;
    height: 34px;
    line-height: 34px;
    text-align: center;
}
#drag .handler{
    position: absolute;
    top: 0px;
    left: 0px;
    width: 40px;
    height: 32px;
    border: 1px solid #ccc;
    cursor: move;
}
.handler_bg{
    background: #fff url("../img/slider.png") no-repeat center;
}
.handler_ok_bg{
    background: #fff url("../img/complet.png") no-repeat center;
}
#drag .drag_bg{
    background-color: #7ac23c;
    height: 34px;
    width: 0px;
}
#drag .drag_text{
    position: absolute;
    top: 0px;
    width: 300px;
    color:#9c9c9c;
    -moz-user-select: none;
    -webkit-user-select: none;
    user-select: none;
    -o-user-select:none;
    -ms-user-select:none;
    font-size: 12px;        //  add
}
JS代碼

備註: 本實例HTML、CSS並沒有改動,只有 JS 的修改。 web

一、將鼠標按下,移動,鬆開事件 換成 按住開始,按住移動,按住結束
二、定義手指所放在元素上的位置,來獲取pageX
三、取消事件綁定 off()安全

$.fn.drag = function(options) {
    var x, drag = this, isMove = false, defaults = {
    };
    var options = $.extend(defaults, options);
    var handler = drag.find('.handler');
    var drag_bg = drag.find('.drag_bg');
    var text = drag.find('.drag_text');
    var maxWidth = drag.width() - handler.width();  //能滑動的最大間距

    //觸摸屏幕時候的x軸的位置
    handler.on('touchstart',function(e) {
        e.preventDefault();
        isMove = true;
        var _touch = e.originalEvent.targetTouches[0];// 把元素放在手指所在的位置
        x = _touch.pageX - parseInt(handler.css('left'), 10);

    })
    //滑塊在移動時,移動距離大於0小於最大間距,滑塊x軸位置等於滑塊移動距離
    .on('touchmove',function(e) {
            e.preventDefault();
            var _touch = e.originalEvent.changedTouches[0];
            var _x = _touch.pageX - x;// _x = e.pageX - (e.pageX - parseInt(handler.css('left'), 10)) = x
            if (isMove) {
            if (_x > 0 && _x <= maxWidth) {
                handler.css({'left': _x});
                drag_bg.css({'width': _x});
            } else if (_x > maxWidth) {  //鼠標指針移動距離達到最大時清空事件
                dragOk();
            }
        }
    })
    //離開觸摸屏幕時,判斷位置
    .on('touchend', function(e) {
            e.preventDefault();
            isMove = false;
            var _touch = e.originalEvent.changedTouches[0];
            var _x = _touch.pageX - x;
            if (_x < maxWidth) { //鬆開滑塊時,若是沒有達到最大距離位置,滑塊就返回初始位置
            handler.css({'left': 0});
            drag_bg.css({'width': 0});
        }
    });

    //清空事件
    function dragOk() {
        handler.removeClass('handler_bg').addClass('handler_ok_bg');
        text.removeClass('slidetounlock').text('驗證經過').css({'color':'#fff'});       //modify
        // drag.css({'color': '#fff !important'});

        handler.css({'left': maxWidth});                   // add
        drag_bg.css({'width': maxWidth});                  // add

        //注意取消綁定的事件
        handler.off('touchstart');
        handler.off('touchmove');
        handler.off('touchend');
    }
};

若有問題,歡迎你們交流指正。QQ:1357912285app

相關文章
相關標籤/搜索