js+html5实现手机九宫格密码解锁功能
作者:业余草 时间:2024-05-09 15:02:36
HTML5真的是很强大,前端时间看到一个canvas实现九宫格的密码解锁。今天抽出时间模仿了一个,特定分享一下!
效果截图如下:
效果看起来还不错吧!
源码如下:
<!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>
来源:https://blog.csdn.net/xmtblog/article/details/50252127
标签:js,九宫格,密码解锁
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Windows下mysql5.7.10安装配置方法图文教程
2024-01-19 16:19:43
![](https://img.aspxhome.com/file/2023/9/79019_0s.png)
Golang解析JSON遇到的坑及解决方法
2024-05-10 13:58:29
python 查看cpu的核数实现
2023-01-02 21:09:31
![](https://img.aspxhome.com/file/2023/3/80493_0s.png)
php实现mysql同步的实现方法
2023-11-24 13:58:56
Python必须了解的35个关键词
2023-05-20 07:37:33
浅析python中的迭代与迭代对象
2023-11-19 09:21:35
Python函数参数分类原理详解
2022-02-26 17:05:57
![](https://img.aspxhome.com/file/2023/1/117951_0s.png)
Python使用shutil模块实现文件拷贝
2021-02-01 14:46:28
运行(runCode)复制(copyCode)保存(saveCode)代码框方法
2007-10-21 08:41:00
PHP类的特性实例分析
2024-05-03 15:49:46
vue如何使用router.meta.keepAlive对页面进行缓存
2024-05-29 22:49:03
一文学会利用python解决文章付费限制问题
2021-04-09 08:23:51
![](https://img.aspxhome.com/file/2023/7/82537_0s.jpg)
如何通过pycharm实现对数据库的查询等操作(非多步操作)
2024-01-25 03:31:37
一文搞懂Go Exec 僵尸与孤儿进程
2023-10-21 07:14:07
debian6配置mysql允许远程连接的方法(图)
2024-01-13 19:42:20
![](https://img.aspxhome.com/file/2023/9/99359_0s.png)
bootstrap选项卡使用方法解析
2024-04-16 09:13:11
仿微博字符限制效果实现代码
2024-04-28 09:51:18
![](https://img.aspxhome.com/file/2023/7/132727_0s.jpg)
Windows下pycharm安装第三方库失败(通用解决方案)
2022-06-07 22:54:37
![](https://img.aspxhome.com/file/2023/5/127085_0s.png)
为什么相对PHP黑python的更少
2024-05-21 10:20:51
最新解决没有NVSMI文件夹以及nvidia-smi‘ 不是内部或外部命令也不是可运行的程序或批处理文件
2023-03-26 18:13:34
![](https://img.aspxhome.com/file/2023/1/115531_0s.png)