js实现键盘操作实现div的移动或改变的原理及代码


Posted in Javascript onJune 23, 2014

昨天记录了获取键盘按键的值的事件,有了值,无非就是针对不同值做不同的操作嘛,而且之前曾经在写贪吃蛇时也用到过。结果一?意粒?质呛镁玫囊欢问奔洌??愿芯跤斜匾?锹枷碌模?环矫嫒酚锌扇≈?Γ?硪环矫嬉捕宰约旱奶嵝眩?崭帐迪止?墓δ茏?酚质悄吧?肆耍?艿睦此担?闶俏鹿识??掳伞?/p>

这样我们先来分析,要实现键盘操作实现div的移动大概的原理吧:

*---要实现div的移动,首先最关键的一点:获取div对象

*---postion:absolute将div完全从文档流中拖出啊,这个地方漏掉了,回去看了贪吃蛇才发现的,真晕

*---获取键盘的操作

*---根据键盘的不同操作,给出不同响应

这就是我想起的大概需要注意的地方,还是先来看代码:

先是html部分

<div style="width: 50px;height: 50px;background-color: cyan;position: absolute;" id="showZone">

然后记录下javascript的实际操作

window.onload=function(){ 
var obj=document.getElementById("showZone");//获取到对象了吧,这最简单 
var a=10; 
var toLeft=toRight=toTop=toBottom=false;//定义几个boolean型变量,是为了后面方向操作用的,看是四个方向吧 

var move=setInterval(function(){//这个地方的move定义实际上毫无意义,只是为了让这个方法更明显一点 
if(toLeft){ 
obj.style.left=parseInt(obj.offsetLeft-a)+"px";//感觉最好还是写上parseInt,另外,因为offsetLeft是不含px的,所以不要忘记“px” 
} 
if(toRight){ 
obj.style.left=obj.offsetLeft+a+"px";//不写parseInt也可以,难道是因为javascript的执行顺序?执行+,再执行+,再执行=?实现结果来看是 
} 
if(toTop){ 
obj.style.top=obj.offsetTop-a+"px"; 
} 
if(toBottom){ 
obj.style.top=obj.offsetTop+a+"px"; 
} 
},300); //这个经典的定时器啊,循环执行的大神器,还记得setInterval和settimeout的区别么 
document.onkeydown=function(event){ 
var event=event||window.event; 
switch(event.keyCode){ //哈哈,获取到键盘操作了吧 
case 37:toLeft=true;break;//改变变量,继续执行最初的循环,不让你停不能停啊 
case 38:toTop=true;break; 
case 39:toRight=true;break; 
case 40:toBottom=true;break; 
} 
}; 
document.onkeyup=function(event){ 
switch(event.keyCode){ 
case 37:toLeft=false;break;//给我变回来,让你停就别动了 
case 38:toTop=false;break; 
case 39:toRight=false;break; 
case 40:toBottom=false;break; 
} 
}; 
};

就这样,我们完成了原理分析中的需求,同时也就可以通过上、下、左、右按键来实现div的上下左右移动了,接下来,再来记录下敏感地方吧。

1、div需是absolute的,为这个纠结了半天实在不值得,于是查询了下,了解了一个概念“文档流”,

文档流,通常说是元素从上而下,自左向右进行排列,那么这个元素就是节点元素,庞大的dom啊。还是先来说说其它解释吧,我比较喜欢的是这样来阐述:文档+流,文档顾名思义就是说网页文档,而流则是输出方式,还有的解释说是浏览器的解析方式,这个貌似更形象一点,正常的文档流,就好像是一个平面,而一个元素你把它放在哪了,它就在哪,而浮动、固定定位和相对定位,这里分析absolute,就是重新生成了一个流,脱离了它的父层标签,就好像之前z-index为0,而这个的z-index就上了它的上面,凭空悬浮在它上面的,可以通过left、top来肆意的挪动它。

大概意思能够明白了,但是感觉有些地方还是没法有效的用语言来表述,而且有些点略微有些模糊,相信随着经验的累积,我能理解的更深一些。

2、keyCode这里的大写,onkeyup和onkeydown这里的小写,在这个地方也是测试了下才发现的问题,对于javascript,每个小地方都是大问题啊;

3、switch里的break;这个java里面就常碰到,就不多说了

大概的问题就是以上几点,而你还记得注释的快捷键么,还记得其他快捷键么,这就出现了一个问题,上面做出响应的我们只是针对单个按键,如果我们想用一些快捷键呢,该怎么设置呢?

先来看下代码:

document.onkeydown=function(event){//还是跟上面差不多的代码吧,你看出不同在哪里了么 
var event=event||window.event; 
var bctrl=event.ctrlKey;//在这里 
switch(event.keyCode){ 
case 37:toLeft=true;break; 
case 38:if(bctrl){obj.style.background="yellow";break;}toTop=true;break;//在这里, 
case 39:toRight=true;break; 
case 40:toBottom=true;break; 
} 
};

这里碰到了event对象的另一个属性,是在keyCode之外的另一个,ctrlKey,还是大写哦,它的主要功能是检查ctrl按键的状态,其实这样的还有两个:

altKey和shiftKey,分别是对alt按键和shift按键状态的检查,这样知道怎么设个快捷键了吧。

其实如果是我自己写的话,可能这样我就已经很满足了,但是在翻阅搜索的时候,总能碰到心思缜密的朋友

附上代码,你知道是要做什么么:

function limit(){ 
var doc = [document.documentElement.clientWidth, document.documentElement.clientHeight] 
//防止左侧溢出 
obj.offsetLeft <=0 && (<span style="font-family: Arial, Helvetica, sans-serif;">obj</span><span style="font-family: Arial, Helvetica, sans-serif;">.style.left = 0);</span> 
//防止顶部溢出 
obj.offsetTop <=0 && (obj.style.top = 0); 
//防止右侧溢出 
doc[0] - obj.offsetLeft - obj.offsetWidth <= 0 && (obj.style.left = doc[0] - obj.offsetWidth + "px"); 
//防止底部溢出 
doc[1] - obj.offsetTop - obj.offsetHeight <= 0 && (obj.style.top = doc[1] - obj.offsetHeight + "px") 
}

这里我附上的是网上的代码在实现防止溢出的同时,我还想赞一下这个写法,比我写的果断的要短了许多许多,以后也要试着写短点。

Javascript 相关文章推荐
Javascript拓展String方法小结
Jul 08 Javascript
如何在node的express中使用socket.io
Dec 15 Javascript
深入理解JavaScript系列(48):对象创建模式(下篇)
Mar 04 Javascript
在JavaScript中处理时间之getHours()方法的使用
Jun 10 Javascript
JS+CSS实现的简单折叠展开多级菜单效果
Sep 12 Javascript
基于JavaScript判断浏览器到底是关闭还是刷新(超准确)
Feb 01 Javascript
JavaScript根据CSS的Media Queries来判断浏览设备的方法
May 10 Javascript
JavaScript之WebSocket技术详解
Nov 18 Javascript
JS组件系列之JS组件封装过程详解
Apr 28 Javascript
Vue Cli与BootStrap结合实现表格分页功能
Aug 18 Javascript
Angularjs添加排序查询功能的实例代码
Oct 24 Javascript
JavaScript中clientWidth,offsetWidth,scrollWidth的区别
Jan 25 Javascript
JavaScript-RegExp对象只能使用一次问题解决方法
Jun 23 #Javascript
jquery中map函数与each函数的区别实例介绍
Jun 23 #Javascript
jQuery学习笔记之 Ajax操作篇(二) - 数据传递
Jun 23 #Javascript
jQuery学习笔记之 Ajax操作篇(一) - 数据加载
Jun 23 #Javascript
jquery让返回的内容显示在特定div里(代码少而精悍)
Jun 23 #Javascript
yepnope.js使用详解及示例分享
Jun 23 #Javascript
js的延迟执行问题分析
Jun 23 #Javascript
You might like
用PHP 快速生成 Flash 动画的方法
2007/03/06 PHP
PHP与MongoDB简介|安全|M+PHP应用实例详解
2013/06/17 PHP
php中\r \r\n \t的区别示例介绍
2014/02/08 PHP
php计算两个整数的最大公约数常用算法小结
2015/03/05 PHP
php基于session实现数据库交互的类实例
2015/08/03 PHP
PHP date_default_timezone_set()设置时区操作实例分析
2020/05/16 PHP
改善你的jQuery的25个步骤 千倍级效率提升
2010/02/11 Javascript
addEventListener()第三个参数useCapture (Boolean)详细解析
2013/11/07 Javascript
限制上传文件大小和格式的jQuery插件实例
2015/01/24 Javascript
knockoutjs动态加载外部的file作为component中的template数据源的实现方法
2016/09/01 Javascript
Knockout结合Bootstrap创建动态UI实现产品列表管理
2016/09/14 Javascript
JavaScript中关于iframe滚动条的去除和保留
2016/11/17 Javascript
正则表达式替换html元素属性的方法
2016/11/26 Javascript
ajax异步请求详解
2017/01/06 Javascript
JS实现的简单图片切换功能示例【测试可用】
2017/02/14 Javascript
iframe与主框架跨域相互访问实现方法
2017/09/14 Javascript
JS生成随机打乱数组的方法示例
2017/12/23 Javascript
解决Mac下安装nmp的淘宝镜像失败问题
2018/05/16 Javascript
微信小程序表单验证插件WxValidate的二次封装功能(终极版)
2019/09/03 Javascript
jquery实现商品sku多属性选择功能(商品详情页)
2019/12/20 jQuery
three.js着色器材质的内置变量示例详解
2020/08/16 Javascript
[40:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs TNC
2018/04/01 DOTA
[50:15]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python卸载模块的方法汇总
2016/06/07 Python
Python 多线程的实例详解
2017/09/07 Python
python django使用haystack:全文检索的框架(实例讲解)
2017/09/27 Python
python中dict使用方法详解
2019/07/17 Python
django 通过URL访问上传的文件方法
2019/07/28 Python
解决Tensorflow占用GPU显存问题
2020/02/03 Python
Python urlencode和unquote函数使用实例解析
2020/03/31 Python
pandas 像SQL一样使用WHERE IN查询条件说明
2020/06/05 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
2021/03/03 Python
美国百货齐全的精品网站,提供美式风格的产品:Overstock.com
2016/07/22 全球购物
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
施华洛世奇巴西官网:SWAROVSKI巴西
2019/12/03 全球购物
计算机网络及管理学专业求职信
2014/06/05 职场文书