首页 > 其他分享 >ElementUI的Dialog弹窗实现拖拽移动功能

ElementUI的Dialog弹窗实现拖拽移动功能

时间:2023-11-15 18:01:35浏览次数:40  
标签:el const dialog ElementUI top drag Dialog dragDom 弹窗

在项目中使用el-dialog中发现不能够拖拽移动,因此网上找了相关资料,使用自定义指令实现拖拽功能。

1、创建自定义指令:

新建文件directive/el-drag-dialog/index.js

import drag from "./drag";

const install = function (Vue) {
  Vue.directive("el-drag-dialog", drag);
};
if (window.Vue) {
  window["el-drag-dialog"] = drag;
  Vue.use(install);
}

drag.install = install;
export default drag;

新建文件directive/el-drag-dialog/drag.js

export default {
  bind(el, binding, vnode) {
    const dialogHeaderEl = el.querySelector(".el-dialog__header");
    const dragDom = el.querySelector(".el-dialog");
    dialogHeaderEl.style.cssText += ";cursor:move;";
    dragDom.style.cssText += ";top:0px;";

    // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
    const getStyle = (function () {
      if (window.document.currentStyle) {
        return (dom, attr) => dom.currentStyle[attr];
      } else {
        return (dom, attr) => getComputedStyle(dom, false)[attr];
      }
    })();

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

      const dragDomWidth = dragDom.offsetWidth;
      const dragDomheight = dragDom.offsetHeight;

      const screenWidth = document.body.clientWidth;
      const screenHeight = document.body.clientHeight;

      const minDragDomLeft = dragDom.offsetLeft;
      const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth;

      const minDragDomTop = dragDom.offsetTop;
      const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight;

      // 获取到的值带px 正则匹配替换
      let styL = getStyle(dragDom, "left");
      let styT = getStyle(dragDom, "top");

      if (styL.includes("%")) {
        styL = +document.body.clientWidth * (+styL.replace(/%/g, "") / 100);
        styT = +document.body.clientHeight * (+styT.replace(/%/g, "") / 100);
      } else {
        styL = +styL.replace(/\px/g, "");
        styT = +styT.replace(/\px/g, "");
      }

      document.onmousemove = function (e) {
        // 通过事件委托,计算移动的距离
        let left = e.clientX - disX;
        let top = e.clientY - disY;

        // 边界处理
        if (-left > minDragDomLeft) {
          left = -minDragDomLeft;
        } else if (left > maxDragDomLeft) {
          left = maxDragDomLeft;
        }

        if (-top > minDragDomTop) {
          top = -minDragDomTop;
        } else if (top > maxDragDomTop) {
          top = maxDragDomTop;
        }

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

        // emit onDrag event
        vnode.child.$emit("dragDialog");
      };

      document.onmouseup = function () {
        document.onmousemove = null;
        document.onmouseup = null;
      };
    };
  },
};

2、引入自定义指令

ElementUI的Dialog弹窗实现拖拽移动功能_css

 

import elDragDialog from "@/directive/el-drag-dialog";
directives: {
    elDragDialog
},

3、使用自定义指令(v-el-darg-dialog)

<el-dialog
      v-el-drag-dialog
      title="提示"
      :visible.sync="dialogVisible"
      width="30%"
      :before-close="handleClose"
      v-if="dialogVisible"
    >
      <span>这是一段信息</span>
      <span slot="footer" class="dialog-footer">
        <el-button @click="dialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="dialogVisible = false"
          >确 定</el-button
        >
      </span>
    </el-dialog>

其中v-el-drag-dialog为自定义指令,v-if主要为了处理每次打开弹框都在中间位置。

4、完整代码:

<template>
  <div>
    <el-button @click="dialogVisible = true">打开弹框</el-button>
    <el-dialog
      v-el-drag-dialog
      title="提示"
      :visible.sync="dialogVisible"
      width="30%"
      :before-close="handleClose"
      v-if="dialogVisible"
    >
      <span>这是一段信息</span>
      <span slot="footer" class="dialog-footer">
        <el-button @click="dialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="dialogVisible = false"
          >确 定</el-button
        >
      </span>
    </el-dialog>
  </div>
</template>

<script>
import elDragDialog from "@/directive/el-drag-dialog";
export default {
  name: "DialogView",
  directives: {
    elDragDialog,
  },
  data() {
    return {
      dialogVisible: false,
    };
  },
  methods: {
    handleClose() {
      this.dialogVisible = false;
    },
  },
};
</script>

5、效果

ElementUI的Dialog弹窗实现拖拽移动功能_css_02

标签:el,const,dialog,ElementUI,top,drag,Dialog,dragDom,弹窗
From: https://blog.51cto.com/u_16359506/8399902

相关文章

  • element ui 设置el-dialog2级弹窗
    步骤1,通过<el-buttontype="text"@click="dialogTableVisible=true">添加活动</el-button>弹出第一层,themeData设置成你循环的数据<el-buttontype="text"@click="dialogTableVisible=true">添加活动</el-button><!--第一层弹......
  • 关于elementUI开发中使用的一些小技巧
    关于表格1.表格的勾选遇上分页问题:当需要对表格批量操作,并且表格数量量不止一页的情况下,怎么在点击下一页时再回来能够保留之前勾选的状态(前端分页)?在element官网中没有这个例子,但是有对应的两个属性就可以了只需要在多选框那一列加上这个属性,并且设置表格每行的key:例子:<el......
  • ElementUI的el-cascade希望限制显示的宽度?
    要限制el-cascade组件显示的宽度,你可以使用CSS来设置容器的宽度。以下是一种可能的解决方案:在包含el-cascade组件的父级容器中添加一个自定义的样式类,例如cascade-container。<divclass="cascade-container"><el-cascade...></el-cascade></div>在你的样式表(如CSS文件或内联......
  • 博客管理系统|基于SpringBoot+Vue+ElementUI付费博客系统的设计与实现
    作者主页:编程指南针作者简介:Java领域优质创作者、博客专家、特邀作者、多年架构师设计经验、腾讯课堂常驻讲师主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助收藏点赞不迷路 关注作者有好处项目编号:BS-PT-089二,环境介绍语言环境:Java: jdk1.8数据库:Mysql......
  • layui弹框提示按回车事件一直不停弹窗
    如下界面,敲回车后一直不停弹窗,确定的事件也不执行 解决问题方法:在确认事件前面加上$(':focus').blur();如下所示,问题得到解决$(':focus').blur();layer.confirm(msg,{icon:3,title:'提示',success:function(){this.enterEsc=function......
  • elementui 自定义上传接口上传完图片之后无法再进行第二次上传,踩坑解决
    1,上传功能<el-upload action="" ref='upload' :http-request="handleFileUpload" :limit="1" :show-file-list="false"> <iclass="el-icon-upload2"></i></el-upload>2,在上传后......
  • vue 使用elementui el-image 图片地址不变,图片不刷新问题
    问题:el-image图片地址不变,图片不刷新问题原因:在Web开发中,浏览器会缓存已经加载的静态资源(比如图片、CSS、JS文件),以提高页面加载速度,减轻服务器负担。当图片的源路径不变时,浏览器会对这些图片进行缓存,如果图片内容更新了,但是浏览器还是使用缓存,这时候就需要在图片源路径后......
  • elementplus弹窗可拖拽draggable,点击空白处不消失close-on-click-modal,modal是否去掉
    <el-dialog:modal="false"v-model="dialogVisible"title=""width="30%"draggable:close-on-click-modal="false"class="message-dialog"></el-dialog&g......
  • vue+elementui解决下拉框赋值显示id的问题
    当我给下拉框赋值初始化的时候,下拉框却显示id,不显示我的文字  原因是这个id值为数字,正常应该是字符串,所以,应该转成字符串  然后就可以正常显示了......
  • vue3 使用elementUI饿了么el-table组件 动态循环自定义表头列数据
     在vue3上使用el-table组件自定义循环表头列;<el-table:data="list"v-loading="loading"border>      <!--@selection-change="handleSelectionChange"-->      <!--<el-table-columntype="selection"wi......