原生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 相关文章推荐
捕获关闭窗口的脚本
Jan 10 Javascript
javascript操作html控件实例(javascript添加html)
Dec 02 Javascript
jQuery中val()方法用法实例
Dec 25 Javascript
js代码实现随机颜色的小方块
Jul 30 Javascript
jqGrid中文文档之选项设置
Dec 02 Javascript
简单谈谈JavaScript的同步与异步
Dec 31 Javascript
全面理解闭包机制
Jul 11 Javascript
详解如何去除vue项目中的#——History模式
Oct 13 Javascript
Express系列之multer上传的使用
Oct 27 Javascript
Vue.js用法详解
Nov 13 Javascript
web3.js增加eth.getRawTransactionByHash(txhash)方法步骤
Mar 15 Javascript
js实现继承的方法及优缺点总结
May 08 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
Linux下实现PHP多进程的方法分享
2012/08/16 PHP
php中header跳转使用include包含解决参数丢失问题
2015/05/08 PHP
Yii2前后台分离及migrate使用(七)
2016/05/04 PHP
Centos 6.5系统下编译安装PHP 7.0.13的方法
2016/12/19 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
2019/04/16 PHP
jQuery调用AJAX时Get和post公用的乱码解决方法实例说明
2013/06/04 Javascript
jquery幻灯片插件bxslider样式改进实例
2014/10/15 Javascript
如何调试异步加载页面里包含的js文件
2014/10/30 Javascript
JavaScript插件化开发教程(六)
2015/02/01 Javascript
JavaScript中使用Math.PI圆周率属性的方法
2015/06/14 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
2015/09/06 Javascript
js实现页面跳转的几种方法小结
2016/05/16 Javascript
js 判断各种数据类型的简单方法(推荐)
2016/08/29 Javascript
JS去掉字符串前后空格、阻止表单提交的实现代码
2017/06/08 Javascript
浅谈关于angularJs中使用$.ajax的注意点
2017/08/12 Javascript
vue组件学习教程
2017/09/09 Javascript
详解使用 Node.js 开发简单的脚手架工具
2018/06/08 Javascript
微信小程序url传参写变量的方法
2018/08/09 Javascript
javascript和php使用ajax通信传递JSON的实例
2018/08/21 Javascript
微信小程序如何利用getCurrentPages进行页面传值
2019/07/01 Javascript
关于vue组件事件属性穿透详解
2019/10/28 Javascript
vue中 数字相加为字串转化为数值的例子
2019/11/07 Javascript
[02:26]2016国际邀请赛8月3日开战 中国军团出征西雅图
2016/08/02 DOTA
[54:43]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第一场 2月22日
2021/03/11 DOTA
用Python的urllib库提交WEB表单
2009/02/24 Python
python删除过期文件的方法
2015/05/29 Python
Python常用的内置序列结构(列表、元组、字典)学习笔记
2016/07/08 Python
Python变量和字符串详解
2017/04/29 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
2018/11/06 Python
python argparse模块通过后台传递参数实例
2020/04/20 Python
意大利团购网站:Groupon意大利
2016/10/11 全球购物
纽约著名的服装辅料来源:M&J Trimming
2017/07/26 全球购物
应届生妇产科护士求职信
2013/10/27 职场文书
医院竞聘演讲稿
2014/05/16 职场文书
绿色小区申报材料
2014/08/22 职场文书
vue3使用vuedraggable实现拖拽功能
2022/04/06 Vue.js