资讯专栏INFORMATION COLUMN

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

jzman / 3365人阅读

摘要:最近公司新加需求实现弹窗可拖拽还要拖拽宽高变化国际惯例先上图浏览器下作的有几个点需要注意一下每个弹窗都要有唯一可操作指令可以做到拖拽时要添加可拖拽区块由于组件在设计时宽度用了百分比这里不同浏览器有兼容性问题实现拖拽宽高时获取边缘问题定位设

最近公司新加需求, 实现弹窗可拖拽, 还要拖拽宽高变化.

国际惯例先上图:

edge浏览器下作的gif
http://www.lanourteam.com/%E6...

有几个点需要注意一下

每个弹窗都要有唯一dom可操作 指令可以做到

拖拽时要添加可拖拽区块 header

由于element-ui dialog组件在设计时宽度用了百分比, 这里不同浏览器有兼容性问题

实现拖拽宽高时 获取边缘问题 div定位 设置模拟边缘

dialog组件的其它属性这里就不写了. 项目中的指令都定义directives.js中集中管理, 全局注册.
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;
            };
        }  
    }
})

main.js:

// 引入自定义指令
import "./directives.js";

这样便实现了需求功能.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/92673.html

相关文章

  • 实现element-ui对话框拖拽功能

    摘要:对话框可拖拽及边界处理应业务需求,需要实现对话框可拖拽问题,应没有提供官方支持,于是便参考大神的文章,得出了适合业务需要的解决方案。在实现的功能的情况下,封装成了文件,然后再中引入后可全局使用。 element-ui对话框可拖拽及边界处理 应业务需求,需要实现对话框可拖拽问题,应element-ui没有提供官方支持,于是便参考大神的文章,得出了适合业务需要的解决方案。很多大神给出的代码...

    qc1iu 评论0 收藏0
  • 一个vue的拖拽的瀑布流布局组件

    摘要:是一个功能强大的瀑布流布局组件。支持用户拖拽和对改变元素大小,并提供相应的事件进行自定义操作。而且布局可以存储和再展现。 vue-grid-layout是一个功能强大的瀑布流布局组件。支持用户拖拽和对改变元素大小,并提供相应的事件进行自定义操作。而且布局可以存储和再展现。 showImg(https://segmentfault.com/img/bVTyGO?w=688&h=400);...

    lordharrd 评论0 收藏0
  • 拖拽的vue树形组件

    摘要:工作上需要一个可以操作数据的组件,查阅了网上有组件可以满足我的要求,但是毕竟项目是用写的,所以参考着用实现了这个组件功能。 工作上需要一个可以操作json数据的组件,查阅了网上有angular组件可以满足我的要求,但是毕竟项目是用vue写的,所以参考着用vue实现了这个组件功能。 期间发现angular和vue的侧重点有点区别,angular比较擅长直接操作dom,但是我用vue是直接...

    Scholer 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<