zoukankan      html  css  js  c++  java
  • Html5实现手机九宫格password解锁功能

    HTML5真的是非常强大,前端时间看到一个canvas实现九宫格的password解锁。

    今天抽空模仿了一个,特定分享一下。

    效果截图例如以下:


    效果看起来还不错吧!

    源代码例如以下:

    <!DOCTYPE html>
    <html>
    <head lang="zh-CN">
        <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"/>
        <meta charset="UTF-8">
        <title>html5实现网页解锁功能</title>
        <style type="text/css">
            html, body {
                margin: 0;
                padding: 0;
                 100%;
                height: 100%;
            }
        </style>
        <script type="text/javascript">
        	/**
        	 * 半径,画布宽度。画布高度,画布x内边距,画布y内边距
        	 */
            var R = 26, canvasWidth = 400, canvasHeight = 320, OffsetX = 30, OffsetY = 30;
        	var circleArr = [];
            function createCirclePoint(diffX, diffY) {
                for (var row = 0; row < 3; row++) {
                    for (var col = 0; col < 3; col++) {
                    	// 计算圆心坐标
                        var Point = {
                            X: (OffsetX + col * diffX + ( col * 2 + 1) * R),
                            Y: (OffsetY + row * diffY + (row * 2 + 1) * R)
                        };
                        circleArr.push(Point);
                    }
                }
            }
            window.onload = function () {
                var canvas = document.getElementById("lockCanvas");
                canvasWidth = document.body.offsetWidth;//网页可见区域宽
                canvas.width = canvasWidth;
                canvas.height = canvasHeight;
                var cxt = canvas.getContext("2d");
                /**
                 * 每行3个圆
                 * OffsetX为canvas x方向内边距
                 * */
                var X = (canvasWidth - 2 * OffsetX - R * 2 * 3) / 2;
                var Y = (canvasHeight - 2 * OffsetY - R * 2 * 3) / 2;
                
                createCirclePoint(X, Y);
                
                bindEvent(canvas, cxt);
                //CW=2*offsetX+R*2*3+2*X
                Draw(cxt, circleArr, [],null);
            }
            function Draw(cxt, circleArr, pwdArr,touchPoint) {
                if (pwdArr.length > 0) {
                    cxt.beginPath();
                    for (var i = 0; i < pwdArr.length; i++) {
                        var pointIndex = pwdArr[i];
                        cxt.lineTo(circleArr[pointIndex].X, circleArr[pointIndex].Y);
                    }
                    cxt.lineWidth = 10;
                    cxt.strokeStyle = "#627eed";
                    cxt.stroke();
                    cxt.closePath();
                    if(touchPoint!=null){
                        var lastPointIndex=pwdArr[pwdArr.length-1];
                        var lastPoint=circleArr[lastPointIndex];
                        cxt.beginPath();
                        cxt.moveTo(lastPoint.X,lastPoint.Y);
                        cxt.lineTo(touchPoint.X,touchPoint.Y);
                        cxt.stroke();
                        cxt.closePath();
                    }
                }
                for (var i = 0; i < circleArr.length; i++) {
                    var Point = circleArr[i];
                    cxt.fillStyle = "#627eed";
                    cxt.beginPath();
                    cxt.arc(Point.X, Point.Y, R, 0, Math.PI * 2, true);
                    cxt.closePath();
                    cxt.fill();
                    cxt.fillStyle = "#ffffff";
                    cxt.beginPath();
                    cxt.arc(Point.X, Point.Y, R - 3, 0, Math.PI * 2, true);
                    cxt.closePath();
                    cxt.fill();
                    if(pwdArr.indexOf(i)>=0){
                        cxt.fillStyle = "#627eed";
                        cxt.beginPath();
                        cxt.arc(Point.X, Point.Y, R -16, 0, Math.PI * 2, true);
                        cxt.closePath();
                        cxt.fill();
                    }
    
                }
            }
            
            /**
             * 计算选中的password 
             */
            function getSelectPwd(touches,pwdArr){
                for (var i = 0; i < circleArr.length; i++) {
                    var currentPoint = circleArr[i];
                    var xdiff = Math.abs(currentPoint.X - touches.pageX);
                    var ydiff = Math.abs(currentPoint.Y - touches.pageY);
                    var dir = Math.pow((xdiff * xdiff + ydiff * ydiff), 0.5);
                    if(dir > R || pwdArr.indexOf(i) >= 0)
                    	continue;
                     pwdArr.push(i);
                     break;
                }
            }
            
            /**
             * 给画布绑定事件
             */
            function bindEvent(canvas, cxt) {
                var pwdArr = [];
                canvas.addEventListener("touchstart", function (e) {
                    getSelectPwd(e.touches[0],pwdArr);
                }, false);
                canvas.addEventListener("touchmove", function (e) {
                    e.preventDefault();
                    var touches = e.touches[0];
                    getSelectPwd(touches,pwdArr);
                    cxt.clearRect(0,0,canvasWidth,canvasHeight);
                    Draw(cxt,circleArr,pwdArr,{X:touches.pageX,Y:touches.pageY});
                }, false);
                canvas.addEventListener("touchend", function (e) {
                    cxt.clearRect(0,0,canvasWidth,canvasHeight);
                    Draw(cxt,circleArr,pwdArr,null);
                    alert("password结果是:"+pwdArr.join("->"));
                    pwdArr=[];
                }, false);
            }
        </script>
    </head>
    <body>
    <canvas id="lockCanvas"></canvas>
    </body>
    </html>
    好了下班了。就写这么多了!

    欢迎大家关注我的博客,如有疑问,请加qq群:454796847、135430763 共同进步!


  • 相关阅读:
    同步与异步 & 阻塞与非阻塞
    Memcached和Redis比较
    PHP安全之Web攻击
    搭建LNAMP环境(七)- PHP7源码安装Memcached和Memcache拓展
    PHP安装mysql.so扩展
    MySQL基础笔记
    CGI概念
    Nginx与Apache比较
    Nginx重写
    负载均衡session会话保持方法
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7262002.html
Copyright © 2011-2022 走看看