原生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 相关文章推荐
JS input 数字验证代码
Jul 30 Javascript
.net,js捕捉文本框回车键事件的小例子(兼容多浏览器)
Mar 11 Javascript
node.js中的fs.readlink方法使用说明
Dec 17 Javascript
JS仿iGoogle自定义首页模块拖拽特效的方法
Feb 13 Javascript
PhotoShop给图片自动添加边框及EXIF信息的JS脚本
Feb 15 Javascript
javascript使用Promise对象实现异步编程
Mar 01 Javascript
jquery仿QQ登录账号选择下拉框效果
Mar 22 Javascript
微信小程序中使用自定义图标(阿里icon)的方法
Aug 20 Javascript
在Vue methods中调用filters里的过滤器实例
Aug 30 Javascript
使用layui+ajax实现简单的菜单权限管理及排序的方法
Sep 10 Javascript
js异步接口并发数量控制的方法示例
Nov 22 Javascript
ESLint 是如何检查 .vue 文件的
Nov 30 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
解析thinkphp中的导入文件标签
2013/06/20 PHP
PHP+jquery实时显示网站在线人数的方法
2015/01/04 PHP
PHP处理postfix邮件内容的方法
2015/06/16 PHP
php微信公众号开发模式详解
2016/11/28 PHP
解析js中获得父窗口链接getParent方法以及各种打开窗口的方法
2013/06/19 Javascript
JS防止用户多次提交的简单代码
2013/08/01 Javascript
js实现的动画导航菜单效果代码
2015/09/10 Javascript
常用jQuery选择器汇总
2017/02/02 Javascript
详解vue-router基本使用
2017/04/18 Javascript
详解angular笔记路由之angular-router
2017/09/12 Javascript
springMvc 前端用json的方式向后台传递对象数组方法
2018/08/07 Javascript
基于Vue-Cli 打包自动生成/抽离相关配置文件的实现方法
2018/12/09 Javascript
Javascript的this详解
2019/03/23 Javascript
node实现socket链接与GPRS进行通信的方法
2019/05/20 Javascript
微信小程序自定义弹窗实现详解(可通用)
2019/07/04 Javascript
js实现二级联动简单实例
2020/01/11 Javascript
Postman如何实现参数化执行及断言处理
2020/07/28 Javascript
toString.call()通用的判断数据类型方法示例
2020/08/28 Javascript
vue print.js打印支持Echarts图表操作
2020/11/13 Javascript
Vue实现简单计算器
2021/01/20 Vue.js
详解JavaScript编程中的window与window.screen对象
2015/10/26 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
2018/12/17 Python
树莓派动作捕捉抓拍存储图像脚本
2019/06/22 Python
12个步骤教你理解Python装饰器
2019/07/01 Python
Django配置文件代码说明
2019/12/04 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
2019/12/18 Python
详解python的变量缓存机制
2021/01/24 Python
Python3使用Selenium获取session和token方法详解
2021/02/16 Python
html5触摸事件判断滑动方向的实现
2018/06/05 HTML / CSS
html5图片上传预览示例分享
2014/04/14 HTML / CSS
html5录音功能实战示例
2019/03/25 HTML / CSS
美国一家主营日韩美妆护肤品的在线商店:iMomoko
2016/09/11 全球购物
教师爱岗敬业演讲稿
2014/05/05 职场文书
初中毕业典礼演讲稿
2014/09/09 职场文书
万能检讨书2000字
2014/10/17 职场文书
spring boot中nativeQuery的用法
2021/07/26 Java/Android