美文网首页
在vue中实现自定义拖动指令

在vue中实现自定义拖动指令

作者: 9d0edee7bcb0 | 来源:发表于2018-02-24 11:36 被阅读0次

    接下来要讲的是如何在vue中实现元素拖动,并且拿到拖动元素相对于父元素的位置偏移量X、Y

    下面我们看下页面的基本结构吧,我们结合图来介绍这个东西会好理解的多

    image

    上面看到了页面基本结构。container就是我们说的相对父元素,drager就是要被我们拖动的元素,相信这个结构大家都心里有数

    接下来,我们使用自定义指令去实现这个功能,这里还不清楚自定义指令内容的同学请看官网 : https://cn.vuejs.org/v2/guide/custom-directive.html

    官网对自定义指令的实现以及生命周期说的很清楚了

    下面我们想一个问题,怎么拿到drager元素相对于父元素的偏移量?这个问题如果解决了,那就OK了。

    为了解决这个问题,也是想了很多,下面请看我画的图

    image

    这里我们要清楚一点。那就是我们每次在不同的位置点击拖拽元素的时候,点击的坐标都是新的,我们从鼠标 按下-->拖动->松开 是一个完整的过程,每一次都是新的一个完整过程。

    接下来请仔细看下面两个代码

    oDiv.onmousedown =function (e) {
    //  鼠标按下,计算当前元素距离可视区的距离
      let disX = e.clientX - oDiv.offsetLeft
    ---------------------------------------------------------    
    document.onmousemove =function (e) {
      let l = e.clientX - disX
    

    当鼠标按下的时候,我们用鼠标触发事件的坐标(对于body/可视区域) - 拖拽元素距离container(父级元素)的距离 S1

    再看第二段代码:当鼠标在按住后发生推拽时触发的事件-> 拖动鼠标时鼠标的clientX - S1,你们可以画图或者脑补,就会发现这个差值就是推拽元素相对父级元素拖拽后的距离!

    弄懂这点就好办了。下面看我们直接看代码

    
    Vue.directive('drag', {
    
      inserted (el, binding) {
    
        let oDiv =el
    
    //  左边距最大值   
        let maxLeft = el.parentNode.clientWidth -el.clientWidth
    
    //  上边距最大值    
        let maxTop = el.parentNode.clientHeight - el.clientHeight
    
        oDiv.onmousedown = function (e) {
    //  鼠标按下,计算当前元素距离可视区的距离
          let disX = e.clientX - oDiv.offsetLeft
    
          let disY = e.clientY - oDiv.offsetTop
    
          document.onmousemove =function(e) {
    
    //  获取到鼠标拖拽后的横向位移(距离父级元素)        
        let l = e.clientX -disX
    
    //  获取到鼠标拖拽后的纵向位移(距离父级元素)
        let t = e.clientY -disY
    
        oDiv.style.left  = l + 'px'
    
        oDiv.style.top  = t + 'px'
    
        if(e.clientX - disX <= 0) { oDiv.style.left = 0 + 'px'}
    
        if(e.clientY - disY <= 0) { oDiv.style.top = 0 + 'px'}
    
        if(e.clientX - disX >= maxLeft) { oDiv.style.left = maxLeft + 'px'}
    
        if(e.clientY - disY >= maxTop) { oDiv.style.top = maxTop + 'px'}
    
    //    将此时的位置传出去
    
    binding.value({x: oDiv.style.left, y: oDiv.style.top}) }
    
    //    松开事件后,移除事件
    
           document.onmouseup  =function (e) { 
             document.onmousemove =null 
             document.onmouseup =null
           }
        }
      }
    })
    
    ------------------------------------------------------------------------------------------------------
    
    //  我们可以在函数中拿到指令传出来的数据对象
    
      greet(obj){
        console.log(obj)
      }
    

    这是我的个人笔记,希望对你有帮助。

    相关文章

      网友评论

          本文标题:在vue中实现自定义拖动指令

          本文链接:https://www.haomeiwen.com/subject/ncdqxftx.html