欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

js+html5實(shí)現(xiàn)手機(jī)九宮格密碼解鎖功能

 更新時(shí)間:2018年07月30日 11:40:34   作者:業(yè)余草  
這篇文章主要為大家詳細(xì)介紹了js+html5實(shí)現(xiàn)手機(jī)九宮格密碼解鎖功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

HTML5真的是很強(qiáng)大,前端時(shí)間看到一個(gè)canvas實(shí)現(xiàn)九宮格的密碼解鎖。今天抽出時(shí)間模仿了一個(gè),特定分享一下!

效果截圖如下:

效果看起來(lái)還不錯(cuò)吧!

源碼如下:

<!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實(shí)現(xiàn)網(wǎng)頁(yè)解鎖功能</title>
  <style type="text/css">
    html, body {
      margin: 0;
      padding: 0;
      width: 100%;
      height: 100%;
    }
  </style>
  <script type="text/javascript">
   /**
   * 半徑,畫(huà)布寬度,畫(huà)布高度,畫(huà)布x內(nèi)邊距,畫(huà)布y內(nèi)邊距
   */
    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++) {
         // 計(jì)算圓心坐標(biāo)
          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;//網(wǎng)頁(yè)可見(jiàn)區(qū)域?qū)?
      canvas.width = canvasWidth;
      canvas.height = canvasHeight;
      var cxt = canvas.getContext("2d");
      /**
       * 每行3個(gè)圓
       * OffsetX為canvas x方向內(nèi)邊距
       * */
      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();
        }
 
      }
    }
    
    /**
     * 計(jì)算選中的密碼 
     */
    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;
      }
    }
    
    /**
     * 給畫(huà)布綁定事件
     */
    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("密碼結(jié)果是:"+pwdArr.join("->"));
        pwdArr=[];
      }, false);
    }
  </script>
</head>
<body>
<canvas id="lockCanvas"></canvas>
</body>
</html>

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • asp.net+js實(shí)現(xiàn)金額格式化

    asp.net+js實(shí)現(xiàn)金額格式化

    這篇文章主要介紹了asp.net+js實(shí)現(xiàn)金額格式化的相關(guān)資料,需要的朋友可以參考下
    2015-02-02
  • 詳解小程序橫屏方案對(duì)比

    詳解小程序橫屏方案對(duì)比

    這篇文章主要介紹了小程序橫屏方案對(duì)比,實(shí)現(xiàn)橫屏的方案也有多種,但是每種方案都有一定的缺陷,恰巧最近也在橫屏方案上踩了不少坑,本文就一起來(lái)介紹一下吧
    2020-06-06
  • js中document.referrer實(shí)現(xiàn)移動(dòng)端返回上一頁(yè)

    js中document.referrer實(shí)現(xiàn)移動(dòng)端返回上一頁(yè)

    本文主要介紹了document.referrer實(shí)現(xiàn)移動(dòng)端返回上一頁(yè)的方法,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • easyui-combobox 實(shí)現(xiàn)簡(jiǎn)單的自動(dòng)補(bǔ)全功能示例

    easyui-combobox 實(shí)現(xiàn)簡(jiǎn)單的自動(dòng)補(bǔ)全功能示例

    下面小編就為大家?guī)?lái)一篇easyui-combobox 實(shí)現(xiàn)簡(jiǎn)單的自動(dòng)補(bǔ)全功能示例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,
    2016-11-11
  • JS實(shí)現(xiàn)向表格行添加新單元格的方法

    JS實(shí)現(xiàn)向表格行添加新單元格的方法

    這篇文章主要介紹了JS實(shí)現(xiàn)向表格行添加新單元格的方法,涉及javascript針對(duì)表格進(jìn)行動(dòng)態(tài)操作的技巧,需要的朋友可以參考下
    2015-03-03
  • js圖片輪播手動(dòng)切換效果

    js圖片輪播手動(dòng)切換效果

    這篇文章主要為大家詳細(xì)介紹了js圖片輪播手動(dòng)切換效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2015-11-11
  • 跨域資源共享 CORS 詳解

    跨域資源共享 CORS 詳解

    所有瀏覽器都支持該功能IE瀏覽器不能低于IE10.整個(gè)CORS通信過(guò)程都是瀏覽器自動(dòng)完成不需要用戶(hù)參與。對(duì)于開(kāi)發(fā)者來(lái)說(shuō)CORS通信與同源的AJAX通信沒(méi)有差別代碼完全一樣瀏覽器一旦發(fā)現(xiàn)AJAX請(qǐng)求跨源就會(huì)自動(dòng)添加一些附加的頭信息有時(shí)還會(huì)多出一次附加的請(qǐng)求,但用戶(hù)不會(huì)有感覺(jué)。
    2016-04-04
  • JS調(diào)用打印方法設(shè)置頁(yè)眉頁(yè)腳的實(shí)例

    JS調(diào)用打印方法設(shè)置頁(yè)眉頁(yè)腳的實(shí)例

    一個(gè)網(wǎng)頁(yè)打印相關(guān)功能的擴(kuò)展演示特效,在實(shí)現(xiàn)了打印功能外,還實(shí)現(xiàn)了打印預(yù)覽、打印前的頁(yè)眉頁(yè)腳設(shè)置,直接打印等功能,以前對(duì)JS打印前設(shè)置頁(yè)腳見(jiàn)的不多,所以這一個(gè)也算是挺有價(jià)值的,希望閑暇時(shí)參閱
    2013-05-05
  • JavaScript算法系列之快速排序(Quicksort)算法實(shí)例詳解

    JavaScript算法系列之快速排序(Quicksort)算法實(shí)例詳解

    這篇文章主要介紹了JavaScript算法系列之快速排序(Quicksort)算法實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • 微信小程序拍照和攝像功能實(shí)現(xiàn)方法示例

    微信小程序拍照和攝像功能實(shí)現(xiàn)方法示例

    這篇文章主要介紹了微信小程序拍照和攝像功能實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了微信小程序拍照與攝影功能的原理、相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-02-02

最新評(píng)論