UDN-企业互联网技术人气社区

板块导航

浏览  : 719
回复  : 2

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

[复制链接]
牛娜的头像 楼主
发表于 2017-1-8 14:00:23 | 显示全部楼层 |阅读模式
  实现键盘操作实现div的移动,最关键的一点:获取div对象,下面有个不错的示例,大家可以参考下

  昨天记录了获取键盘按键的值的事件,有了值,无非就是针对不同值做不同的操作嘛,而且之前曾经在写贪吃蛇时也用到过。结果一捯饬,又是好久的一段时间,所以感觉有必要记录下的,一方面确有可取之处,另一方面也对自己的提醒,刚刚实现过的功能转头又是陌生人了,总的来说,算是温故而知新吧。
  
  这样我们先来分析,要实现键盘操作实现div的移动大概的原理吧:
  
  *---要实现div的移动,首先最关键的一点:获取div对象
  
  *---postion:absolute将div完全从文档流中拖出啊,这个地方漏掉了,回去看了贪吃蛇才发现的,真晕
  
  *---获取键盘的操作
  
  *---根据键盘的不同操作,给出不同响应
  
  这就是我想起的大概需要注意的地方,还是先来看代码:
  
  先是html部分  
  
  1. <div style="width: 50px;height: 50px;background-color: cyan;position: absolute;" id="showZone">
复制代码
  
  然后记录下JavaScript的实际操作
  1. window.onload=function(){
  2. var obj=document.getElementById("showZone");//获取到对象了吧,这最简单
  3. var a=10;
  4. var toLeft=toRight=toTop=toBottom=false;//定义几个boolean型变量,是为了后面方向操作用的,看是四个方向吧

  5. var move=setInterval(function(){//这个地方的move定义实际上毫无意义,只是为了让这个方法更明显一点
  6. if(toLeft){
  7. obj.style.left=parseInt(obj.offsetLeft-a)+"px";//感觉最好还是写上parseInt,另外,因为offsetLeft是不含px的,所以不要忘记“px”
  8. }
  9. if(toRight){
  10. obj.style.left=obj.offsetLeft+a+"px";//不写parseInt也可以,难道是因为JavaScript的执行顺序?执行+,再执行+,再执行=?实现结果来看是
  11. }
  12. if(toTop){
  13. obj.style.top=obj.offsetTop-a+"px";
  14. }
  15. if(toBottom){
  16. obj.style.top=obj.offsetTop+a+"px";
  17. }
  18. },300); //这个经典的定时器啊,循环执行的大神器,还记得setInterval和settimeout的区别么
  19. document.onkeydown=function(event){
  20. var event=event||window.event;
  21. switch(event.keyCode){ //哈哈,获取到键盘操作了吧
  22. case 37:toLeft=true;break;//改变变量,继续执行最初的循环,不让你停不能停啊
  23. case 38:toTop=true;break;
  24. case 39:toRight=true;break;
  25. case 40:toBottom=true;break;
  26. }
  27. };
  28. document.onkeyup=function(event){
  29. switch(event.keyCode){
  30. case 37:toLeft=false;break;//给我变回来,让你停就别动了
  31. case 38:toTop=false;break;
  32. case 39:toRight=false;break;
  33. case 40:toBottom=false;break;
  34. }
  35. };
  36. };
复制代码

  就这样,我们完成了原理分析中的需求,同时也就可以通过上、下、左、右按键来实现div的上下左右移动了,接下来,再来记录下敏感地方吧。
  
  1、div需是absolute的,为这个纠结了半天实在不值得,于是查询了下,了解了一个概念“文档流”,
  
  文档流,通常说是元素从上而下,自左向右进行排列,那么这个元素就是节点元素,庞大的dom啊。还是先来说说其它解释吧,我比较喜欢的是这样来阐述:文档+流,文档顾名思义就是说网页文档,而流则是输出方式,还有的解释说是浏览器的解析方式,这个貌似更形象一点,正常的文档流,就好像是一个平面,而一个元素你把它放在哪了,它就在哪,而浮动、固定定位和相对定位,这里分析absolute,就是重新生成了一个流,脱离了它的父层标签,就好像之前z-index为0,而这个的z-index就上了它的上面,凭空悬浮在它上面的,可以通过left、top来肆意的挪动它。
  
  大概意思能够明白了,但是感觉有些地方还是没法有效的用语言来表述,而且有些点略微有些模糊,相信随着经验的累积,我能理解的更深一些。
  
  2、keyCode这里的大写,onkeyup和onkeydown这里的小写,在这个地方也是测试了下才发现的问题,对于JavaScript,每个小地方都是大问题啊;
  
  3、switch里的break;这个java里面就常碰到,就不多说了
  
  大概的问题就是以上几点,而你还记得注释的快捷键么,还记得其他快捷键么,这就出现了一个问题,上面做出响应的我们只是针对单个按键,如果我们想用一些快捷键呢,该怎么设置呢?
  
  先来看下代码:
  1. document.onkeydown=function(event){//还是跟上面差不多的代码吧,你看出不同在哪里了么
  2. var event=event||window.event;
  3. var bctrl=event.ctrlKey;//在这里
  4. switch(event.keyCode){
  5. case 37:toLeft=true;break;
  6. case 38:if(bctrl){obj.style.background="yellow";break;}toTop=true;break;//在这里,
  7. case 39:toRight=true;break;
  8. case 40:toBottom=true;break;
  9. }
  10. };
复制代码

  这里碰到了event对象的另一个属性,是在keyCode之外的另一个,ctrlKey,还是大写哦,它的主要功能是检查ctrl按键的状态,其实这样的还有两个:
  
  altKey和shiftKey,分别是对alt按键和shift按键状态的检查,这样知道怎么设个快捷键了吧。
  
  其实如果是我自己写的话,可能这样我就已经很满足了,但是在翻阅搜索的时候,总能碰到心思缜密的朋友
  
  附上代码,你知道是要做什么么:
  1. function limit(){
  2. var doc = [document.documentElement.clientWidth, document.documentElement.clientHeight]
  3. //防止左侧溢出
  4. 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>
  5. //防止顶部溢出
  6. obj.offsetTop <=0 && (obj.style.top = 0);
  7. //防止右侧溢出
  8. doc[0] - obj.offsetLeft - obj.offsetWidth <= 0 && (obj.style.left = doc[0] - obj.offsetWidth + "px");
  9. //防止底部溢出
  10. doc[1] - obj.offsetTop - obj.offsetHeight <= 0 && (obj.style.top = doc[1] - obj.offsetHeight + "px")
  11. }
复制代码

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

相关帖子

发表于 2017-1-8 14:00:54 来自手机 | 显示全部楼层
还是挺有借鉴意义的
使用道具 举报

回复

发表于 2017-1-9 19:40:56 | 显示全部楼层
Very Good!
使用道具 举报

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部