通过按下键盘的上下左右键(e.keyCode),实现dom元素的移动

451 阅读1分钟

和用鼠标按住拖动一样,首先要获取div元素当前的left和top值,

提示: 获取非行内样式, 使用document.defaultView.getComputedStyle(obj)["left"]

按下键盘的事件监听和给div添加不一样,按下键盘是通过keyCode判断有没有按下键盘。

e.keyCode的37,38,39,40分别对应左上右下,所以也要配合switch case 使用

具体代码如下:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      div {
        width: 200px;
        height: 200px;
        background-color: orange;
        position: absolute;
        left: 200px;
        top: 200px;
      }
    </style>
  </head>
  <body>
    <div></div>
  </body>
  <script>
    // 提示: 获取非行内样式, 使用`document.defaultView.getComputedStyle(obj)["left"]`
    // 通过keyCode,判断按的上下左右的哪一个键
    // 37 38 39 40对应左上右下
    // 获取到left,再加上3px,就可以实现移动
    var divTop = 0;
    var divLeft = 0;
    var div = document.querySelector("div");
    // 按下键盘的时候,开始监听
    // 按下键盘是通过keyCode来判断有没有按下键盘,这一点和div元素添加点击事件不一样
    document.onkeydown = function (e) {
      switch (e.keyCode) {
        case 37 /* 左 */:
          divLeft =
            parseInt(document.defaultView.getComputedStyle(div)["left"]) -
            3 +
            "px";

          div.style.left = divLeft;
          break;

        case 38 /* 上 */:
          divTop =
            parseInt(document.defaultView.getComputedStyle(div)["top"]) -
            3 +
            "px";

          div.style.top = divTop;
          break;
        case 39 /* 右,右就是在左的基础上把减号改成加号 */:
          divLeft =
            parseInt(document.defaultView.getComputedStyle(div)["left"]) +
            3 +
            "px";

          div.style.left = divLeft;
          break;
        case 40 /* 下,下就是在上的代码的基础上把减号改成加号 */ /*  */:
          divTop =
            parseInt(document.defaultView.getComputedStyle(div)["top"]) -
            3 +
            "px";

          div.style.top = divTop;
          break;
      }
    };
  </script>
</html>