用定时器来实现键盘中的事件

1.在实现键盘事件的时候要使用keyCode来确定我们按键值;在以下案例中要实现小方块的移动

小方块的样式实现:

 <style>
        *{
            margin: 0;
            padding: 0;
            list-style: none;
        }
        #ok{
            width: 100px;
            height: 100px;
            background-color: pink;
            position: absolute;
            left: 200px;
            top: 200px;
        }
    </style>

我们会想到通过按动键盘上的上下左右的键盘来改变小方块的左侧偏移量和上方的偏移量从而使小方块上下左右的移动:一下就是简单的实现逻辑代码: 

<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';
    }

 

</script>

以上是我们实现通过键盘事件来实现小方块移动的效果;但是通过这种方式实现的小方块移动时非常不自然的,而通常我们不通过这种方法实现;

正确的打开方式,是我们通过计时器的方式来实现键盘事件; 例如一下代码:

<script>
    var dok = document.getElementById("ok");
 
    //合适的打开方式
    //计时器状态

    var isLeft = false;
    var isRight = false;
    var isTop = 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;
        }
    }

    var sw = window.innerWidth;
    var sh = window.innerHeight;
    //通过计时器实现移动
    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};
        //边界处理
        l = (l<0)?0:l;
        l = (l>sw)?sw:l;
        t = (t<0)?0:t;
        t = (t>sh)?sh:t;
        dok.style.left = l + 'px';
        dok.style.top = t + 'px';

    },30)


</script>

通过定时器实现每30ms的小方块移动,我们会发现小方块的移动变得自然;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值