DOM-demo:拖拽盒子移动盒子

demo要求:

在这里插入图片描述
比较有难度,仔细看
思路与逻辑:

          1:事件源  只能按下title
            通过disX,disY  记录鼠标的相对坐标
          2:实现拖拽   document.onmousemove
            var left = e.pageX - disX
            var top = e.pageY - disy
          3:设置别界
            left <= 0   left = 0
          最大边界   = 页面的可视宽度 - 盒子的实际宽度
            left >= html.clientWidth - oBox.offsetWidth

            top <= 0   top = 0
          最大边界   = 页面的可视Height - 盒子的实际Height
            top >= html.clientHeight - oBox.offsetHeight

            oBox.style.left = left
            oBox.style.top = top

代码:

<!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>
    #box{
      width: 400px;
      height: 400px;
      background-color: aquamarine;
      position: absolute;
      left: 0;
      top: 0;
    }
    #title{
      width: 100%;
      height: 50px;
      background-color: #000;
      position: absolute;
      left: 0;
      top: 0;
    }
    span{
      position: absolute;
      right: 0;
      top: 0;
      width: 50px;
      height: 50px;
      color: white;
    }
  </style>
</head>
<body>
  <div id="box">
    <div id="title">
      <span>
        返回
      </span>
    </div>
  </div>
  <script>
  // 1获取元素

   var oBox = document.getElementById('box');
   var oSpan = document.getElementsByTagName('span')[0];
   var html = document.documentElement

// 初始化变量
   var arr = [];  //存储盒子的位置
   var timer = null;
  //  2实现拖拽
  oBox.onmousedown = function(evt){
    var e = evt || window.event;
    // 事件源
    var target = e.target || e.srcElement
    if(target.id === 'title'){
      // console.log(123)
      // 记录盒子的初始位置
      arr.push({left:oBox.offsetLeft,top:oBox.offsetTop})
       var disX = e.offsetX;
       var disY = e.offsetY;
      //  移动
      document.onmousemove = function(evt){
        var e = evt || window.event;
        var left = e.pageX - disX;
        var top = e.pageY - disY;
        // 设置边界   html.clientWidth页面可视区域的宽度
        if(left <= 0){
          left = 0;
        }else if(left >= html.clientWidth - oBox.offsetWidth){
          left = html.clientWidth - oBox.offsetWidth
        }

        if(top <= 0){
          top = 0;
        }else if(top >= html.clientHeight - oBox.offsetHeight){
          top = html.clientHeight - oBox.offsetHeight
        }


        oBox.style.left = left + 'px';
        oBox.style.top = top + 'px';
        // 记录盒子所有的运动轨迹
        arr.push({left:oBox.offsetLeft,top:oBox.offsetTop});
        
      }
      document.onmouseup = function(){
        // 清除移动事件
        document.onmousemove = null
        console.log(arr)
      }
    }
  }


  // 点击返回  盒子回到原始位置
  oSpan.onclick = function(){
    // 清空所有的定时器
     clearInterval(timer);
    //  index时存放盒子运动轨迹的 数组的最后一个值的下标
     var index = arr.length - 1;
     timer = setInterval(function(){
       oBox.style.left = arr[index].left + 'px';
       oBox.style.top = arr[index --].top + 'px';
      //  index --

       if(index === -1){
         clearInterval(timer);
         arr = []
       }

     },50)
  }
  
  </script>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值