HTML+CSS+JavaScript实现键盘对div元素的移动(超详细)

一、目标

1、小方块能够通过WASD控制移动

2、设置一个边框,让小方块只能在其中移动

3、当小方块超过边界时,从相反方向移动出来

二、步骤

1、创建HTML元素

2、用CSS设置边框和小方块样式

3、键盘响应

4、方块移动

5、超过边框后移动效果

三、代码
1、HTML

​ 需要设置一个盒子类,为小方块活动范围

​ 在盒子里设置一个div元素,为小方块

<div class="box"><!--边框-->
    <div class="rectangle"></div><!--方块元素-->
</div>
2、CSS

​ 设置边框属性和小方块属性

​ 其中必须要注意的是,top=0;

​ 原因:

​ 第一,当键盘响应改变方块属性时,大小是多少px,

当没有设置大小时,改变不了css里的属性;

​ 第二,最好默认为0,不然在判断边框时会变得复杂很多

.box{
    position: absolute;
    margin-top: 200px;
    margin-left: 400px;
    width: 1200px;
    height: 600px;
    border: 1px solid black;
}
.rectangle{
    position: absolute;
    width: 30px;
    height: 30px;
    background: pink;
    top:0;/*注意!*/
}
3、JS

定时器刷新:

​ 每隔一定时间刷新,如果有按键响应,则小方块坐标改变

​ 改变小方块的坐标即改变小方块style属性,改变小方块界面左右上下的距离

值得注意的是,到右边框的距离就是边框距离-到左边框距离

键盘响应:

​ 用switch语句实现按下WASD的不同结果

let divs=document.querySelector('.rectangle');

const l=30;//方块长度
const x=30;//每次移动长度
const timer=300;//刷新时间
let toTop,toLeft,toRight,toBottom=false;

//键盘响应
document.addEventListener('keypress',function (e){
    switch (e.code) {
        case 'KeyW':
            toTop=true;
            toLeft = toRight = toBottom = false;
            break;
        case 'KeyA':
            toLeft=true;
            toTop=toRight=toBottom=false;
            break;
        case 'KeyS':
            toBottom=true;
            toTop=toLeft=toRight=false;
            break;
        case 'KeyD':
            toRight=true;
            toTop=toLeft=toBottom=false;
            break;
    }
});

//设置定时器刷新移动
setInterval(function (){
    if(toLeft){
        if(divs.offsetLeft===0){//当方块到达左边距时
            divs.style.left=divs.offsetLeft+1200+'px';//方块从右边界运动出来
        }
        else{
            divs.style.left=divs.offsetLeft-x+'px';//方块正常移动
        }
    }
    if(toTop){
        if(divs.offsetTop===0){
            divs.style.top=divs.offsetTop+600+'px';
        }
        else{
            divs.style.top=divs.offsetTop-x+'px';
        }
    }
    if(toRight){
        if(divs.offsetLeft===1200-l){//判断是否到右边距
            divs.style.left=divs.offsetLeft-1200+'px';
        }
        else{
            divs.style.left=divs.offsetLeft+x+'px';
        }
    }
    if(toBottom){
        if(divs.offsetTop===600-l){
            divs.style.top=divs.offsetTop-600+'px';
        }
        else{
            divs.style.top=divs.offsetTop+x+'px';
        }
    }
},timer);
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值