原生js实现键盘控制div移动且解决停顿问题


Posted in Javascript onDecember 05, 2016

首先说明下为什么会停顿?

效果 :用键盘控制一个div移动

当按下一个方向键不放,div会先停顿一下,然后才开始持续移动。

原因:系统要区分用户是否连续输入,第一个到第二个之间有一个停顿时间
注:了解原因才能解决问题

效果展示

1.简单控制,但是有停顿

原生js实现键盘控制div移动且解决停顿问题

2.简单控制,解决停顿

原生js实现键盘控制div移动且解决停顿问题

解决方法

方法 :先开一个定时器,让div一直处于(往4个方向)准备移动的状态

初始4个方向的值都是false,div就保持在原地不动。

按下某个方向键,这个方向的值就改变为true,div就会开始往这个方向移动。

松开方向键,这个方向的值就改变为false , div就停止这个方向移动了。

基本移动,但是有挺顿的代码 

<html>
<head>
  <title>键盘控制div移动,会有停顿</title>
  <meta charset="utf-8" />
  <style type="text/css">
    #div1{
        width:100px;
        height:100px;
        background:greenyellow;
        position:absolute;}
  </style>
  <script type="text/javascript">
    window.onload = function(){
      var oDiv = document.getElementById("div1");
      document.onkeydown = function(ev){
        var ev = ev || event;
        var keyCode = ev.keyCode;
        switch(keyCode){
          case 37: oDiv.style.left = oDiv.offsetLeft-10+"px";break;
          case 38: oDiv.style.top = oDiv.offsetTop-10+"px";break;
          case 39: oDiv.style.left = oDiv.offsetLeft+10+"px";break;
          case 40: oDiv.style.top = oDiv.offsetTop+10+"px";break;
        }
      }

    }
  </script>
</head>
<body>
<div id="div1"></div>
</body>
</html

控制移动,解决停顿的问题 

<html>
<head>
  <title>键盘控制div移动并且解决停顿问题</title>
  <meta charset="utf-8" />
  <style type="text/css">

    /*设置div样式*/
    div{
      width:100px;
      height:100px;
      background: #68affc;
      position:absolute;
      left:100px;
      top:100px;
    }
  </style>
  <script>

    //当页面加载完后
    window.onload = function(){

      //获取Div元素
      var oDiv = document.getElementById("div1");

      //创建各个方向条件判断初始变量
      var left = false;
      var right = false;
      var top = false;
      var bottom = false;

      //当按下对应方向键时,对应变量为true
      document.onkeydown = function(ev){
        var oEvent = ev || event;
        var keyCode = oEvent.keyCode;
        switch(keyCode){
          case 37:
            left=true;
            break;
          case 38:
            top=true;
            break;
          case 39:
            right=true;
            break;
          case 40:
            bottom=true;
            break;
        }
      };

      //设置一个定时,时间为50左右,不要太高也不要太低
      setInterval(function(){

        //当其中一个条件为true时,则执行当前函数(移动对应方向)
        if(left){
          oDiv.style.left = oDiv.offsetLeft-10+"px";
        }else if(top){
          oDiv.style.top = oDiv.offsetTop-10+"px";
        }else if(right){
          oDiv.style.left = oDiv.offsetLeft+10+"px";
        }else if(bottom){
          oDiv.style.top = oDiv.offsetTop+10+"px";
        }
      },50);

      //执行完后,所有对应变量恢复为false,保持静止不动
      document.onkeyup = function(ev){
        var oEvent = ev || event;
        var keyCode = oEvent.keyCode;

        switch(keyCode){
          case 37:
            left=false;
            break;
          case 38:
            top=false;
            break;
          case 39:
            right=false;
            break;
          case 40:
            bottom=false;
            break;
        }
      }
    }
  </script>
</head>
<body>
<div id="div1"></div>
</body>
</html>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的工作或者学习能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
Javascript学习笔记7 原型链的原理
Jan 11 Javascript
JS getStyle获取最终样式函数代码
Apr 01 Javascript
JQuery查找DOM节点的方法
Jun 11 Javascript
jquery仿QQ登录账号选择下拉框效果
Mar 22 Javascript
vue动态路由配置及路由传参的方式
May 23 Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
Jul 24 jQuery
详解小程序开发经验:多页面数据同步
May 18 Javascript
Vue指令之 v-cloak、v-text、v-html实例详解
Aug 08 Javascript
JavaScript RegExp 对象用法详解
Sep 24 Javascript
解决Vue项目打包后打开index.html页面显示空白以及图片路径错误的问题
Oct 25 Javascript
vue之组件内监控$store中定义变量的变化详解
Nov 08 Javascript
Vue router传递参数并解决刷新页面参数丢失问题
Dec 02 Vue.js
bootstrap快速制作后台界面
Dec 05 #Javascript
浅谈使用splice函数对数组中的元素进行删除时的注意事项
Dec 04 #Javascript
浅谈js数组和splice的用法
Dec 04 #Javascript
JavaScript注入漏洞的原理及防范(详解)
Dec 04 #Javascript
浅谈html转义及防止javascript注入攻击的方法
Dec 04 #Javascript
jquery select2的使用心得(推荐)
Dec 04 #Javascript
Jquery删除css属性的简单方法
Dec 04 #Javascript
You might like
php+dojo 的数据库保存拖动布局的一个方法dojo 这里下载
2007/03/07 PHP
单一index.php实现PHP任意层级文件夹遍历(Zjmainstay原创)
2012/07/31 PHP
js操作Xml(向服务器发送Xml,处理服务器返回的Xml)(IE下有效)
2009/01/30 Javascript
让你的博文自动带上缩址的实现代码,方便发到微博客上
2010/12/28 Javascript
简单的jquery拖拽排序效果实现代码
2011/09/20 Javascript
博客侧边栏模块跟随滚动条滑动固定效果的实现方法(js+jquery等)
2013/03/24 Javascript
Node.js读取文件内容示例
2017/03/07 Javascript
AngularJS 支付倒计时功能实现思路
2017/06/05 Javascript
angular 内存溢出的问题解决
2018/07/12 Javascript
vscode 开发Vue项目的方法步骤
2018/11/25 Javascript
JavaScript实现获取两个排序数组的中位数算法示例
2019/02/26 Javascript
微信小程序新手教程之页面打开数量限制
2019/03/03 Javascript
JS实现联想、自动补齐国家或地区名称的功能
2020/07/07 Javascript
[08:29]DOTA2每周TOP10 精彩击杀集锦vol.7
2014/06/25 DOTA
[04:17]DOTA2完美盛典,rOtk、BurNIng携手巴图演唱《倔强》
2017/11/28 DOTA
[01:08:32]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第二场 1月18日
2021/03/11 DOTA
python用来获得图片exif信息的库实例分析
2015/03/16 Python
基于Python实现的百度贴吧网络爬虫实例
2015/04/17 Python
在Python中移动目录结构的方法
2016/01/31 Python
python实现批量监控网站
2016/09/09 Python
python if not in 多条件判断代码
2016/09/21 Python
详谈python3中用for循环删除列表中元素的坑
2018/04/19 Python
python之验证码生成(gvcode与captcha)
2019/01/02 Python
Python绘图实现显示中文
2019/12/04 Python
TensorFlow使用Graph的基本操作的实现
2020/04/22 Python
tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)
2020/06/30 Python
在HTML5 canvas里用卷积核进行图像处理的方法
2018/05/02 HTML / CSS
如何强制垃圾回收
2015/10/06 面试题
中英双版中文教师求职信
2013/10/27 职场文书
管理科学大学生求职信
2013/11/13 职场文书
求职简历推荐信范文
2013/12/02 职场文书
大学生学习2014年全国两会心得体会
2014/03/12 职场文书
2015年副班长工作总结
2015/05/15 职场文书
python实现简单区块链结构
2021/04/25 Python
JavaScript事件的委托(代理)的用法示例详解
2022/02/18 Javascript
go goth封装第三方认证库示例详解
2022/08/14 Golang