基于JavaScript的模拟键盘Web实现——可用作个人博客主页

基于JavaScript的模拟键盘Web实现——可用作个人博客主页

一.项目介绍

项目起因:
  在淘宝上看见一个卖键盘的视频,当键盘被敲击时,电脑上的按键同样会被点击,特别的炫酷,没错,就是因为帅。我就想着去下来玩玩,但是几乎找遍了所有软件和网站都没找到他们用的是什么。没办法,只能自己动手丰衣足食。
项目实现:
  1.跟随键盘点击(被按下的键盘会亮);
  2.英文的打字显示功能(做的时候突发奇想,金山打字通页面风格实在太丑了,用这个打字岂不美哉。),但没有完全实现,打字需要后端的支持,但这只是一个纯前端的项目。
  后续一定会做,毕竟谁不想自己的个人博客上有一个可以随时练手装逼的工具呢。

二.成果展示

请添加图片描述

三.源代码

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<style>
			body {
				display: -webkit-box;
				display: -ms-flexbox;
				display: flex;
				-webkit-box-pack: center;
				-ms-flex-pack: center;
				justify-content: center;
				-webkit-box-align: center;
				-ms-flex-align: center;
				align-items: center;
				text-align: center;
				height: 97.5vh;
				-webkit-perspective: 900px;
				perspective: 1000px;
				background: -webkit-linear-gradient(top, #a7a7a7, #5a5a5a);
				background: linear-gradient(to bottom, #a7a7a7, #5a5a5a);
				cursor: crosshair;
			}
			.keys {
				padding-top: 300px;
				-webkit-transform: rotateX(40deg);
				transform: rotateX(40deg);
			}
			.row {
				display: block;
			}
			kbd {
				border-radius: 4px;
				display: inline-block;
				padding: 5px;
				background-color: #222;
				margin: 0.2em;
				font-size: 1.2em;
				width: 30px;
				height: 30px;
				line-height: 35px;
				font-family: avenir;
				box-shadow: 0px 2px 0 rgba(0, 0, 0, 0.5);
				text-transform: uppercase;
				-webkit-transition: 0.1s ease all;
				transition: 0.1s ease all;
				color: rgba(255, 255, 255, 0.5);
			}
			body #keyboard .pressed {
				/*background: white;
				position: relative;
				top: 2px;
				box-shadow: none;*/
				color: yellow;
				-webkit-transform: translateY(2px);
				transform: translateY(2px);
			}
			body #keyboard .operationKey {
				text-transform: none !important;
			}
			body .uppercase {
				text-transform: uppercase;
			}
			body div#text {
				display: flex;
				justify-content: center;
				align-items: center;
				align-content: center;
				flex-wrap: wrap;
				align-items: flex-start;
				width: 20em;
				height: 44vh;
				max-height: 44vh;
				font-size: 3em;
				margin-bottom: 4vh;
				text-align: center;
				overflow: auto;
				align-self: flex-start;
				position: fixed;
				overflow-x:hidden;
				overflow-y:hidden;
			}
			@media (min-width: 768px) {
				body {
					font-size: 10px;
				}
			}
			@media (min-width: 960px) {
				body {
					font-size: 12px;
				}
			}
			@media (min-width: 1080px) {
				body {
					font-size: 14px;
				}
			}
		</style>
	</head>
	<body>
		<div id="text" >
			<div style="font-family:'黑体';font-size: 60px;"  id="enteredText">
				杜柠函的个人博客
			</div>
		</div>
		<div class='keys'>
			<div id="keyboard">
				<div class='row'>
					<kbd class="shifter" id="49">1</kbd>
					<kbd class="shifter" id="50">2</kbd>
					<kbd class="shifter" id="51">3</kbd>
					<kbd class="shifter" id="52">4</kbd>
					<kbd class="shifter" id="53">5</kbd>
					<a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>
					<a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>
					<kbd class="shifter" id="54">6</kbd>
					<kbd class="shifter" id="55">7</kbd>
					<kbd class="shifter" id="56">8</kbd>
					<kbd class="shifter" id="57">9</kbd>
					<kbd class="shifter" id="48">0</kbd>
				</div>
				<div class='row'>
					<kbd id="81">q</kbd>
					<kbd id="87">w</kbd>
					<kbd id="69">e</kbd>
					<kbd id="82">r</kbd>
					<kbd id="84">t</kbd>
					<a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>
					<a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>
					<a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>
					<kbd id="89">y</kbd>
					<kbd id="85">u</kbd>
					<kbd id="73">i</kbd>
					<kbd id="79">o</kbd>
					<kbd id="80">p</kbd>
				</div>
				<div class='row'>
					<kbd id="65">a</kbd>
					<kbd id="83">s</kbd>
					<kbd id="68">d</kbd>
					<kbd id="70">f</kbd>
					<kbd id="71">g</kbd>
					<a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>
					<a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>
					<a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>
					<a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>
					<a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>
					<kbd id="72">h</kbd>
					<kbd id="74">j</kbd>
					<kbd id="75">k</kbd>
					<kbd id="76">l</kbd>
					<kbd class="shifter" id="186">;</kbd>
				</div>
				<div class='row'>
					<kbd id="90">z</kbd>
					<kbd id="88">x</kbd>
					<kbd id="67">c</kbd>
					<kbd id="86">v</kbd>
					<a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>
					<a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>
					<a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>
					<a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>
					<a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>
					<a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>
					<a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>
					<a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>
					<kbd id="66">b</kbd>
					<kbd id="78">n</kbd>
					<kbd id="77">m</kbd>
					<kbd class="shifter" id="188">,</kbd>
				</div>
				<div hidden="hidden">
					<kbd class="shifter" id="189">-</kbd>
					<kbd class="shifter" id="187">=</kbd>
					<kbd class="shifter" id="190">.</kbd>
					<kbd class="shifter" id="191">/</kbd>
					<kbd class="longer operationKey" id="16">shift</kbd>
					<kbd class="operationKey" id="188">fn</kbd>
					<kbd class="operationKey" id="17">ctrl</kbd>
					<kbd class="operationKey" id="18">opt</kbd>
					<kbd class="long operationKey" id="91" ></kbd>
					<kbd class="spacebar operationKey" id="32">&nbsp;</kbd>
					<kbd class="long operationKey" id="91"></kbd>
					<kbd class="operationKey" id="18">opt</kbd>
					<kbd class="operationKey" id="17">ctrl</kbd>
					<kbd class="operationKey" id="188">fn</kbd>
					<kbd class="shifter" id="192">`</kbd>
					<kbd class="long operationKey" id="8">del</kbd>
					<kbd class="long operationKey" id="9">tab</kbd>
					<kbd class="shifter" id="219">[</kbd>
					<kbd class="shifter" id="221">]</kbd>
					<kbd class="shifter" id="220">\</kbd>
					<kbd class="long operationKey" id="20">caps</kbd>
					<kbd class="shifter" id="222">'</kbd>
					<kbd class="long operationKey" id="13">return</kbd>
					<kbd class="longer operationKey" id="16">shift</kbd>
				</div>
			</div>
		</div>
	</body>
	<script></script>
	<script>
		let textBox = document.getElementById('enteredText');
		let keyboard = document.getElementById('keyboard');
		let changeKeys = document.getElementsByClassName('shifter');
		let capsLockKey = document.getElementById('20'); //切换大小写
		let shiftKey = document.getElementById('16'); //shift
		//存储非字母键的所有原始值
		var originalShifterArray = [];
		for(i = 0; i < changeKeys.length; i++) {
			originalShifterArray.push(changeKeys[i].innerHTML);
		}
		//为按Shift键时进入的非字母键的替换值设置一个数组
		var shifterArray = ['~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '{', '}', '|', ':', '"', '<', '>', '?'];
		//清除文本框的函数
		function clearText() {
			textBox.innerHTML = '<br>';
		}
		//Function that detects keypresses and does the appropriate things
		function highlightAndType(e) {
			var keyPressed = e.keyCode; //获取click值的Ascll码
			var charPressed = e.key;  //获取click的值
			const keys = document.getElementById(keyPressed); //根据Ascll码id找到对应的kbd
			keys.classList.add('pressed');//找到的kbd进行点亮
			//如果用户按下了CapsLock或Shift键,将字母键改为大写
			if(charPressed == 'CapsLock' || charPressed == 'Shift') {
				keyboard.classList.add('uppercase');
			}
			//如果用户按下Shift键,还会用shifterArray的值替换所有非字母键
			if(charPressed == 'Shift') {
				for(i = 0; i < changeKeys.length; i++) {
					changeKeys[i].innerHTML = shifterArray[i];
				}
			}
			//确保键入的键是一个字符
			if(e.key.length <= 1) {
				if(textBox.innerHTML.endsWith('<br>')) {
					var newText = textBox.innerHTML.slice(0, -4);
					textBox.innerHTML = newText;
				}
				textBox.innerHTML += e.key;
				//如果输入了退格,请删除文本框中的最后一个字符。如果按住shift键,删除所有文本。
			} else if(e.key == 'Backspace') {
				if(shiftKey.classList.contains('pressed')) {
					clearText();
				} else {
					var newText = textBox.innerHTML.slice(0, -1);
					textBox.innerHTML = newText;
				}
				//如果键入了Enter键,请从文本框中删除所有文本
			} else if(e.key == 'Enter') {
				textBox.innerHTML = '<br><br>';
			}
			//如果按下Tab键,不要将Tab键移出窗口。改为在文本框中添加额外的空间
			if(keyPressed == 9) {
				e.preventDefault();
				textBox.innerHTML += '&emsp;&emsp;';
			}
		}
		//检测用户何时释放按键并做适当的事情的函数
		function removeKeypress(e) {
			var keyDepressed = e.keyCode;
			const keys = document.getElementById(keyDepressed);
			keys.classList.remove('pressed');//消除点亮
			//如果CapsLock或Shift刚刚被释放,如果另一个还没有打开,返回keys到小写
			if(keyDepressed == 20 && !shiftKey.classList.contains('pressed') || keyDepressed == 16 && !capsLockKey.classList.contains('pressed')) {
				keyboard.classList.remove('uppercase');
			}
			//如果Shift被取消,将所有非字母键替换为它们的原始值,而不是它们移位的值
			if(keyDepressed == 16) {
				for(i = 0; i < changeKeys.length; i++) {
					changeKeys[i].innerHTML = originalShifterArray[i];
				}
			}
		}
		setTimeout("document.getElementById(\"\").focus()",50);
		//每当用户按下一个键时,运行适当的功能
		window.addEventListener('keydown', highlightAndType);
		//每当用户让一个键向上,运行适当的功能
		window.addEventListener('keyup', removeKeypress);
		//每当点击窗口时,运行清除文本框的功能
		window.addEventListener('click', clearText);
	</script>
</html>

四.结束语

​   这个项目的后续开发可能会鸽很久,如果更新了会加上GitHub链接。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杜柠函

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值