我们在访问银行、金融、支付宝等第三方网站时,输入密码或者安全u盾安全码等,都有虚拟键盘功能。这些虚拟键盘只需通过鼠标点点即可实现键盘功能,预防某些木马对键盘事件进行监听,导致密码泄露问题。而使用虚拟键盘则很好的可以解决这类安全问题,因为我们只用鼠标左键进行点击,木马就监听不到我们具体输入的密码,从而达到更高的安全效果。
小面小编就为大家实现一块web版的虚拟键盘功能,运行demo截图如下:
HTML实现代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>HTML5/CSS3实现虚拟键盘功能</title>
<style>
body{
margin: 0;
padding: 0;
background: #222;
}
body.light{
background: #eee;
}
.switch{
position: absolute;
top: 35px;
left: calc(50% + 335px);
width: 40px;
height: 15px;
border-radius: 360px;
border: 1px solid #ccc;
cursor: pointer;
}
.switch.on{
background: rgba(152, 194, 37, 1);
border: 1px solid rgba(132, 174, 17, 1);
}
.switch .switcher{
width: 15px;
height: 15px;
border-radius: 360px;
margin-top: -1px;
background: #fff;
border: 1px solid #ccc;
box-shadow: 0 0 2px rgba(0,0,0,0.3);
cursor: pointer;
}
.switch.on .switcher{
margin-left: 24px;
}
.wrapper{
position: absolute;
top: 50px;
left: calc(50% - 400px);
width: 800px;
height: 200px;
}
.wrapper ul{
list-style: none;
margin: 0;
padding: 0;
}
.wrapper ul li{
float: left;
width: 40px;
height: 40px;
border: 1px solid #333;
border-radius: 3px;
margin-left: 10px;
margin-top: 10px;
position: relative;
}
body.light .wrapper ul li{
border: 1px solid #ccc;
}
body.light .wrapper ul li .text{
color: #bbb;
}
body.light .wrapper ul li:nth-child(28) .text{
background: #eee;
border-left: 1px solid #ccc;
border-right: 1px solid #ccc;
}
body.light .wrapper ul li:nth-child(29) .text:before{
background: #bbb;
}
.wrapper ul li:nth-child(14){
width: 90px;
}
.wrapper ul li:nth-child(15){
width: 70px;
}
.wrapper ul li:nth-child(28){
width: 60px;
border-bottom-right-radius: 0px;
}
.wrapper ul li:nth-child(28) .text{
position: absolute;
top: 27px;
right: -1px;
z-index: 5;
background: #222;
border-left: 1px solid #333;
border-right: 1px solid #333;
width: 40px;
height: 40px;
}
.wrapper ul li:nth-child(29){
width: 90px;
}
.wrapper ul li:nth-child(43){
width: 65px;
}
.wrapper ul li:nth-child(55){
width: 115px;
}
.wrapper ul li:nth-child(56){
opacity: 0.5;
}
.wrapper ul li:nth-child(43) .text{
margin-top: 22px !important;
margin-left: -10px;
}
.wrapper ul li:nth-child(55) .text{
margin-top: 22px !important;
margin-left: 85px;
}
.wrapper ul li:nth-child(59){
width: 55px;
}
.wrapper ul li:nth-child(60){
width: 260px;
}
.wrapper ul li:nth-child(61){
width: 55px;
}
.wrapper ul li:nth-child(63){
height: 19px;
margin-top: 30px;
}
.wrapper ul li:nth-child(64){
height: 19px;
}
.wrapper ul li:nth-child(65){
height: 19px;
margin-top: 30px;
margin-left: -42px;
border-top: 0px solid #fff;
}
.wrapper ul li:nth-child(66){
height: 19px;
margin-top: 30px;
}
.wrapper ul li .text{
color: #444;
font-family: Helvetica;
font-weight: 500;
font-size: 12px;
line-height: 17px;
width: 40px;
height: 40px;
margin-top: 5px;
text-align: center;
}
.wrapper ul li:nth-child(14) .text{
text-align: right;
margin-left: 40px;
font-weight: 100;
margin-top: 20px !important;
font-size: 23px;
}
.wrapper ul li:nth-child(15) .text{
text-align: left;
margin-left: 4px;
font-weight: 0;
margin-top: 20px !important;
font-size: 23px;
}
.wrapper ul li:nth-child(29) .text.active:before{
content: '';
position: absolute;
top: 5px;
left: 5px;
width: 5px;
height: 5px;
background: #98c225 !important;
box-shadow: 0 0 3px #98c225;
border-radius: 360px;
}
.wrapper ul li:nth-child(29) .text:before{
content: '';
position: absolute;
top: 5px;
left: 5px;
width: 5px;
height: 5px;
background: #333;
border-radius: 360px;
}
.wrapper ul li:nth-child(29) .text{
margin-left: -10px;
padding-top: 5px;
}
.wrapper ul li.activeKey .finger{
position: absolute;
width: 40px;
height: 40px;
top: -5px;
left: -5px;
margin-top: 5px;
margin-left: 5px;
border-radius: 360px;
background: rgba(28, 171, 233, 0.5);
opacity: 0;
}
input{
border: 0px solid #fff;
background: transparent;
font-size: 20px;
font-family: Helvetica;
font-weight: 100;
width: 780px;
height: 40px;
position: absolute;
top: 330px;
color: #ccc;
left: calc(50% - 390px);
border-bottom: 1px solid #333;
}
body ::-webkit-input-placeholder{
color: #444;
}
body.light ::-webkit-input-placeholder{
color: #bbb;
}
body.light input{
border-bottom: 1px solid #ccc;
color: #222;
}
body.light input:focus{
outline: none;
border-bottom: 1px solid rgba(28, 171, 233, 0.5);
}
body input:focus{
outline: none;
border-bottom: 1px solid rgba(28, 171, 233, 0.5);
}
</style>
<script src="http://cdn.bootcss.com/prefixfree/1.0.7/prefixfree.min.js"></script>
</head>
<body>
<div class='switch'>
<div class='switcher'></div>
</div>
<div class='wrapper'></div>
<input placeholder=':www.xttblog.com'>
<script src='http://cdn.bootcss.com/jquery/2.2.1/jquery.min.js'></script>
<script src="js/xttblog.js"></script>
</body>
</html>
xttblog.js代码如下:
var keyboardMap = {
"type": "german",
192: 0,
49: 1,
50: 2,
51: 3,
52: 4,
53: 5,
54: 6,
55: 7,
56: 8,
57: 9,
48: 10,
189: 11,
187: 12,
8: 13,
9: 14,
81: 15,
87: 16,
69: 17,
82: 18,
84: 19,
90: 20,
85: 21,
73: 22,
79: 23,
80: 24,
219: 25,
187: 26,
13: 27,
20: 28,
65: 29,
83: 30,
68: 31,
70: 32,
71: 33,
72: 34,
74: 35,
75: 36,
76: 37,
186: 38,
222: 39,
220: 40,
16: 42,
188: 43,
89: 44,
88: 45,
67: 46,
86: 47,
66: 48,
78: 49,
77: 50,
188: 51,
190: 52,
189: 53,
16: 54,
17: 56,
18: 57,
91: 58,
32: 59,
93: 60,
18: 61,
37: 62,
38: 63,
39: 65,
40: 64,
60: 43,
44: 51,
223: 11,
45: 53,
63: 11,
43: 26
},keyboardKeys = {
"type": "german",
0: ["°","^"],
1: ["!","1"],
2: ["/"","2"],
3: ["§","3"],
4: ["$","4"],
5: ["%","5"],
6: ["&","6"],
7: ["/","7"],
8: ["(","8"],
9: [")","9"],
10: ["=","0"],
11: ["?","ß"],
12: ["`","´"],
13: ["←"],
14: ["⇥"],
15: ["Q"],
16: ["W"],
17: ["E"],
18: ["R"],
19: ["T"],
20: ["Z"],
21: ["U"],
22: ["I"],
23: ["O"],
24: ["P"],
25: ["Ü"],
26: ["*","+"],
27: ["↩"],
28: ["⇪"],
29: ["A"],
30: ["S"],
31: ["D"],
32: ["F"],
33: ["G"],
34: ["H"],
35: ["J"],
36: ["K"],
37: ["L","@"],
38: ["Ö"],
39: ["Ä"],
40: ["'","#"],
42: ["⇧"],
43: [">","<"],
44: ["Y"],
45: ["X"],
46: ["C"],
47: ["V"],
48: ["B"],
49: ["N"],
50: ["M"],
51: [";",","],
52: [":","."],
53: ["_","-"],
54: ["⇧"],
55: ["fn"],
56: ["ctrl"],
57: ["alt","⌥"],
58: ["cmd","⌘"],
60: ["⌘","cmd"],
61: ["alt","⌥"],
62: ["◀"],
63: ["▲"],
64: ["▼"],
65: ["►"]
};
$(document).ready(function(){
$("body").addClass("light");
$("input").focus();
var ul ="<ul>";
for(var i=0;i<66;i++){
ul+="<li><div class='text'></div><div class='finger'></div></li>";
}
ul+="</ul>";
$('div.wrapper').append(ul);
$(".wrapper ul li").each(function(i){
if(keyboardKeys[i]){
if(keyboardKeys[i].length > 1){
var string = "";
if(i==58 || i==60){
for(var j=0;j<keyboardKeys[i].length;j++){
string += keyboardKeys[i][j]+" ";
}
$(".text", this).html(string).css("width","55px").css("margin-left","2px").css("margin-top","23px");
}
else{
for(var j=0;j<keyboardKeys[i].length;j++){
string += keyboardKeys[i][j]+"<br>";
}
$(".text", this).html(string);
}
}
else{
$(".text", this).html(keyboardKeys[i][0]).css("margin-top","13px");
}
if(i==55 || i==56){
$(".text", this).html(keyboardKeys[i][0]).css("margin-top","23px").css("margin-left","-8px");
}
if(i==57||i==61){
$(".text", this).html($(".text", this).html()).css("margin-top","-2px").css("margin-left","-8px").css("line-height","22px");
}
if(i==61){
$(".text", this).css("margin-left","9px");
}
if(i > 61){
$(".text", this).css("margin-top","3px");
}
}
});
$(".switch").click(function(){
$(this).toggleClass("on");
$("body").toggleClass("light");
});
document.addEventListener("keypress",function(e){
if(e.keyCode == 60 || e.keyCode == 44 || e.keyCode == 45 || e.keyCode == 223 || e.keyCode == 63 || e.keyCode == 43){
keyDownAni(keyboardMap[e.keyCode],e);
}
if(!$("input").is(":focus")){
e.preventDefault();
}
});
document.addEventListener("keydown",function(e){
if(e.keyCode == 8 || e.keyCode == 9){
if(!$("input").is(":focus")){
e.preventDefault();
}
}
setTimeout(function(){
if(e.shiftKey && e.keyCode == 16){
var loc = e.location;
if(loc == 1){
//left
keyDownAni(42,e);
}
else if(loc == 2){
//right
keyDownAni(54,e);
}
}
else if(e.altKey && e.keyCode == 18){
if(e.location == 1){
//left
keyDownAni(57,e);
}
else if(e.location == 2){
//left
keyDownAni(61,e);
}
}
else if(e.keyCode == 187 || e.keyCode == 188 || e.keyCode == 189 || e.keycode == 191){
}
else{
keyDownAni(keyboardMap[e.keyCode],e);
}
},10);
});
});
function keyDownAni(eq,e){
var randLetter = String.fromCharCode(65 + Math.floor(Math.random() * 26));
var uid = randLetter + Date.now();
var sk = isCapslock(e);
if(sk){
$(".wrapper ul li").eq(eq).children(".text").toggleClass("active");
}
else{
$(".wrapper ul li").eq(eq).children(".text").toggleClass("active");
}
$(".wrapper ul li").eq(eq).addClass("activeKey");
$(".wrapper ul li").eq(eq).attr("id",uid);
$("#"+uid+" .finger").animate({
opacity: 1,
width: "30px",
height: "30px",
top: "0px",
left: "0px"
},300, function(){
$("#"+uid+" .finger").animate({
opacity: 0,
width: "40px",
height: "40px",
top: "-5px",
left: "-5px"
},300,function(){
$("#"+uid+" .finger").eq(eq).removeClass("activeKey");
});
});
}
function isCapslock(e){
e = (e) ? e : window.event;
var charCode = false;
if (e.which) {
charCode = e.which;
} else if (e.keyCode) {
charCode = e.keyCode;
}
var shifton = false;
if (e.shiftKey) {
shifton = e.shiftKey;
} else if (e.modifiers) {
shifton = !!(e.modifiers & 4);
}
if (charCode >= 97 && charCode <= 122 && shifton) {
return true;
}
if (charCode >= 65 && charCode <= 90 && !shifton) {
return true;
}
return false;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

: » HTML5/CSS3实现虚拟键盘功能
原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/tech/aiops/251142.html