前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >js实现带框拖拽

js实现带框拖拽

作者头像
星辉
发布2019-01-15 09:54:03
4.8K0
发布2019-01-15 09:54:03
举报

带框拖拽

目录

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

代码实例

<!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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年10月04日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 带框拖拽
    • 目录
      • 代码实例
        • 代码解析
          • 下载源码链接
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档