手写拖拽div

229 阅读1分钟

要点:

  • 监听document,不能只监听div
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <style>
      div {
        border: 1px solid blue;
        position: absolute;
        top: 0;
        left: 0;
        width: 100px;
        height: 100px;
      }

      * {
        margin: 0;
        padding: 0;
      }
    </style>
  </head>
  <body>
    <div id="box"></div>
    <script>
      // 用来判断是否拖拽了
      var dragging = false;
      // 判断位置是否变化?
      var position = null;

      box.addEventListener("mousedown", function (e) {
        dragging = true;
        //得到box区域内的,按下鼠标左键的横纵坐标
        position = [e.clientX, e.clientY];
      });

      // 对整个文档进行监听
      document.addEventListener("mousemove", function (e) {
        // 如果没有点击box时,就不管他
        if (dragging === false) return;
        const x = e.clientX;
        const y = e.clientY;
        // 当前的横坐标减去在box点击时的初始坐标
        const deltaX = x - position[0];
        // 得到纵坐标差值,根据差值去改变竖坐标
        const deltaY = y - position[1];
        // 将字符串转化为number,没有设置radix,默认为10进制
        const left = parseInt(box.style.left || 0);
        //找到box的left坐标
        const top = parseInt(box.style.top || 0);
        box.style.left = left + deltaX + "px";
        box.style.top = top + deltaY + "px";
        position = [x, y];
      });

      document.addEventListener("mouseup", function (e) {
        dragging = false;
      });
    </script>
  </body>
</html>

知识补充

clientX和clinenY的作用是什么

  • clientX它提供事件发生时的应用客户端区域的水平坐标 (与页面坐标不同)
  • clinenY它提供事件发生时的应用客户端区域的垂直坐标 (与页面坐标不同)

parseInt的作用

  • parseInt(string, radix) 解析一个字符串
  • 并返回指定基数的十进制整数
  • 把第一个参数看成是一个数的n进制,返回的值却是十进制
  • radix 是 2-36 之间的整数,表示被解析字符串的基数。
  • 简单来说,第二个参数就代表进制
  • 如果 radix 没有指定或者为 0,参数会被假定以 10 为基数来解析
  • parseInt的第一个参数string要小于第二个参数radix,所以parseInt('3', 2)等于NaN;
  • 如果第一个参数string大于等于第二个参数radix,那么直接返回NaN

image.png

Math.pow(base, exponent)

5的2次方Math.pow(5,2) // 25

parseInt('123',5)怎么计算?

image.png

参考链接

parseInt