原生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 常见对象类创建代码与优缺点分析
Dec 07 Javascript
jQuery动态添加的元素绑定事件处理函数代码
Aug 02 Javascript
日历查询的算法 如何计算某一天是星期几
Dec 12 Javascript
js调用css属性写法
Sep 21 Javascript
jQuery 插件开发指南
Nov 14 Javascript
AngularJs实现ng1.3+表单验证
Dec 10 Javascript
详解JavaScript的另类写法
Apr 11 Javascript
jQuery使用getJSON方法获取json数据完整示例
Sep 13 Javascript
Bootstrap Search Suggest使用例子
Dec 21 Javascript
js阻止移动端页面滚动的两种方法
Jan 25 Javascript
React数据传递之组件内部通信的方法
Dec 31 Javascript
基于vue实现探探滑动组件功能
May 29 Javascript
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
全国FM电台频率大全 - 14 江西省
2020/03/11 无线电
松下Panasonic RF-B65电路分析
2021/03/02 无线电
PHP删除目录及目录下所有文件的方法详解
2013/06/06 PHP
PHP中session变量的销毁
2014/02/27 PHP
在win7中搭建Linux+PHP 开发环境
2014/10/08 PHP
php获取数据库中数据的实现方法
2017/06/01 PHP
jQuery延迟加载图片插件Lazy Load使用指南
2015/03/25 Javascript
JavaScript判断是否为数组的3种方法及效率比较
2015/04/01 Javascript
WordPress中鼠标悬停显示和隐藏评论及引用按钮的实现
2016/01/12 Javascript
Vue.js Ajax动态参数与列表显示实现方法
2016/10/20 Javascript
JQuery查找子元素find()和遍历集合each的方法总结
2017/03/07 Javascript
基于JavaScript中字符串的match与replace方法(详解)
2017/12/04 Javascript
浅析Vue项目中使用keep-Alive步骤
2018/07/27 Javascript
微信小程序动态增加按钮组件
2018/09/14 Javascript
玩转Koa之核心原理分析
2018/12/29 Javascript
JavaScript实现沿五角星形线摆动的小圆实例详解
2020/07/28 Javascript
JavaScript Dom实现轮播图原理和实例
2021/02/19 Javascript
Python实现字典的key和values的交换
2015/08/04 Python
日常整理python执行系统命令的常见方法(全)
2015/10/22 Python
简单谈谈Python中的元祖(Tuple)和字典(Dict)
2017/04/21 Python
Python数据报表之Excel操作模块用法分析
2019/03/11 Python
Django处理多用户类型的方法介绍
2019/05/18 Python
解析python的局部变量和全局变量
2019/08/15 Python
Django中文件上传和文件访问微项目的方法
2020/04/27 Python
Python 如何实现访问者模式
2020/07/28 Python
纯CSS3制作的鼠标悬停时边框旋转
2017/01/03 HTML / CSS
西班牙国家航空官方网站:Iberia
2017/11/16 全球购物
Airbnb爱彼迎官网:成为爱彼迎房东,赚取收入
2019/03/14 全球购物
药学专业个人的自我评价
2013/12/31 职场文书
组织关系转移介绍信
2014/01/16 职场文书
库房保管员岗位职责
2014/04/07 职场文书
药店收银员岗位职责
2015/04/07 职场文书
Redis如何实现分布式锁
2021/08/23 Redis
Python 的演示平台支持 WSGI 接口的应用
2022/04/20 Python
Vue OpenLayer 为地图绘制风场效果
2022/04/24 Vue.js
python中 Flask Web 表单的使用方法
2022/05/20 Python