HTML5+CSS3+JavaScript实现拖曳并按照原轨迹返回

1585364631
2022-04-13 / 0 评论 / 177 阅读 / 正在检测是否收录...

HTML5+CSS3+JavaScript实现拖曳并按照原轨迹返回

预览

源代码

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>拖曳并按照原轨迹返回</title>
    <style>
      .box {
        width: 100px;
        height: 100px;
        border: 1px solid;
        position: absolute;
        top: 200px;
        left: 200px;
      }
    </style>
  </head>

  <body>
    <div class="box" id="box"></div>
  </body>

  <script type="text/javascript">
    // 拖曳对象
    var _box = document.getElementById("box");
    // 启用对象移动的位置记录
    var _bl = false;
    // 恢复轨迹锁
    var his = false;

    // 对象移动的x轴数组
    var x_sz = [];
    // 对象移动的y轴数组
    var y_sz = [];
    // 拖曳总时长
    var timer = "";
    // 记录最开始的位置
    var start_x = _box.offsetLeft;
    var start_y = _box.offsetTop;

    // 对象被点击,实现拖曳
    _box.onmousedown = function (e) {
      // 如果锁启用则点击失效
      if (his) {
        return;
      }
      // 开始手动校准位置
      _box.style.left = start_x + "px";
      _box.style.top = start_y + "px";
      // 开启x,y记录
      _bl = true;
      // 记录当前时间戳
      timer = new Date().getTime();
      // 记录当前点距离对象的左边距距离
      var _x = e.offsetX;
      // 记录当前点距离对象的上边距距离
      var _y = e.offsetY;
      // 拖曳过程函数
      onmove = false;
      document.onmousemove = function (e) {
        // 如果记录锁被启用
        if (_bl) {
          // 当前位置x
          var cache_x = e.clientX - _x;
          // 当前位置y
          var cache_y = e.clientY - _y;
          // 数组后追加当前在浏览器当前位置x轴
          x_sz.push(cache_x);
          // 数组后追加当前在浏览器当前位置y轴
          y_sz.push(cache_y);
          //重新设定位置
          _box.style.left = cache_x + "px";
          _box.style.top = cache_y + "px";
        }
      };
    };

    // 鼠标弹起,拖曳结束
    _box.onmouseup = function () {
      // 如果锁启用则点击失效
      if (his) {
        return;
      }
      // 记录关闭
      _bl = false;
      // 取当前时间戳,并且计算毫秒
      timer = new Date().getTime() - timer;
      // 取数组总个数
      var sz_len = x_sz.length - 1;
      // 计算定时器间隔
      var dsq_time = Math.round(timer / sz_len);

      // 防止定时器叠加,清除定时器
      clearInterval(dsq);
      // 启动恢复锁
      his = true;
      // 恢复轨迹函数
      var dsq = setInterval(function () {
        // 数组遍历完毕
        if (sz_len <= 0) {
          x_sz = [];
          y_sz = [];
          // 结束手动校准位置
          _box.style.left = start_x + "px";
          _box.style.top = start_y + "px";
          // 关闭恢复锁
          his = false;
          // 清除定时器
          clearInterval(dsq);
          return;
        }
        _box.style.left = x_sz[sz_len] + "px";
        _box.style.top = y_sz[sz_len] + "px";
        sz_len--;
      }, dsq_time);
    };
  </script>
</html>

0

评论 (0)

取消