原生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 相关文章推荐
解析arp病毒背后利用的Javascript技术附解密方法
Aug 06 Javascript
JS获取页面input控件中所有text控件并追加样式属性
Feb 25 Javascript
解析javascript中鼠标滚轮事件
May 26 Javascript
jQuery焦点图插件SaySlide
Dec 21 Javascript
第九章之路径分页标签与徽章组件
Apr 25 Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
Oct 30 Javascript
JS弹性运动实现方法分析
Dec 15 Javascript
js的OOP继承实现(必看篇)
Feb 18 Javascript
Vuex 进阶之模块化组织详解
Jan 12 Javascript
解决Mac node版本升级失败的问题
May 16 Javascript
node.js读取Excel数据(下载图片)的方法示例
Aug 02 Javascript
js实现缓动动画
Nov 25 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+MySql编写聊天室
2006/10/09 PHP
PHP中遍历stdclass object的实现代码
2011/06/09 PHP
匹配csdn用户数据库与官方用户的重合度并将重叠部分的用户筛选出来
2011/12/25 PHP
php删除文件夹及其文件夹下所有文件的函数代码
2013/01/23 PHP
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
2013/06/14 PHP
smarty模板引擎之分配数据类型
2015/03/30 PHP
Ajax+Jpgraph实现的动态折线图功能示例
2019/02/11 PHP
php中字符串和整数比较的操作方法
2019/06/06 PHP
jQuery Lightbox 图片展示插件使用说明
2010/04/25 Javascript
jquery实现图片渐变切换兼容ie6/Chrome/Firefox
2013/08/02 Javascript
js实现点击后将文字或图片复制到剪贴板的方法
2014/08/04 Javascript
javascript学习笔记(七)Ajax和Http状态码
2014/10/08 Javascript
js实现数组转换成json
2015/06/26 Javascript
详解jQuery uploadify文件上传插件的使用方法
2016/12/16 Javascript
分享一个精简的vue.js 图片lazyload插件实例
2017/03/13 Javascript
Vue.js实现实例搜索应用功能详细代码
2017/08/24 Javascript
JS实现百度搜索接口及链接功能实例代码
2018/02/02 Javascript
Vue表单类的父子组件数据传递示例
2018/05/03 Javascript
解决vue无法侦听数组及对象属性的变化问题
2020/07/17 Javascript
python通过正则查找微博@(at)用户的方法
2015/03/13 Python
Python基于回溯法子集树模板解决找零问题示例
2017/09/11 Python
python如何为创建大量实例节省内存
2018/03/20 Python
Pandas:DataFrame对象的基础操作方法
2018/06/07 Python
Python使用crontab模块设置和清除定时任务操作详解
2019/04/09 Python
详解Python用三种方式统计词频的方法
2019/07/29 Python
在Django admin中编辑ManyToManyField的实现方法
2019/08/09 Python
如何为Python终端提供持久性历史记录
2019/09/03 Python
澳洲在线厨具商店:Kitchen Style
2018/05/05 全球购物
SCHIESSER荷兰官方网站:德国内衣专家
2020/10/09 全球购物
毕业生个人的自我评价优秀范文
2013/10/03 职场文书
化学专业自荐信
2014/05/28 职场文书
工程质量保证书
2015/05/09 职场文书
简历自我评价:教师师德表现自我评价
2019/04/24 职场文书
python实战之一步一步教你绘制小猪佩奇
2021/04/22 Python
纯 CSS 自定义多行省略的问题(从原理到实现)
2021/11/11 HTML / CSS
vue使用refs获取嵌套组件中的值过程
2022/03/31 Vue.js