js+html5实现手机九宫格密码解锁功能


Posted in Javascript onJuly 30, 2018

HTML5真的是很强大,前端时间看到一个canvas实现九宫格的密码解锁。今天抽出时间模仿了一个,特定分享一下!

效果截图如下:

js+html5实现手机九宫格密码解锁功能

效果看起来还不错吧!

源码如下:

<!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;
      width: 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();
        }
 
      }
    }
    
    /**
     * 计算选中的密码 
     */
    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("密码结果是:"+pwdArr.join("->"));
        pwdArr=[];
      }, false);
    }
  </script>
</head>
<body>
<canvas id="lockCanvas"></canvas>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于Jquery的温度计动画效果
Jun 18 Javascript
jQuery jqgrid 对含特殊字符json 数据的 Java 处理方法
Jan 01 Javascript
jQuery 对Select的操作备忘记录
Jul 04 Javascript
有关于JS构造函数的重载和工厂方法
Apr 07 Javascript
JavaScript获取网页中第一个链接ID的方法
Apr 03 Javascript
js实现的黑背景灰色二级导航菜单效果代码
Aug 24 Javascript
springMVC + easyui + $.ajaxFileUpload实现文件上传注意事项
Apr 23 Javascript
jQuery实现动画、消失、显现、渐出、渐入效果示例
Sep 06 jQuery
layui 动态设置checbox 选中状态的例子
Sep 02 Javascript
JS实现电商商品展示放大镜特效
Jan 07 Javascript
用VsCode编辑TypeScript的实现方法
May 07 Javascript
原生js实现简单轮播图
Oct 26 Javascript
vscode中vue-cli项目es-lint的配置方法
Jul 30 #Javascript
JavaScript树的深度优先遍历和广度优先遍历算法示例
Jul 30 #Javascript
JavaScript笛卡尔积超简单实现算法示例
Jul 30 #Javascript
angular-tree-component的使用详解
Jul 30 #Javascript
使用vue-router为每个路由配置各自的title
Jul 30 #Javascript
JavaScript实现数组全排列、去重及求最大值算法示例
Jul 30 #Javascript
在react中使用vuex的示例代码
Jul 30 #Javascript
You might like
PHP显示今天、今月、上月、今年的起点/终点时间戳的代码
2011/05/25 PHP
解析CI的AJAX分页 另类实现方法
2013/06/27 PHP
PHP数组操作――获取数组最后一个值的方法
2015/04/14 PHP
ZF框架实现发送邮件的方法
2015/12/03 PHP
JavaScript数组常用操作技巧汇总
2014/11/17 Javascript
js中hash和ico的关联分析
2015/02/05 Javascript
JS 通过系统时间限定动态添加 select option的实例代码
2016/06/09 Javascript
在网页中插入百度地图的步骤详解
2016/12/02 Javascript
Vue 实用分页paging实例代码
2017/04/12 Javascript
JS实现手写parseInt的方法示例
2017/09/24 Javascript
BootStrap模态框不垂直居中的解决方法
2017/10/19 Javascript
JS简单获得节点元素的方法示例
2018/02/10 Javascript
Webpack的dll功能使用
2018/06/28 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
2019/07/16 Javascript
javascript Canvas动态粒子连线
2020/01/01 Javascript
JS中作用域以及变量范围分析
2020/07/18 Javascript
一篇文章快速了解Python的GIL
2018/01/12 Python
python爬取m3u8连接的视频
2018/02/28 Python
Python实现的个人所得税计算器示例
2018/06/01 Python
python 实现读取一个excel多个sheet表并合并的方法
2019/02/12 Python
详解python之heapq模块及排序操作
2019/04/04 Python
Python爬取爱奇艺电影信息代码实例
2019/11/26 Python
tensorflow模型继续训练 fineturn实例
2020/01/21 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
2020/11/28 Python
CSS3 animation ? steps 函数详解
2019/08/30 HTML / CSS
澳大利亚设计的优质鞋类和适合澳大利亚生活方式的服装:Rivers
2019/04/23 全球购物
数控专业毕业生求职信范文
2013/09/21 职场文书
自我评价优秀范文分享
2013/11/30 职场文书
安全生产检讨书
2014/01/21 职场文书
个人作风剖析材料
2014/02/02 职场文书
超市优秀员工获奖感言
2014/08/15 职场文书
师德师风自我评价范文
2014/09/11 职场文书
证券区域经理岗位职责
2015/04/10 职场文书
2015年社区统计工作总结
2015/04/21 职场文书
pytorch中的model=model.to(device)使用说明
2021/05/24 Python