ElementUI的el-dialog鼠标拖拽

news/2024/7/10 2:28:10 标签: vue, ElementUI, el-dialog拖拽

拖拽依然是原生js写的,只不过搞起来一个自定义指令,在src文件夹下新建一个文件夹存放这个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`
      }

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

然后在main.js中引入:

import './common/drag.js'

然后在组件里使用,加上v-dialogDrag

<el-dialog
  title="提示"
  :visible.sync="dialogVisible"
   v-dialogDrag
  width="400px">
    <div>您确定退出当前账号吗?</div>
    <span slot="footer" class="dialog-footer">
        <el-button @click="dialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="sureExit">确 定</el-button>
    </span>
</el-dialog>

就可以啦


http://www.niftyadmin.cn/n/1845508.html

相关文章

【老孟Flutter】2020年总结

2020年是我经历的最不平凡的一年&#xff0c;这一年有遗憾、有收获&#xff0c;有感概&#xff0c;也有庆幸&#xff0c;庆幸自己还活着。 用一句话总结自己的2020&#xff0c;忙并收获着&#xff0c;累并快乐着。 《Flutter 实战入门》 《Flutter 实战入门》是我第一本出版…

【老孟Flutter】Stateful 组件的生命周期​

老孟导读&#xff1a;关于生命周期的文章共有2篇&#xff0c;第一篇是介绍 Flutter 中Stateful 组件的生命周期。 博客地址&#xff1a;http://laomengit.com/blog/20201227/Stateful%E7%BB%84%E4%BB%B6%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.html 第二篇是 Flutter 中与平台相…

组队项目

此次组队完成“爱吖”音乐播放器这个项目&#xff0c;在团队中我负责的主要任务是收集&#xff0c;整理&#xff0c;修订&#xff0c;完善项目需求文档。需求文档的主要内容如下&#xff1a; 1.项目准备 1.1项目的目的和范围 1.1.1项目开发背景 影音播放是智能手机的中的重要组…

ElmentUI全局禁止点击遮罩层关闭el-dialog弹窗

在mian.js里面&#xff1a; import ElementUI from element-ui; // 修改 el-dialog 默认点击遮照为不关闭 ElementUI.Dialog.props.closeOnClickModal.default false;

ASP.NET MVC的TextBoxFor()和TextBox()

先来看看2者的语法&#xff1a;TextBoxFor():MvcHtmlString Html.TextBoxFor(Expression<Func<TModel,TValue>> expression, object htmlAttributes) TextBox():MvcHtmlString Html.TextBox(string name, string value, object htmlAttributes) 下面Insus.NET举个列…

【老孟Flutter】Flutter 中与平台相关的生命周期

老孟导读&#xff1a;关于生命周期的文章共有2篇&#xff0c;一篇&#xff08;此篇&#xff09;是介绍 Flutter 中Stateful 组件的生命周期。 第二篇是 Flutter 中与平台相关的生命周期&#xff0c; 博客地址&#xff1a;http://laomengit.com/blog/20201227/%E7%9B%B8%E5%85%B…

Vue+elementUI动态渲染折叠导航el-menu

这是官网上对折叠菜单的示例&#xff1a; 我的项目需求就是这样&#xff0c;开始用&#xff1a; // 折叠按钮 <span click"isCollapse !isCollapse" title"菜单"></span>// 这些属性都在官网可查 <el-menu:default-active"active…

【教程】使用XML注解CSharp代码内容

Microsoft 官方文档链接&#xff1a;XML 文档注释 编程平台&#xff1a;Visual Studio 2022 编程语言&#xff1a;CSharp   一、为什么有此文章 如果说写程序是为了达到某种实现效果目的而做的事情&#xff0c;那么写注释是为了将代码负责的托付给下一位。&#xff08;当然也…