原生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与jQuery实现隔行变色的方法
Sep 09 Javascript
JavaScript输出所选择起始与结束日期的方法
Jul 12 Javascript
JS判断数组那点事
Oct 10 Javascript
JavaScript适配器模式详解
Oct 19 Javascript
详解如何实现一个简单的Node.js脚手架
Dec 04 Javascript
Vue实现内部组件轮播切换效果的示例代码
Apr 07 Javascript
JavaScript 跨域之POST实现方法
May 07 Javascript
js使用formData实现批量上传
Mar 27 Javascript
浅谈vue后台管理系统权限控制思考与实践
Dec 19 Javascript
AngularJS实现的自定义过滤器简单示例
Feb 02 Javascript
React+Redux实现简单的待办事项列表ToDoList
Sep 29 Javascript
layui清除radio的选中状态实例
Nov 14 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电台频率大全 - 23 四川省
2020/03/11 无线电
Excel数据导入Mysql数据库的实现代码
2008/06/05 PHP
php Memcache 中实现消息队列
2009/11/24 PHP
php递归删除目录下的文件但保留的实例分享
2014/05/10 PHP
PHP页面跳转操作实例分析(header方法)
2016/09/28 PHP
php编程实现简单的网页版计算器功能示例
2017/04/26 PHP
jquery对表单操作2
2011/04/06 Javascript
IE8提示Invalid procedure call or argument 异常的解决方法
2012/09/30 Javascript
你必须知道的JavaScript 变量命名规则详解
2013/05/07 Javascript
window.navigate 与 window.location.href 的使用区别介绍
2013/09/21 Javascript
javascript中使用正则表达式清理table样式的代码
2020/04/01 Javascript
轻松学习jQuery插件EasyUI EasyUI实现树形网络基本操作(2)
2015/11/30 Javascript
jQuery鼠标悬浮链接弹出跟随图片实例代码
2016/01/08 Javascript
学习JavaScript设计模式之模板方法模式
2016/01/20 Javascript
javascript禁止超链接跳转的方法
2016/02/02 Javascript
JS实现兼容各种浏览器的高级拖动方法完整实例【测试可用】
2016/06/21 Javascript
angularJS实现动态添加,删除div方法
2018/02/27 Javascript
vue左侧菜单,树形图递归实现代码
2018/08/24 Javascript
JS获取月的第几周和年的第几周实例代码
2018/12/05 Javascript
用Golang运行JavaScript的实现示例
2019/11/25 Javascript
Python使用Flask框架同时上传多个文件的方法
2015/03/21 Python
研究Python的ORM框架中的SQLAlchemy库的映射关系
2015/04/25 Python
Python中subprocess模块用法实例详解
2015/05/20 Python
Python图算法实例分析
2016/08/13 Python
详解python中字典的循环遍历的两种方式
2017/02/07 Python
python单例模式获取IP代理的方法详解
2018/09/13 Python
PyQt打开保存对话框的方法和使用详解
2019/02/27 Python
python烟花效果的代码实例
2020/02/25 Python
html5 利用canvas手写签名并保存的实现方法
2018/07/12 HTML / CSS
html5使用canvas画三角形
2014/12/15 HTML / CSS
详解移动端Html5页面中1px边框的几种解决方法
2018/07/24 HTML / CSS
欧舒丹澳洲版:L’OCCITANE
2017/07/17 全球购物
工商技校毕业生自荐信
2013/11/15 职场文书
工作疏忽检讨书
2014/01/25 职场文书
质量保证书范本
2014/04/29 职场文书
三方合作意向书范本
2015/05/09 职场文书