javascript利用键盘控制小方块的移动


Posted in Javascript onApril 20, 2020

本文实例为大家分享了利用键盘控制小方块的移动,供大家参考,具体内容如下

原理

1. 利用键盘控制移动,则需要了解onkeydown函数,表示某个按键被按下,可以以此绑定一个事件响应函数,当键盘被按下时候,触发此事件,进行移动

2. keyCode 对于keypress 事件,该属性声明了被敲击的键生成的 Unicode 字符码。对于 keydown 和 keyup 事件,它指定了被敲击的键的虚拟键盘码。虚拟键盘码可能和使用的键盘的布局相关。 因此我们可以根据keycode返回的字符码来判断用户所按下的键,下面就是一个用于测试上下左右按键的js代码,经过我的测试之后,返回37 38 39 40;

window.onload = function(){
  var box = document.getElementById("box");
  document.onkeydown = function(event){
   event = event || window.event;
   console.log(event.keyCode);
  }  
  };

3.方块的移动实际上就是坐标的改变,因此需要offsetLeft 和offsetTop 来获得当前方块的坐标,然后将坐标进行一定的更改,就可以实现移动的效果了,下面给出代码

window.onload = function() {
  document.onkeydown = function(event) {
   event = event || window.event;
   //设置移动速度
   var speed = 10;
   //当ctrl和方向按键同时按下时,提升移动速度
   if(event.ctrlKey) {
   speed = 50;
   }
   //获取div
   var box01 = document.getElementById("box01");
   switch(event.keyCode) {
   /*keyCode返回按下按键的编码
    * 37 向左
    * 38向上
    * 39向右
    * 40向下
    */
   case 37:
    box01.style.left = box01.offsetLeft - speed + "px";
    break;
   case 39:
    box01.style.left = box01.offsetLeft + speed + "px";
    break;
   case 38:
    box01.style.top = box01.offsetTop - speed + "px";
    break;
   case 40:
    box01.style.top = box01.offsetTop + speed + "px";
    break;

   }
  };
  
  };

这样就可以简单实现方块的移动,但是此时我们会发现一个问题,当我们进行移动的时候,按住按键不松手,理论上方块应该直接平滑的进行移动,但实际上并非如此,第一下它会有一个小的停顿,这实际上是浏览器防止误触所设置的,因此我们需要对此进行优化

解决方案

  • 这里我采用了定时器的做法来解决这个问题,因为控制移动的因素有两个,一个是控制方向,一个是控制速度,控制方向没有问题,因此我们需要改变速度
  • setInterval(function(){},time);这是一个定时器,我们只需要在time时间内调用一次函数,就可以解决停顿的问题了

下面附上修改后的完整代码

<!DOCTYPE html>
<html>

 <head>
 <meta charset="UTF-8">
 <title></title>
 <style type="text/css">
  #box01 {
  width: 100px;
  height: 100px;
  background-color: #008000;
  position: absolute;
  }
 </style>
 <script type="text/javascript">
  window.onload = function() {

  //获取div
  var box01 = document.getElementById("box01");
  //设置移动速度
  var speed = 10;
  //设置移动的方向
  var dir = 0;

  setInterval(function() {
   switch(dir) {
   /*keyCode返回按下按键的编码
    * 37 向左
    * 38向上
    * 39向右
    * 40向下
    */
   case 37:
    box01.style.left = box01.offsetLeft - speed + "px";
    break;
   case 39:
    box01.style.left = box01.offsetLeft + speed + "px";
    break;
   case 38:
    box01.style.top = box01.offsetTop - speed + "px";
    break;
   case 40:
    box01.style.top = box01.offsetTop + speed + "px";
    break;

   }

  }, 50)

  document.onkeydown = function(event) {
   event = event || window.event;

   //当ctrl和方向按键同时按下时,提升移动速度
   if(event.ctrlKey) {
   speed = 50;
   } else {
   speed = 10;
   }
   //使dir等于keycode的值
   dir = event.keyCode;

   //当鼠标松开时,停止移动     ---如果不写这一个会造成无法停止移动的效果
   document.onkeyup = function() {
   dir = 0;
   };

  };

  };
 </script>
 </head>

 <body>
 <div id="box01"></div>
 </body>

</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript将string类型转换int类型
Dec 09 Javascript
基于jquery的一行代码轻松实现拖动效果
Dec 28 Javascript
关于URL中的特殊符号使用介绍
Nov 03 Javascript
js创建子窗口并且回传值示例代码
Jul 02 Javascript
js实现的点击div区域外隐藏div区域
Jun 30 Javascript
js实现类似jquery里animate动画效果的方法
Apr 10 Javascript
js漂浮广告实现代码
Aug 15 Javascript
简单理解js的prototype属性及使用
Dec 07 Javascript
Require.js的基本用法详解
Jul 03 Javascript
JavaScript中正则表达式判断匹配规则及常用方法
Aug 03 Javascript
javascript自定义日期比较函数用法示例
Jul 22 Javascript
JS中FileReader类实现文件上传及时预览功能
Mar 27 Javascript
vue实现购物车的监听
Apr 20 #Javascript
详解微信小程序工程化探索之webpack实战
Apr 20 #Javascript
Vue中el-form标签中的自定义el-select下拉框标签功能
Apr 20 #Javascript
javascript设计模式 ? 中介者模式原理与用法实例分析
Apr 20 #Javascript
javascript设计模式 ? 命令模式原理与用法实例分析
Apr 20 #Javascript
JS实现横向跑马灯效果代码
Apr 20 #Javascript
vue2.x数组劫持原理的实现
Apr 19 #Javascript
You might like
用JavaScript实现仿Windows关机效果
2007/03/10 Javascript
document.write()及其输出内容的样式、位置控制
2013/08/12 Javascript
jquery datepicker参数介绍和示例
2014/04/15 Javascript
了不起的node.js读书笔记之mongodb数据库交互
2014/12/22 Javascript
jquery获取select选中值的方法分析
2015/12/22 Javascript
基于javascript实现根据身份证号码识别性别和年龄
2016/01/22 Javascript
性能优化之代码优化页面加载速度
2017/03/01 Javascript
js控制文本框禁止输入特殊字符详解
2017/04/07 Javascript
详谈javascript精度问题与调整
2017/07/08 Javascript
简单实现jQuery上传图片显示预览功能
2020/06/29 jQuery
详解vue-cli之webpack3构建全面提速优化
2017/12/25 Javascript
原生JS封装_new函数实现new关键字的功能
2018/08/12 Javascript
vue项目中使用Hbuilder打包app 设置沉浸式状态栏的方法
2018/10/22 Javascript
vue-router权限控制(简单方式)
2018/10/29 Javascript
vue-cli3项目展示本地Markdown文件的方法
2019/06/07 Javascript
vue.js路由mode配置之去掉url上默认的#方法
2019/11/01 Javascript
详解vue-template-admin三级路由无法缓存的解决方案
2020/03/10 Javascript
Python AES加密实例解析
2018/01/18 Python
python学习入门细节知识点
2018/03/29 Python
Python中的正则表达式与JSON数据交换格式
2019/07/03 Python
django2笔记之路由path语法的实现
2019/07/17 Python
快速解决jupyter启动卡死的问题
2020/04/10 Python
Python使用Numpy模块读取文件并绘制图片
2020/05/13 Python
HTML5 Canvas如何实现纹理填充与描边(Fill And Stroke)
2013/07/15 HTML / CSS
英国50岁以上人群的交友网站:Ourtime
2018/03/28 全球购物
Nordgreen美国官网:在线购买极简主义斯堪的纳维亚手表
2019/07/24 全球购物
学年自我鉴定范文
2013/10/01 职场文书
英文简历中的自我评价
2013/10/06 职场文书
天地会口号
2014/06/17 职场文书
光学与应用专业毕业生求职信
2014/09/01 职场文书
创先争优活动个人总结
2015/03/04 职场文书
2015年社区流动人口工作总结
2015/05/12 职场文书
红楼梦读书笔记
2015/06/25 职场文书
外出考察学习心得体会
2016/01/18 职场文书
react antd实现动态增减表单
2021/06/03 Javascript
python自动化八大定位元素讲解
2021/07/09 Python