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 相关文章推荐
给网站上的广告“加速”显示的方法
Apr 08 Javascript
js在输入框屏蔽按键,只能键入数字的示例代码
Jan 03 Javascript
DIV始终居中的js代码
Feb 17 Javascript
浅谈Javascript数组索引
Jul 29 Javascript
jquery 动态增加,减少input表单的简单方法(必看)
Oct 12 Javascript
基于jQuery实现表格的排序
Dec 02 Javascript
基于JS实现二维码图片固定在右下角某处并跟随滚动条滚动
Feb 08 Javascript
面试常见的js算法题
Mar 23 Javascript
通俗解释JavaScript正则表达式快速记忆
Aug 23 Javascript
ES6学习教程之块级作用域详解
Oct 09 Javascript
详解小程序循环require之坑
Mar 08 Javascript
vue(2.x,3.0)配置跨域代理
Nov 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
如何使用PHP获取网络上文件
2006/10/09 PHP
php在数组中查找指定值的方法
2015/03/17 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
2016/04/30 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
2016/12/12 PHP
Laravel 加载第三方类库的方法
2018/04/20 PHP
不用ajax实现点击文字即可编辑的方法
2007/12/16 Javascript
JAVASCRIPT keycode总结
2009/02/04 Javascript
window.location 对象所包含的属性
2014/10/10 Javascript
jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法
2015/11/27 Javascript
vue.js表格分页示例
2016/10/18 Javascript
简单理解vue中实例属性vm.$els
2016/12/01 Javascript
Javascript中数组去重与拍平的方法示例
2017/02/03 Javascript
前端跨域的几种解决方式总结(推荐)
2017/08/16 Javascript
微信小程序progress组件使用详解
2018/01/31 Javascript
Javascript获取某个月的天数
2018/05/30 Javascript
一文读懂ES7中的javascript修饰器
2019/05/06 Javascript
JavaScript用document.write()输出换行的示例代码
2020/11/26 Javascript
python实现dnspod自动更新dns解析的方法
2014/02/14 Python
Django权限机制实现代码详解
2018/02/05 Python
python调用opencv实现猫脸检测功能
2019/01/15 Python
Python向excel中写入数据的方法
2019/05/05 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
2019/05/10 Python
Pyqt5 基本界面组件之inputDialog的使用
2019/06/25 Python
Django实现文件上传下载
2019/10/06 Python
Python3 解决读取中文文件txt编码的问题
2019/12/20 Python
浅谈Python中的异常和JSON读写数据的实现
2020/02/27 Python
Matplotlib 折线图plot()所有用法详解
2020/07/28 Python
python中用ctypes模拟点击的实例讲解
2020/11/26 Python
国际知名设计师时装商店:Coggles
2016/09/05 全球购物
思想专业自荐信范文
2013/12/25 职场文书
幼儿园的门卫岗位职责
2014/04/10 职场文书
护士感人事迹
2014/05/01 职场文书
大学计划书范文800字
2014/08/14 职场文书
国际贸易本科毕业生求职信
2014/09/26 职场文书
2015年“我们的节日·中秋节”活动总结
2015/07/30 职场文书
2016基督教会圣诞节开幕词
2016/03/04 职场文书