js实现带框拖拽

带框拖拽

目录

  • 代码实例
  • 代码解析
  • 下载源码链接



代码实例

<!DOCTYPE html>
<html>
<head>
  <title>带框拖拽</title>
  <style type="text/css">
    .div1{
      width:400px;
      height: 400px;
      background: blue;
      position: relative;
      margin: 20px;
    }
    .drag1{
      width: 100px;
      height: 100px;
      background: red;
      position: absolute;
    }
    .box{
      border: 1px dashed black;
      position: absolute;
    }
  </style>
</head>
<body>
  <div id="div1" class="div1">
    <div id="drag1" class="drag1">拖我啊</div>
  </div>
</body>
<script type="text/javascript">
  // 自运行函数
  (function(){
    // 变量初始化
    var oDiv1=document.getElementById('div1')
    var oDrag1=document.getElementById('drag1')
    oDrag1.onmousedown=function(ev){
      var oEvent=ev||event
      // 求相对于自身原点的坐标值
      var pos=getMousePosition(oEvent)
      var disX=pos.x - oDrag1.offsetLeft
      var disY=pos.y - oDrag1.offsetTop
      // 创建虚框
      var oBox=document.createElement('div')
      oBox.className='box'
      oBox.style.width=oDrag1.offsetWidth-2+'px'
      oBox.style.height=oDrag1.offsetHeight-2+'px'
      // 设定虚框的位置,即实体的初始位置
      oBox.style.left=oDrag1.offsetLeft+'px'
      oBox.style.top=oDrag1.offsetTop+'px'
      // 在oDiv1的节点下,添加新的子节点
      oDiv1.appendChild(oBox)
      // 事件捕获
      if(oBox.setCapture){
        // 兼容Ie7-11
        oBox.onmousemove=mouseMove
        oBox.onmouseup=mouseUp
        // 此方法用于捕获鼠标事件
        oBox.setCapture()
      }else{
        // 兼容FF,Chrome
        document.onmousemove=mouseMove
        document.onmouseup=mouseUp
      }

      // 获取鼠标位置事件
      function getMousePosition(ev){
        // scrollTop设置元素中滚动条的垂直偏移
        var scrollTop=document.documentElement.scrollTop||document.body.scrollTop
        var scrollLeft=document.documentElement.scrollLeft||document.body.scrollLeft
        return {x:ev.clientX + scrollLeft,y:ev.clientY+scrollTop}
      }

      // 鼠标移动的更新函数
      function mouseMove(ev){
        // 获取元素顶点的坐标l,t
        var oEvent=ev||event
        var pis=getMousePosition(oEvent)
        var l=pis.x-disX
        var t=pis.y-disY

        oBox.style.left=l+'px'
        oBox.style.top=t+'px'
      }

      // 鼠标抬起后触发的函数
      function mouseUp(){
        // 将移动的函数和弹起的函数清空
        this.onmousemove=null
        this.onmouseup=null
        oDrag1.style.left=oBox.offsetLeft+'px'
        oDrag1.style.top=oBox.offsetTop+'px'
        // 除去虚框并释放鼠标监控
        oDiv1.removeChild(oBox)
        if (oBox.releaseCapture) {
          oBox.releaseCapture()
        }
      }
      // FF中阻止默认行为
      return false
    }
  })();
</script>
</html>


代码解析

  • oEvent=ev||event
    为了兼容各个浏览器,在FireFox浏览器中,事件绑定的函数要获取到事件本身,需要从函数中传入,而IE等浏览器则可以直接使用event或者window.event得到事件本身



下载源码链接

星辉的Github



  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值