当前位置: 首页 > article >正文

el-dialog支持全局拖拽功能

1.首先在全局的组件实现拖拽功能,结构如下
在这里插入图片描述
dialogDrag.vue的内容

<script>
    export default {
        mounted() {
            // 获取当前的dialog及其header
            let aimDialog = this.$el.getElementsByClassName('el-dialog')[0];
            let aimHeader = this.$el.getElementsByClassName('el-dialog__header')[0];
            // 获取总的dialog_warpper列表
            let wrapperList = document.getElementsByClassName('el-dialog__wrapper');
 
            aimHeader.onmousedown = (e) => {
                // 用于存放当前dialog所对应的dialog_warpper
                let aimWrap = "";
                for(let i=0; i<wrapperList.length; i++) {
                    if(wrapperList[i].childNodes[0] == aimDialog) {
                        aimWrap = wrapperList[i]
                    }
                }
                // 存放dialog最终的left与top值
                let currentLeft = "";
                let currentTop = "";
 
 
                // 通过鼠标点击位置与起始offset位置,获取起始点击x,y
                let x1 = e.clientX - aimWrap.offsetLeft;
                let y1 = e.clientY - aimWrap.offsetTop;
                document.onmousemove = (e) => {
                    // 清除选中状态
                    let selection = window.getSelection();
                    selection.removeAllRanges();
                    // 获取移动后的x,y
                    currentLeft = e.clientX - x1;
                    currentTop = e.clientY - y1;
                    aimWrap.style.left = currentLeft + 'px';
                    aimWrap.style.top = currentTop + 'px';
                }
                document.onmouseup = () => {
                    let dialogLeft = aimDialog.offsetLeft;  // dialog距离dialog_wrap左侧距离
                    let dialogTop = aimDialog.offsetTop;  // dialog距离dialog_wrap左侧距离
 
                    // 当超出20px距离时回弹20px
                    // 左侧超出
                    if(currentLeft + dialogLeft + aimDialog.clientWidth < 20) {
                        currentLeft = 20 - aimDialog.clientWidth - dialogLeft
                    }
                    // 顶部超出
                    if(currentTop + dialogTop < 20) {
                        currentTop = 20 - dialogTop
                    }
                    // 右侧超出
                    if(currentLeft + dialogLeft > aimWrap.clientWidth - 20) {
                        currentLeft = dialogLeft + aimDialog.clientWidth - 20
                    }
                    // 底部超出
                    if(currentTop + dialogTop > aimWrap.clientHeight - 20) {
                        currentTop =  aimWrap.clientHeight - dialogTop - 20
                    }
 
                    aimWrap.style.left = currentLeft + 'px';
                    aimWrap.style.top = currentTop + 'px';
 
                    document.onmousemove = null;
                    document.onmouseup = null;
                }
            }
        }
    }
</script>
<style>
 .el-dialog__header {
    /* header颜色,下面是示例,可以忽略 */
    /* background-color: aqua; */
 }
 .el-dialog__wrapper {
    width: 100vw;
    height: 100vh;
 }
</style>

index.js文件

import dialogDragMixin from './dialogDrag'  
export function installDialog(Vue, Element) {
    Element.Dialog.methods.handleClose = function(){
        if(typeof this.beforeClose==='function'){
            this.beforeClose(this.hide);
        }else{
            this.hide();
        }
        // 关闭后重置dialog_warpper的position相关
        let aimDialog = this.$el.getElementsByClassName('el-dialog')[0];
        let wrapperList = document.getElementsByClassName('el-dialog__wrapper');
        let aimWrap = "";
        for(let i=0; i<wrapperList.length; i++) {
            if(wrapperList[i].childNodes[0] == aimDialog) {
                aimWrap = wrapperList[i]
            }
        }
        window.setTimeout(() => {
            if(aimWrap){
                aimWrap.style.left = 0;
                aimWrap.style.top = 0;
            }
          
        }, 500)
 
    }
    Element.Dialog.mixins.push(dialogDragMixin);  
}

在main.js里全局注册

import { installDialog } from "../src/components/common/dialog/index.js";

installDialog(Vue, ElementUI)


http://www.kler.cn/a/374842.html

相关文章:

  • 中国大学慕课视频资源分析
  • 谷歌被俄罗斯罚款2,500,000,000,000,000,000,000,000,000,000,000,000美元
  • 【前端】在 Next.js 开发服务器中应该如何配置 HTTPS?
  • Spring Cloud Sleuth(Micrometer Tracing +Zipkin)
  • 动态威胁场景下赋能企业安全,F5推出BIG-IP Next Web应用防火墙
  • 【数据结构二叉树】补充:C实现二叉树的层次遍历
  • STM32 从0开始系统学习3 启动流程
  • redis为什么快
  • 什么是React.js,有什么特点
  • 常见生成式模型汇总
  • Spark的集群环境部署
  • 自动化测试工具Ranorex Studio(十八)-调用用户定义的action
  • day-77 超级饮料的最大强化能量
  • .net Core 使用Panda.DynamicWebApi动态构造路由
  • qt QDoubleSpinBox详解
  • 第15课 算法(下)
  • 使用 Cloudreve 搭建你的专属个人网盘
  • 分布式 ID 生成策略(一)
  • 如何提高社媒品牌知名度,3个增加曝光的实操方法
  • 微信小程序服务通知
  • 【HarmonyOS NEXT】在 HarmonyOS NEXT 中实现优雅的加载动画
  • python 五子棋小游戏
  • GIN 反向代理功能
  • C/C++ 每日一练:二叉树的先序遍历
  • Webserver(2.6)信号
  • 信号完整性SI总结【小登培训】