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 相关文章推荐
js form 验证函数 当前比较流行的错误提示
Jun 23 Javascript
Extjs学习笔记之三 extjs form更多的表单项
Jan 07 Javascript
JavaScript针对网页节点的增删改查用法实例
Feb 02 Javascript
javascript随机显示背景图片的方法
Jun 18 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
Jul 05 Javascript
前端开发不得不知的10个最佳ES6特性
Aug 30 Javascript
AngularJS的$location使用方法详解
Oct 19 Javascript
jQuery 禁止表单用户名、密码自动填充功能
Oct 30 jQuery
手写简单的jQuery雪花飘落效果实例
Apr 22 jQuery
Javascript三种字符串连接方式及性能比较
May 28 Javascript
Jquery ajax书写方法代码实例解析
Jun 12 jQuery
原生JS实现音乐播放器
Jan 26 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 根据IP地址控制访问的代码
2010/04/22 PHP
php自动获取目录下的模板的代码
2010/08/08 PHP
PHP插入排序实现代码
2013/04/04 PHP
C#静态方法与非静态方法实例分析
2014/09/22 PHP
新浪SAE搭建PHP项目教程
2015/01/28 PHP
php发送短信验证码完成注册功能
2015/11/24 PHP
PHP信号量基本用法实例详解
2016/02/12 PHP
Yii框架弹出框功能示例
2017/01/07 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
根据地区不同显示时间的javascript代码
2007/08/13 Javascript
event对象的方法 兼容多浏览器
2009/06/27 Javascript
jquery.combobox中文api和例子,修复了上面的小bug
2011/03/28 Javascript
JS.findElementById()使用介绍
2013/09/21 Javascript
js变量、作用域及内存详解
2014/09/23 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
2015/09/06 Javascript
jQuery 全选 全部选 反选 实现代码
2016/08/17 Javascript
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
2017/07/10 Javascript
node.js使用express框架进行文件上传详解
2019/03/03 Javascript
[02:28]DOTA2 2015国际邀请赛中国区预选赛首日现场百态
2015/05/26 DOTA
Python正则表达式如何进行字符串替换实例
2016/12/28 Python
Python3.5.3下配置opencv3.2.0的操作方法
2018/04/02 Python
python获取时间及时间格式转换问题实例代码详解
2018/12/06 Python
python循环嵌套的多种使用方法解析
2019/11/29 Python
Python多线程:主线程等待所有子线程结束代码
2020/04/25 Python
Python利用Faiss库实现ANN近邻搜索的方法详解
2020/08/03 Python
html svg生成环形进度条的实现方法
2019/09/23 HTML / CSS
AP澳洲中文网:澳洲正品直邮,包税收件无忧
2019/07/12 全球购物
男女钓鱼靴和甲板鞋:XTRATUF
2021/01/09 全球购物
大学校园活动策划书
2014/02/04 职场文书
关于感恩的演讲稿800字
2014/08/26 职场文书
酒店端午节活动方案
2014/08/26 职场文书
公司副总经理岗位职责
2014/10/01 职场文书
合伙开公司协议书范本
2014/10/28 职场文书
楚门的世界观后感
2015/06/03 职场文书
2015年小学重阳节活动总结
2015/07/29 职场文书
MySQL 中如何归档数据的实现方法
2022/03/16 SQL Server