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 相关文章推荐
基于jQuery的消息提示插件 DivAlert之旅(二)
Apr 01 Javascript
基于jquery的jqDnR拖拽溢出的修改
Feb 12 Javascript
js Array操作的最简短最容易理解方法
Dec 09 Javascript
JavaScript语言对Unicode字符集的支持详解
Dec 30 Javascript
JS生成某个范围的随机数【四种情况详解】
Apr 20 Javascript
js实现的光标位置工具函数示例
Oct 03 Javascript
jQuery Validate验证表单时多个name相同的元素只验证第一个的解决方法
Dec 24 Javascript
JavaScript中递归实现的方法及其区别
Sep 12 Javascript
微信小程序性能优化之checkSession的使用
Mar 06 Javascript
服务端预渲染之Nuxt(使用篇)
Apr 08 Javascript
js实现弹窗效果
Aug 09 Javascript
vue 修改 data 数据问题并实时显示操作
Sep 07 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
1 Tube Radio
2021/03/02 无线电
PHP动态创建Web站点的方法
2011/08/14 PHP
php小经验:解析preg_match与preg_match_all 函数
2013/06/29 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
2017/08/10 PHP
jquery text,radio,checkbox,select操作实现代码
2009/07/09 Javascript
js去空格技巧分别去字符串前后、左右空格
2013/10/21 Javascript
js字母大小写转换实现方法总结
2013/11/13 Javascript
JavaScript事件委托的技术原理探讨示例
2014/04/17 Javascript
浅谈JavaScript函数节流
2014/12/09 Javascript
node.js抓取并分析网页内容有无特殊内容的js文件
2015/11/17 Javascript
JavaScript观察者模式(经典)
2015/12/09 Javascript
多个上传文件用js验证文件的格式和大小的方法(推荐)
2017/03/09 Javascript
jquery处理checkbox(复选框)是否被选中实例代码
2017/06/12 jQuery
jQuery实现html双向绑定功能示例
2017/10/09 jQuery
使用node打造自己的命令行工具方法教程
2018/03/26 Javascript
如何在基于vue-cli的项目自定义打包环境
2018/11/10 Javascript
Koa日志中间件封装开发详解
2019/03/09 Javascript
IE11下处理Promise及Vue的单项数据流问题
2019/07/24 Javascript
ES6中异步对象Promise用法详解
2019/07/31 Javascript
微信小程序swiper使用网络图片不显示问题解决
2019/12/13 Javascript
详解js中的原型,原型对象,原型链
2020/07/16 Javascript
解决vue 给window添加和移除resize事件遇到的坑
2020/07/21 Javascript
使用相同的Apache实例来运行Django和Media文件
2015/07/22 Python
Python实现将sqlite数据库导出转成Excel(xls)表的方法
2017/07/17 Python
关于python的list相关知识(推荐)
2017/08/30 Python
Python中pow()和math.pow()函数用法示例
2018/02/11 Python
django 修改server端口号的方法
2018/05/14 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
2020/02/10 Python
Django+python服务器部署与环境部署教程详解
2020/03/30 Python
浅谈CSS3中的变形功能-transform功能
2017/12/27 HTML / CSS
香港士多网上超级市场:Ztore
2021/01/09 全球购物
KEEN美国官网:美国人气户外休闲鞋品牌
2021/03/09 全球购物
通信工程毕业生求职信
2013/11/16 职场文书
活动总结书
2014/05/08 职场文书
情人节单身感言
2015/08/03 职场文书
Vue详细的入门笔记
2021/05/10 Vue.js