原生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 相关文章推荐
JQuery 学习笔记 选择器之四
Jul 23 Javascript
asp.net 30分钟掌握无刷新 Repeater
Sep 16 Javascript
JavaScript中使用指数方法Math.exp()的简介
Jun 15 Javascript
jQuery+css实现的切换图片功能代码
Jan 27 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
Feb 17 Javascript
浅谈angularjs中响应回车事件
Apr 24 Javascript
vue小白入门教程
Apr 02 Javascript
使用Nuxt.js改造已有项目的方法
Aug 07 Javascript
微信小程序学习笔记之表单提交与PHP后台数据交互处理图文详解
Mar 28 Javascript
微信小程序自定义导航栏实例代码
Apr 05 Javascript
基于JQuery和DWR实现异步数据传递
Oct 16 jQuery
Html5生成验证码的示例代码
May 10 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时间戳使用实例代码
2008/06/07 PHP
PHP 多维数组排序(usort,uasort)
2010/06/30 PHP
PHP5常用函数列表(分享)
2013/06/07 PHP
Zend Framework框架之Zend_Mail实现发送Email邮件验证功能及解决标题乱码的方法
2016/03/21 PHP
PHP rmdir()函数的用法总结
2019/07/02 PHP
经验几则 推荐
2006/09/05 Javascript
javascript实现焦点滚动图效果 具体方法
2013/06/24 Javascript
JavaScript之AOP编程实例
2015/07/17 Javascript
防止Node.js中错误导致进程阻塞的办法
2016/08/11 Javascript
Bootstrap使用基础教程详解
2016/09/05 Javascript
Angular实现预加载延迟模块的示例
2017/10/12 Javascript
angular 数据绑定之[]和{{}}的区别
2018/09/25 Javascript
VUE路由动态加载实例代码讲解
2019/08/26 Javascript
原生js实现3D轮播图
2020/03/21 Javascript
vue遍历生成的输入框 绑定及修改值示例
2019/10/30 Javascript
重置Redux的状态数据的方法实现
2019/11/18 Javascript
python的文件操作方法汇总
2017/11/10 Python
解决vscode python print 输出窗口中文乱码的问题
2018/12/03 Python
Django框架下静态模板的继承操作示例
2019/11/08 Python
Python 脚本拉取 Docker 镜像问题
2019/11/10 Python
opencv python Canny边缘提取实现过程解析
2020/02/03 Python
Keras 在fit_generator训练方式中加入图像random_crop操作
2020/07/03 Python
python中如何使用虚拟环境
2020/10/14 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
2020/11/24 Python
Autopep8的使用(python自动编排工具)
2021/03/02 Python
CSS3实现各种图形的示例代码
2016/10/19 HTML / CSS
应聘自荐书
2013/10/08 职场文书
小小商店教学反思
2014/04/27 职场文书
抵押贷款承诺书
2014/05/30 职场文书
师范生求职信
2014/06/14 职场文书
户籍证明书标准模板
2014/09/10 职场文书
旷课检讨书500字
2014/10/14 职场文书
保安2014年终工作总结
2014/12/06 职场文书
2015年个人工作总结报告
2015/04/25 职场文书
SQL之各种join小结详细讲解
2021/08/04 MySQL
Python测试框架pytest核心库pluggy详解
2022/08/05 Golang