原生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 相关文章推荐
鼠标经过的文本框textbox变色
May 21 Javascript
Jquery ui css framework
Jun 28 Javascript
js遍历td tr等html元素
Dec 13 Javascript
jQuery动画animate方法使用介绍
May 06 Javascript
深入理解js中this的用法
May 28 Javascript
js与applet相互调用的方法
Jun 22 Javascript
利用JS实现数字增长
Jul 28 Javascript
js提示框替代系统alert,自动关闭alert对话框的实现方法
Nov 07 Javascript
前端面试知识点锦集(JavaScript篇)
Dec 28 Javascript
原生JS实现循环Nodelist Dom列表的4种方式示例
Feb 11 Javascript
vue使用keep-alive实现组件切换时保存原组件数据方法
Oct 30 Javascript
在HTML中使用JavaScript的两种方法
Dec 24 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
基于PHP生成静态页的实现方法
2013/05/10 PHP
PHP获取服务器端信息的方法
2014/11/28 PHP
laravel添加前台跳转成功页面示例
2019/10/22 PHP
Javascript合并表格中具有相同内容单元格示例
2013/08/11 Javascript
jquery easyui中treegrid用法的简单实例
2014/02/18 Javascript
《JavaScript函数式编程》读后感
2015/08/07 Javascript
通过JS和PHP两种方法判断用户请求时使用的浏览器类型
2016/09/01 Javascript
JavaScript中三个等号和两个等号的区别(== 和 ===)浅析
2016/09/22 Javascript
原生JS实现简单放大镜效果
2017/02/08 Javascript
JS实现复选框的全选和批量删除功能
2017/04/05 Javascript
详解基于webpack2.x的vue2.x的多页面站点
2017/08/21 Javascript
nodejs实现获取本地文件夹下图片信息功能示例
2019/06/22 NodeJs
easyUI 实现的后台分页与前台显示功能示例
2020/06/01 Javascript
python执行外部程序的常用方法小结
2015/03/21 Python
python执行等待程序直到第二天零点的方法
2015/04/23 Python
在Python的web框架中中编写日志列表的教程
2015/04/30 Python
pandas数据框,统计某列数据对应的个数方法
2018/04/11 Python
Python利用pandas计算多个CSV文件数据值的实例
2018/04/19 Python
Kali Linux安装ipython2 和 ipython3的方法
2019/07/11 Python
python 的 openpyxl模块 读取 Excel文件的方法
2019/09/09 Python
python3反转字符串的3种方法(小结)
2019/11/07 Python
python通过opencv实现图片裁剪原理解析
2020/01/19 Python
python对指定字符串逆序的6种方法(小结)
2020/04/02 Python
python和php学习哪个更有发展
2020/06/17 Python
python 从list中随机取值的方法
2020/11/16 Python
Python实例教程之检索输出月份日历表
2020/12/16 Python
法国足球商店:Footcenter
2019/07/06 全球购物
StringBuilder和String的区别
2015/05/18 面试题
专业毕业生个性的自我评价
2013/10/03 职场文书
基层工作经历证明
2014/01/13 职场文书
带薪年假请假条
2014/02/04 职场文书
市场拓展计划书
2014/05/03 职场文书
环保志愿者活动总结
2014/06/27 职场文书
学校政风行风自查自纠报告
2014/10/21 职场文书
碧霞祠导游词
2015/02/09 职场文书
Spring Data JPA框架持久化存储数据到数据库
2022/04/28 Java/Android