Vue. 之 Element dialog 拖拽

Vue. 之 Element dialog 拖拽

  默认情况下,在使用Element的Dialog模块时,弹出框是不能移动的,且 一旦点击遮罩层区域,弹框就会消失。

  解决方案:

  1 在 utils 中新建 directives.js 文件

import Vue from ‘vue‘

// v-dialogDrag: 弹窗拖拽
Vue.directive(‘dialogDrag‘, {
  bind(el, binding, vnode, oldVnode) {
    const dialogHeaderEl = el.querySelector(‘.el-dialog__header‘)
    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

        // 移动当前元素
        dragDom.style.left = `${l + styL}px`
        dragDom.style.top = `${t + styT}px`

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

      document.onmouseup = function(e) {
        document.onmousemove = null
        document.onmouseup = null
      }
    }
  }
})

// v-dialogDragWidth: 弹窗宽度拖大 拖小
Vue.directive(‘dialogDragWidth‘, {
  bind(el, binding, vnode, oldVnode) {
    const dragDom = binding.value.$el.querySelector(‘.el-dialog‘)

    el.onmousedown = (e) => {
      // 鼠标按下,计算当前元素距离可视区的距离
      const disX = e.clientX - el.offsetLeft

      document.onmousemove = function(e) {
        e.preventDefault() // 移动时禁用默认事件

        // 通过事件委托,计算移动的距离
        const l = e.clientX - disX
        dragDom.style.width = `${l}px`
      }

      document.onmouseup = function(e) {
        document.onmousemove = null
        document.onmouseup = null
      }
    }
  }
})

2. main.js中导入:import ‘./utils/directives.js‘

3. 使用 el-dialog 的地方加入 v-dialogDrag 

<el-dialog
        title="添加新的变量"
        :visible.sync="setAddDialogFormVisible"
        width="35%"
        v-dialogDrag>
</el-dialog>

原文地址:https://www.cnblogs.com/Charles-Yuan/p/11295773.html

时间: 2024-10-09 21:32:48

Vue. 之 Element dialog 拖拽的相关文章

draggable()拖拽时限制移动区域

jQuery-UI为我们提供了一个非常便捷的拖拽方法:draggable(),在使用此方法时,我们可能会希望控件只在某一区域中移动,不能被拖出边界,这样的话我们可以使用下面的方法: 调用draggable()时: $('#element').draggable({containment: '#background'}); 上述代码是将element的拖拽范围限制在background之中. draggable()的参数详见http://blog.csdn.net/liu_111111/artic

vue+element 使用sortable实现表格拖拽

在vue项目中使用sortable.js实现拖拽功能.官网地址:http://www.sortablejs.com/index.html 1.下载sortable.js:npm install sortablejs --save 2.在当前页引入:import Sortable from ‘sortablejs’ 3.使用方法: 1 mounted() { 2 this.rowDrop(); 3 }, 4 methods: { 5 //单选按钮可取消 6 clickitem (index) {

Vue+element 需要用到拖拽组件 vuedraggable

新需求是要求界面上的14个可以拖拽,点击保存之后保存拖拽之后的顺序. 确定需求之后肯定第一时间是百度,发现有个插件vuedragger拖拽,按照教程就懵懂的开始了. 官方示例:https://david-desmaisons.github.io/draggable-example/ 1.安装 npm install vuedraggable 2.引入 import draggable from 'vuedraggable' 3.注册 components: { draggable } html

element-ui dialog组件添加可拖拽位置 可拖拽宽高

有几个点需要注意一下 每个弹窗都要有唯一dom可操作 指令可以做到 拖拽时要添加可拖拽区块 header 由于element-ui dialog组件在设计时宽度用了百分比, 这里不同浏览器有兼容性问题 实现拖拽宽高时 获取边缘问题 div定位 设置模拟边缘 <template> <el-dialog v-dialogDrag ref="dialog__wrapper"> <div class="dialog-body"> <

基于Vue实现可以拖拽的树形表格实例详解

因业务需求,需要一个树形表格,并且支持拖拽排序,任意未知插入,github搜了下,真不到合适的,大部分树形表格都没有拖拽功能,所以决定自己实现一个.这里分享一下实现过程,项目源代码请看github,插件已打包封装好,发布到npm上 本博文会分为两部分,第一部分为使用方式,第二部分为实现方式 安装方式 npm i drag-tree-table --save-dev 使用方式 import dragTreeTable from 'drag-tree-table'  模版写法 ? 1 <dragTr

vue拖拽插件(弹框拖拽)

// =======拖拽 插件 cnpm install vuedraggableimport draggable from 'vuedraggable' <draggable v-model="tags" :move="getdata" @update="datadragEnd"> <transition-group> <div class="testdiv" v-for="eleme

可拖拽dialog

指令的封装转自https://blog.csdn.net/sinat_21902709/article/details/86545444 可拖拽dialog应用于很多弹出框,所以需要作用于全局 在插件文件夹中创建一个文件dialogDrag存放公共的指令 import Vue from "vue"; // v-dialogDrag: 弹窗拖拽属性 Vue.directive("dialogDrag", { bind(el, binding, vnode, oldVn

vue实现拖拽组件

可以拖拽,靠边停靠,效果图如下 代码如下: 注意:代码中使用的图片未上传 DragAndDrop组件: <template> <div class="drag" id="moveDiv" @mousedown="start($event)" @touchstart="start($event)" @mousemove="move($event)" @touchmove="move

vue拖拽排序插件vuedraggable的使用 附原生使用方法

Vue中使用 先下载依赖: npm install vuedraggable -S 项目中引入 import draggable from 'vuedraggable' 注册 components: { draggable }, demo: <template> <draggable v-model="colors" @update="datadragEnd" :options = "{animation:500}"> &