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 学习书 推荐
Jun 13 Javascript
javascript间隔刷新的简单实例
Nov 14 Javascript
使用iframe window的scroll方法控制iframe页面滚动
Mar 05 Javascript
js识别不同浏览器基于userAgent做判断
Jul 29 Javascript
JavaScript中对象的不同创建方法
Aug 12 Javascript
Node.js的环境安装配置(使用nvm方式)
Oct 11 Javascript
Bootstrap源码解读表单(2)
Dec 22 Javascript
在NPM发布自己造的轮子的方法步骤
Mar 09 Javascript
vue-cli 3.x配置跨域代理的实现方法
Apr 12 Javascript
vue单页应用的内存泄露定位和修复问题小结
Aug 02 Javascript
Vue自定义多选组件使用详解
Sep 08 Javascript
vue使用refs获取嵌套组件中的值过程
Mar 31 Vue.js
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
评分9.0以上的动画电影,剧情除了经典还很燃
2020/03/04 日漫
用IE远程创建Mysql数据库的简易程序
2006/10/09 PHP
新手学PHP之数据库操作详解及乱码解决!
2007/01/02 PHP
PHP身份证校验码计算方法
2016/08/10 PHP
jQuery 对象中的类数组操作
2009/04/27 Javascript
基于jquery的大众点评,分类导航实现代码
2011/08/23 Javascript
JavaScript数组深拷贝和浅拷贝的两种方法
2014/04/16 Javascript
基于JavaScript操作DOM常用的API小结
2015/12/01 Javascript
前端框架学习总结之Angular、React与Vue的比较详解
2017/03/14 Javascript
详解webpack-dev-server使用http-proxy解决跨域问题
2018/01/13 Javascript
Vue自定义全局Toast和Loading的实例详解
2019/04/18 Javascript
微信小程序的授权实现过程解析
2019/08/02 Javascript
Layui给switch添加响应事件的例子
2019/09/03 Javascript
JavaScript实现打砖块游戏
2020/02/25 Javascript
通过实例解析JavaScript常用排序算法
2020/09/02 Javascript
JavaScript实现移动小精灵的案例代码
2020/12/12 Javascript
jquery实现鼠标悬浮弹出气泡提示框
2020/12/23 jQuery
pygame实现简易飞机大战
2018/09/11 Python
python读取文本中的坐标方法
2018/10/14 Python
pytorch 实现打印模型的参数值
2019/12/30 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
2020/03/12 Python
Django实现微信小程序支付的示例代码
2020/09/03 Python
纯CSS3实现的8种Loading动画效果
2014/07/05 HTML / CSS
html5 svg 中元素点击事件添加方法
2013/01/16 HTML / CSS
英国领先的在线鱼贩:The Fish Society
2020/08/12 全球购物
Vinatis德国:法国领先的葡萄酒邮购公司
2020/09/07 全球购物
法人代表授权委托书
2014/04/08 职场文书
幼儿教师年度个人总结
2015/02/05 职场文书
交通安全月活动总结
2015/05/08 职场文书
国情备忘录观后感
2015/06/04 职场文书
大学升旗仪式主持词
2015/07/04 职场文书
同学聚会感言一句话
2015/07/30 职场文书
大学学生会主席竞选稿怎么写?
2019/08/19 职场文书
创业计划书之烤红薯
2019/09/26 职场文书
MySQL数据库10秒内插入百万条数据的实现
2021/11/01 MySQL