js 模仿手机手势解锁
只做了pc端 没有做手机端touch事件的兼容 有兴趣的朋友可以改改
<div class="main"> <div class="gesture"> <ul> </ul> <div id="pan"> </div> </div> </div> <div class="footer"> <button onclick="set_tu()"> 保存图案</button> <button onclick="get_tu()"> 开始画图</button> </div> <style> body { margin: 0; padding: 0; } .main { float: left; width: 100%; } .footer { float: left; margin-left: 50px; } .gesture { width: 216px; float: left; margin: 50px; position: relative; } .gesture #pan { position: relative; } .gesture #pan span { width: 23px; height: 2px; position: absolute; left: 50px; background: black; top: 24px; } .gesture #pan span.h { width: 20px; } .gesture #pan span.x { top: 62px; transform: rotate(45deg); width: 51px; } .gesture #pan span.s { width: 22px; transform: rotate(90deg); } .gesture #pan span.xia { transform: rotate(-45deg); } ul { list-style: none; width: 100%; float: left; padding: 0; margin: 0; } ul li { width: 50px; height: 50px; border: 1px solid green; border-radius: 30px; float: left; margin-right: 20px; margin-bottom: 20px; } body { -webkit-user-select: none; -moz-user-select: none; -khtml-user-select: none; -ms-user-select: none; /* 以下两个属性目前并未支持,写在这里为了减少风险 */ -o-user-select: none; user-select: none; } </style>
<script>
//曲线
var pan = document.querySelector("#pan");
//图案
var ul = document.querySelector("ul");
for (var i = 0; i < 9; i++) {
var li = document.createElement("li");
li.id = i;
ul.appendChild(li);
li.onmousedown = mouse_down;
//鼠标在图案上移动
li.onmousemove = mouse_move;
li.onmouseup = mouse_up;
}
//参数
var tu_arr = []; //图案集合保存记录
var hua_arr = []; //图案集合画图记录
var mouse_isdown; //鼠标是否按下
var mouse_type = false; //画图还是记录 true 画图 false 记录
var mouse_down_dom; //画的最后一个图标
//鼠标按下
function mouse_down() {
if (!mouse_type) {
tu_arr = [];
clear_tu();
}
var left = this.offsetLeft
var top = this.offsetTop
mouse_isdown = true;
mouse_down_dom = this;
}
//鼠标移动
function mouse_move(ev) {
if (mouse_isdown) {
this.style.background = "green";
if (!mouse_type && tu_arr.indexOf(this.id) < 0) {
tu_arr.push(this.id);
}
else if (hua_arr.indexOf(this.id) < 0)
hua_arr.push(this.id);
var jian_id = Math.abs(this.id - mouse_down_dom.id);
if (jian_id > 0) {
var left;
var top;
var jian_id_result = this.id - mouse_down_dom.id;
var span = document.createElement("span");
switch (jian_id) {
case 1:
span.className = "h";
if (jian_id_result == 1) {
left = mouse_down_dom.offsetLeft + mouse_down_dom.offsetWidth;
top = mouse_down_dom.offsetTop + mouse_down_dom.offsetHeight / 2;
} else {
left = this.offsetLeft + this.offsetWidth;
top = this.offsetTop + this.offsetHeight / 2;
}
break;
case 3:
span.className = "s";
if (jian_id_result == 3) {
left = mouse_down_dom.offsetLeft + mouse_down_dom.offsetWidth / 2 - 12;
top = mouse_down_dom.offsetTop + mouse_down_dom.offsetHeight + 8;
} else {
left = this.offsetLeft + this.offsetWidth / 2 - 12;
top = this.offsetTop + this.offsetHeight + 8;
}
break;
case 4:
span.className = "x";
if (jian_id_result == 4) {
left = mouse_down_dom.offsetLeft + mouse_down_dom.offsetWidth - 14;
top = mouse_down_dom.offsetTop + mouse_down_dom.offsetHeight + 8;
} else {
left = this.offsetLeft + this.offsetWidth - 14;
top = this.offsetTop + this.offsetHeight + 8;
}
break;
case 2:
span.className = "x xia";
if (jian_id_result == 2) {
left = this.offsetLeft + this.offsetWidth / 2 + 9;
top = this.offsetTop - 12;
} else {
left = mouse_down_dom.offsetLeft + mouse_down_dom.offsetWidth / 2 + 9;
top = mouse_down_dom.offsetTop - 12;
}
break;
}
span.style.left = left;
span.style.top = top;
pan.appendChild(span);
}
mouse_down_dom = this;
}
}
//鼠标抬起
ul.onmouseup = mouse_up;
function mouse_up(e) {
var e = e || window.event;
if (e.stopPropagation) { //W3C阻止冒泡方法
e.stopPropagation();
} else {
e.cancelBubble = true; //IE阻止冒泡方法
}
//开始比较图案
if (mouse_type) {
var result = tu_arr.join(",") == hua_arr.join(",");
if (!result) {
alert("解锁失败");
} else
alert("解锁成功");
hua_arr = [];
clear_tu();
}
mouse_isdown = false;
}
//保存图案
function set_tu() {
hua_arr = [];
clear_tu();
}
//画图
function get_tu() {
mouse_type = true;
}
//清空当前所画图案
function clear_tu() {
pan.innerHTML = "";
var li_list = ul.querySelectorAll("li");
for (var i = 0; i < li_list.length; i++) {
li_list[i].style = "";
}
}
</script>
如有疑问联系QQ:2388908676

浙公网安备 33010602011771号