当前位置:   article > 正文

vue自定义拖动弹框指令_directives.js指令

directives.js指令

1、在main.js同级目录下新建
directives.js文件

// directives.js
import Vue from 'vue'

// v-dialogDrag: 弹窗拖拽   Vue.directive    vue自定义指令
Vue.directive('dialogDrag', {
  bind(el, binding, vnode, oldVnode) {
    // 获取拖拽内容头部
    const dialogHeaderEl = el.querySelector('.el-dialog__header')
    // 获取拖拽内容整体 这个rrc-dialog是我自己封装的组件 如果使用element的组件应写成.el-dialog
    const dragDom = el.querySelector('.el-dialog')
    dialogHeaderEl.style.cursor = 'move'

    // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
    const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null)

    // 鼠标按下事件
    dialogHeaderEl.onmousedown = (e) => {
      // 鼠标按下,计算当前元素距离可视区的距离 (鼠标点击位置距离可视窗口的距离)
      const disX = e.clientX - dialogHeaderEl.offsetLeft
      const disY = e.clientY - dialogHeaderEl.offsetTop

      // 获取到的值带px 正则匹配替换
      let styL, styT

      // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
      if (sty.left.includes('%')) {
        styL = +document.body.clientWidth * (+sty.left.replace(/\%/g, '') / 100)
        styT = +document.body.clientHeight * (+sty.top.replace(/\%/g, '') / 100)
      } else {
        styL = +sty.left.replace(/\px/g, '')
        styT = +sty.top.replace(/\px/g, '')
      }

      // 鼠标拖拽事件
      document.onmousemove = function(e) {
        // 通过事件委托,计算移动的距离 (开始拖拽至结束拖拽的距离)
        const l = e.clientX - disX
        const t = e.clientY - disY

        let finallyL = l + styL
        let finallyT = t + styT

        // 边界值判定 注意clientWidth scrollWidth区别 要减去之前的top left值
        // dragDom.offsetParent表示弹窗阴影部分
        if (finallyL < 0 - 1.2 * dragDom.clientWidth - dragDom.offsetParent.offsetLeft) {
          finallyL = 0 - 1.2 * dragDom.clientWidth - dragDom.offsetParent.offsetLeft
        } else if (finallyL > dragDom.offsetParent.clientWidth - 2.4 * dragDom.clientWidth - dragDom.offsetParent.offsetLeft) {
          finallyL = dragDom.offsetParent.clientWidth - 2.4 * dragDom.clientWidth - dragDom.offsetParent.offsetLeft
        }

        if (finallyT < 0 - 0.5 * dragDom.clientHeight - dragDom.offsetParent.offsetLeft) {
          finallyT = 0 - 0.5 * dragDom.clientHeight - dragDom.offsetParent.offsetLeft
        } else if (finallyT > dragDom.offsetParent.clientHeight - 1.5 * dragDom.clientHeight - dragDom.offsetParent.offsetLeft) {
          finallyT = dragDom.offsetParent.clientHeight - 1.5 * dragDom.clientHeight - dragDom.offsetParent.offsetLeft
        }

        // 移动当前元素
        dragDom.style.left = `${finallyL}px`
        dragDom.style.top = `${finallyT}px`

        // 将此时的位置传出去
        // binding.value({x:e.pageX,y:e.pageY})
      }

      document.onmouseup = function(e) {
        document.onmousemove = null
        document.onmouseup = null
      }
    }
  }
})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71

2、在main.js中引入

<template>
  <div id="app">
    <router-view/>
  </div>
</template>

<script>
export default {
  name: 'App',
  created() {
    this.reset()
  },
  beforeDestory() {
    localStorage.clear()
    clearInterval(this.reset())
  },
  methods: {
    reset() {
      // 每隔36000000毫秒清空本地缓存
      const item = window.setInterval(() => {
        console.log(1111)
        localStorage.clear()
      }, 36000000)
      return item
    }
  }
}
</script>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

3、使用

<el-dialog v-dialogDrag :append-to-body="true" :close-on-click-modal="false" :before-close="cancel" :visible.sync="dialog" title="查询" width="500px" >
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/709164
推荐阅读
相关标签
  

闽ICP备14008679号