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开源框架-jQuery使用手册(1)
Mar 10 Javascript
讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别
Apr 12 Javascript
jQuery 注意事项 与原因分析
Apr 24 Javascript
javascript 表格内容排序 简单操作示例代码
Jan 03 Javascript
jQuery获得内容和属性示例代码
Jan 16 Javascript
js弹出确认是否删除对话框
Mar 27 Javascript
JavaScript获取文本框内选中文本的方法
Feb 20 Javascript
Js 获取当前函数参数对象的实现代码
Jun 20 Javascript
浅谈JS函数节流防抖
Oct 18 Javascript
JavaScript面试技巧之数组的一些不low操作
Mar 22 Javascript
vue接入腾讯防水墙代码
May 07 Javascript
Vue程序调试的方法
Jun 17 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/12/06 PHP
PHP中调用ASP.NET的WebService的代码
2011/04/22 PHP
PHP文件大小格式化函数合集
2014/03/10 PHP
20个2014年最优秀的PHP框架回顾
2014/10/22 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
2016/04/20 PHP
Yii2实现上下联动下拉框功能的方法
2016/08/10 PHP
JS 参数传递的实际应用代码分析
2009/09/13 Javascript
jQuery 一个图片切换的插件
2011/10/09 Javascript
JS解析XML文件和XML字符串详解
2015/04/17 Javascript
js实现点击图片自动提交action的简单方法
2016/10/16 Javascript
vue-cli 3.x 修改dist路径的方法
2018/09/19 Javascript
JS返回页面时自动回滚到历史浏览位置
2018/09/26 Javascript
Angular6 发送手机验证码按钮倒计时效果实现方法
2019/01/08 Javascript
微信小程序实现商城倒计时
2020/11/01 Javascript
防止Layui form表单重复提交的实现方法
2019/09/10 Javascript
Element Collapse 折叠面板的使用方法
2020/07/26 Javascript
JS可断点续传文件上传实现代码解析
2020/07/30 Javascript
python快速查找算法应用实例
2014/09/26 Python
Python动态加载模块的3种方法
2014/11/22 Python
Django发送html邮件的方法
2015/05/26 Python
Django中URLconf和include()的协同工作方法
2015/07/20 Python
Linux下python与C++使用dlib实现人脸检测
2018/06/29 Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
2019/03/05 Python
利用python实现周期财务统计可视化
2019/08/25 Python
Python字典底层实现原理详解
2019/12/18 Python
New Balance澳大利亚官网:运动鞋和健身服装
2019/02/23 全球购物
房地产财务管理制度
2014/02/02 职场文书
补充协议书范本
2014/04/23 职场文书
2014财务人员自我评价范文
2014/09/21 职场文书
党内外群众意见范文
2015/06/02 职场文书
英语读书笔记
2015/07/02 职场文书
90条交通安全宣传标语
2019/10/12 职场文书
Nginx+Tomcat实现负载均衡、动静分离的原理解析
2021/03/31 Servers
python 如何将两个实数矩阵合并为一个复数矩阵
2021/05/19 Python
SQLServer中JSON文档型数据的查询问题解决
2021/06/27 SQL Server
MySQL分区以及建索引的方法总结
2022/04/13 MySQL