HTML:用键盘实现元素的方向移动

27 篇文章 0 订阅
25 篇文章 0 订阅

案例:div的方向移动

body部分:

 <div id="ok">✈</div>

style样式:自己设置大小灯样式,其中最重要的是要元素脱离文档流---不占页面位置了,其下也可以放其他元素。

 #ok {position: absolute;  }

补absolute:它的参照物是最近使用了定位的父级,如果没有找body。

此案例中div id="ok"的父级就是body。

首先:我们需要知道怎样将键盘中的按键与元素/对象相联系,能控制它。

这就是JS键盘事件(详细介绍在最后)。

Left arrow(左箭头键)37Top arrow(上箭头键)38

Rigth arrow(右箭头键)

39Down arrow(下箭头键) 

40

其次:在页面中的位置,距离应该怎么控制。这就用到javascript中offsetLeft和offsetTop了。

例:offsetLeft:

此属性可以返回当前元素距离某个父辈元素左边缘的距离,当然这个父辈元素也是有讲究的。

(1).如果父辈元素中有定位的元素,那么就返回距离当前元素最近的定位元素边缘的距离。
(2).如果父辈元素中没有定位元素,那么就返回相对于body左边缘距离。

语法结构:

obj.offsetleft:此属性是只读的,不能够赋值。

ps:js中的offsetLeft属性具体有什么作用?

可以判断一个物体的跟document的左边距离,也就是浏览器左边缘。当然你也可以用它给对象赋值,offset不单单只有Left 还有offsetTop ,offsetWidth, offsetHeight 都是JS里很有用的属性。

script内容:

错误示范:

  
    var dOk = document.getElementById("ok");//获取元素
    window.onkeydown = function (e) {  //键盘按下的时候,判断事件
        var l = dOk.offsetLeft;  //定义与浏览器的左边距
        var t = dOk.offsetTop;//定义与浏览器的顶部的距离
        
        if (e.keyCode === 37) {
            l -= 5;
        } else if (e.keyCode === 38) {
            t -= 5;
        }
        else if (e.keyCode === 39) {
            l += 5;
        }
        else if (e.keyCode === 40) {
            t += 5;
        }
        dOk.style.left = l + 'px';
        dOk.style.top = t + 'px';
    }

输出:

不能斜着走,操作不顺滑

修正后:

  //计时器加状态+状态(布尔值)更容易操作
    var isLeft = false;
    var isTop = false;
    var isRight = false;
    var isBottom = false;
    //计时器
    var timer = null;
    //键盘事件只修改状态
    window.onkeydown = function (e) {
        if (e.keyCode === 37) {
            isLeft -= true;
        } else if (e.keyCode === 38) {
            isTop = true;
        }
        else if (e.keyCode === 39) {
            isRight = true;
        }
        else if (e.keyCode === 40) {
            isBottom = true;
        }
    }
    window.onkeyup = function (e) {
        if (e.keyCode === 37) {
            isLeft = false;
        } else if (e.keyCode === 38) {
            isTop = false;
        }
        else if (e.keyCode === 39) {
            isRight = false;
        }
        else if (e.keyCode === 40) {
            isBottom = false;
        }
    }

    //通过计时器实现移动
    timer = setInterval(function () {
        var l = dOk.offsetLeft;
        var t = dOk.offsetTop;
        if (isLeft) {
            l -= 5;
        }
        //    每个方向都得判断
        if (isTop) {
            t -= 5;
        }
        if (isRight) {
            l += 5;
        }
        if (isBottom) {
            t += 5;
        }
        dOk.style.left = l + 'px';
        dOk.style.top = t + 'px';
    }, 30)
   

222

               JS键盘事件介绍

在JavaScript中,当用户操作键盘时,会触发键盘事件,键盘事件主要包括下面3中类型:

  • keydown: 在键盘上按下某个键时触发。如果按住某个键,会不断触发该事件,但是Opera浏览器不支持这种连续操作。该事件处理函数返回false时,会取消默认的动作(如输入的键盘字符,在IE和Safari浏览器下还会禁止keypress事件响应).
  • keypress: 按下某个键盘键并释放时触发。如果按住某个键,会不断触发该事件。该事件处理函数返回false时,会取消默认的动作(如输入的键盘字符).
  • keyup: 释放某个键盘键时触发。该事件仅在松开键盘时触发一次,不是一个连续的响应状态。

当获取用户正按下建码时,可以使用keydown、keypress和keyup事件获取这些信息。

键盘事件属性:

属性说明
keyCode该属性包含键盘中对应键位的键值
charCode该属性包含键盘中对应键位的Unicode编码,仅DOM支持
target发生事件的节点(包含元素),仅DOM支持
srcElement发生事件的元素,仅IE支持
shiftKey是否按下Shift键,如果按下返回true,否则为false
ctrlKey是否按下Ctrl键,如果按下返回true,否则为false
altKey是否按下Alt键,如果按下返回true,否则为false
metaKey是否按下Meta键,如果按下返回true,否则为false,仅DOM支持

keyCode和charCode属性值

属性IE事件模型DOM事件模型
keyCode(keypress)返回所有字符键的正确值,区分大写状态(65-90)和小写状态(97-122)功能键返回正确值,而Shift、Ctrl、Alt、PrintScreen、ScrollLock无返回值,其他所有键值都返回0
keyCode(keydown)返回所有键值(除PrintScreen键),字母键都以大写状态显示键值(65~90)返回所有键值(除PrintScreen键),字母键都以大写状态显示键值(65~90)
keyCode(keyup)返回所有键值(除PrintScreen键),字母键都以大写状态显示键值(65~90)返回所有键值(除PrintScreen键),字母键都以大写状态显示键值(65~90)
charCode(keypress)不支持该属性返回字符键,区分大写状态(65~90)和小写状态(97~122),Shift、Ctrl、Alt、PrintScreen、ScrollLock无返回值,其他所有键值都返回0
charCode(keydown)不支持该属性所有键值为0
charCode(keyup)不支持该属性所有键值为0

键位和码值对照表

键位码值键位码值
0~9(数字键)48~57A~Z(字母键)65~90
Backspace(退格键)8Tab(制表键)9
Enter(回车键)13Space(空格键)32
Left arrow(左箭头键)37Top arrow(上箭头键)38

Rigth arrow(右箭头键)

39Down arrow(下箭头键) 

40

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值