原生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 相关文章推荐
JSON序列化与解析原生JS方法且IE6和chrome测试通过
Sep 05 Javascript
JQuery以JSON方式提交数据到服务端示例代码
May 05 Javascript
js控制网页背景音乐播放与停止的方法
Feb 06 Javascript
js实现非常简单的焦点图切换特效实例
May 07 Javascript
JS+CSS实现带小三角指引的滑动门效果
Sep 22 Javascript
AngularJS向后端ASP.NET API控制器上传文件
Feb 03 Javascript
使用PBFunc在Powerbuilder中支付宝当面付款功能
Oct 01 Javascript
BootStrap实现鼠标悬停下拉列表功能
Feb 17 Javascript
使用JS 插件qrcode.js生成二维码功能
Feb 20 Javascript
Layui表格行工具事件与数据回填方法
Sep 13 Javascript
vue设置默认首页的操作
Aug 12 Javascript
Vue插槽_特殊特性slot,slot-scope与指令v-slot说明
Sep 04 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多维数组去掉重复值示例分享
2014/03/02 PHP
php实现数组中索引关联数据转换成json对象的方法
2015/07/08 PHP
浅谈PHP中的面向对象OOP中的魔术方法
2017/06/12 PHP
解决laravel5中auth用户登录其他页面获取不到登录信息的问题
2019/10/08 PHP
javascript 支持链式调用的异步调用框架Async.Operation
2009/08/04 Javascript
改善用户体验的五款jQuery插件分享
2011/05/22 Javascript
js修改table中Td的值(定义td的双击事件)
2013/01/10 Javascript
Js操作树节点自动折叠展开的几种方法
2014/05/05 Javascript
Javascript调用函数方法的几种方式介绍
2015/03/20 Javascript
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
JavaScript常用代码书写规范的超全面总结
2016/09/11 Javascript
完美解决JS文件页面加载时的阻塞问题
2016/12/18 Javascript
解决jQuery ajax动态新增节点无法触发点击事件的问题
2017/05/24 jQuery
详解Vue源码中一些util函数
2019/04/24 Javascript
Element-ui中元素滚动时el-option超出元素区域的问题
2019/05/30 Javascript
Node.JS枚举统计当前文件夹和子目录下所有代码文件行数
2019/08/23 Javascript
vue v-on:click传递动态参数的步骤
2020/09/11 Javascript
vue 中this.$set 动态绑定数据的案例讲解
2021/01/29 Vue.js
python读写文件操作示例程序
2013/12/02 Python
python定时按日期备份MySQL数据并压缩
2019/04/19 Python
python lambda表达式在sort函数中的使用详解
2019/08/28 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
2020/02/21 Python
实例讲解CSS3中的border-radius属性
2015/08/18 HTML / CSS
CSS3制作彩色进度条样式的代码示例分享
2016/06/23 HTML / CSS
Lookfantastic挪威官网:英国知名美妆购物网站
2017/07/26 全球购物
高级文秘工作总结的自我评价
2013/09/28 职场文书
入党申请人的自我鉴定
2013/12/01 职场文书
超市5.1促销活动
2014/01/15 职场文书
自我鉴定注意事项
2014/01/19 职场文书
清洁工岗位职责
2014/01/29 职场文书
写字楼租赁意向书
2014/07/30 职场文书
趣味运动会广播稿
2014/09/13 职场文书
顶岗实习协议书
2015/01/29 职场文书
体育个人工作总结
2015/02/09 职场文书
2015年党员公开承诺事项
2015/04/27 职场文书
Redis如何一键部署脚本
2021/04/12 Redis