基于vue实现可拖动弹框

el-dialog弹框拖拽

  1. 在 utils 中新建 directives.js 文件
import Vue from 'vue'// 自定义元素实现弹框拖拽[重点]
Vue.directive('draw', {inserted: function (el, binding, vNode) {el.setAttribute('style', 'position: fixed; z-index: 9999')},bind: function (el, bindding, vNode) {el.setAttribute('draggable', true)let left, top, width, heightel._dragstart = function (event) {event.stopPropagation()left = event.clientX - el.offsetLefttop = event.clientY - el.offsetTopwidth = el.offsetWidthheight = el.offsetHeight}el._checkPosition = function () { // 防止被拖出边界let width = el.offsetWidthlet height = el.offsetHeightlet left = Math.min(el.offsetLeft, document.body.clientWidth - width)left = Math.max(0, left)let top = Math.min(el.offsetTop, document.body.clientHeight - height)top = Math.max(0, top)el.style.left = left + 'px'el.style.top = top + 'px'el.style.width = width + 'px'el.style.height = height + 'px'}el._dragEnd = function (event) {event.stopPropagation()left = event.clientX - lefttop = event.clientY - topel.style.left = left + 'px'el.style.top = top + 'px'el.style.width = width + 'px'el.style.height = height + 'px'el._checkPosition()}el._documentAllowDraop = function (event) {event.preventDefault()}document.body.addEventListener('dragover', el._documentAllowDraop)el.addEventListener('dragstart', el._dragstart)el.addEventListener('dragend', el._dragEnd)window.addEventListener('resize', el._checkPosition)},unbind: function (el, bindding, vNode) {document.body.removeEventListener('dragover', el._documentAllowDraop)el.removeEventListener('dragstart', el._dragstart)el.removeEventListener('dragend', el._dragEnd)window.removeEventListener('resize', el._checkPosition)delete el._documentAllowDraopdelete el._dragstartdelete el._dragEnddelete el._checkPosition}
})// 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.offsetLeftconst disY = e.clientY - dialogHeaderEl.offsetTop// 获取到的值带px 正则匹配替换let styL, styT// 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为pxif (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 - disXconst 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 = nulldocument.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.offsetLeftdocument.onmousemove = function (e) {e.preventDefault() // 移动时禁用默认事件// 通过事件委托,计算移动的距离const l = e.clientX - disXdragDom.style.width = `${l}px`}document.onmouseup = function (e) {document.onmousemove = nulldocument.onmouseup = null}}}
})
  1. main.js中导入:import ‘./utils/directives.js’
  2. 使用 el-dialog 的地方加入 v-dialogDrag
<el-dialog:visible.sync="dialogVisible"v-dialogDrag>// ...</el-dialog>

自定义元素弹框拖拽(重点)

自定义指令的内容,请见utils 中新建 directives.js 文件

 <template><div class="home"><div class="drag" v-draw>可拖动窗口</div></div>
</template><style scoped>
.drag {min-width: 240px;min-height: 400px;background: #d0def8;display: flex;align-items: center;justify-content: center;
}
</style>

参考文章:

实现在vue中element-ui的el-dialog弹框拖拽

自定义元素弹框拖拽

基于vue实现可拖动弹框相关推荐

  1. vue可视化拖拽生成工具_vdesjs: 基于vue的可视化拖拽,代码生成工具。提升前端开发效率,或者集成至项目作为在线拖拽工具。(持续迭代升级中)...

    vdesjs 介绍 vdesjs是一款基于vue技术栈,可视化拖拽,代码生成工具.我们提供详细的文档来帮助您理解我们工具的实现原理,并且您可以方便的基于vdesjs来扩展您自己的代码生成组件. 技术选 ...

  2. vue实现搜索框搜索新增_基于Vue.js实现简单搜索框

    主要用到的知识很简单,简单的vuejs2.0的知识就够了.源码用了.vue构建和ES6,用了webpack打包等等.我资历还浅,先用一个简单的.js的写. 先看效果 这里有两个组件,一个组件是logo ...

  3. 基于Vue实现表格拖拽排序——sortablejs

    表格拖拽排序 1.安装插件 2.页面引入sortablejs 3.准备表格渲染所需的数据 4.绘制表格结构(要绑定唯一的值row-key,不然会出错) 5.完成表格行与列的拖拽排序事件 1.安装插件 ...

  4. vue 移动到图片浮动_基于Vue实现拖拽升级(九宫格拖拽)

    前言 在本文中将会用Vue完成九宫格拖拽效果,同时介绍一下网格布局.具体代码以及demo可以点以下超链接进入 效果实例 Demo 简单了解Grid布局(网格布局) 什么是网格布局 CSS网格布局(又称 ...

  5. 基于Vue实现拖拽效果以及解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突

    本人在开发中遇到实现一个基于vue的悬浮框拖动效果,经过努力研究最终实现了功能,一下是我的方法和部分代码,希望对您有所帮助,如有不对的地方还请指出.谢谢!下面步入正题: 首先展示一下功能的效果图: 要 ...

  6. vuedraggable能实现自由拖拽功能吗?_基于 vue.js 仿禅道主页拖拽效果

    今天给大家分享一个超不错的Vue仿禅道首页拖拽布局VueDndKon. vue-dnd-kon 基于vuedraggable实现的仿禅道首页拖拽项目.支持模块上下及左右自由拖动布局. 主页分为左右两栏 ...

  7. 一个基于vue和element-ui的树形穿梭框组件

    el-tree-transfer 简介 因为公司业务使用vue框架,ui库使用的element-ui.在市面上找到一个好用的vue树形穿梭框组件都很难,又不想仅仅因为一个穿梭框在element-ui之 ...

  8. 基于vue与element-ui写出的关于搜索框搜索关键字,下方关键字高亮的demo

    这是一个基于vue与element-ui写出的关于搜索框搜索关键字,下方关键字高亮的demo 希望对大家有所帮助 效果如下: <template><!-- 测试 -->< ...

  9. Vue使用基于element-ui的el-tree-fransfer树形穿梭框组件

    el-tree-fransfer 是一个基于 VUE 和 element-ui 的树形穿梭框组件,使用前请确认已经引入element-ui 官网npm文档:https://www.npmjs.com/ ...

  10. 基于vue element-ui 封装上传图片组件 功能:上传,删除,预览,上传图片水印,拖拽排序,上传进度条等

    学习目标: 我们在开发后台时肯定避免不了上传图片的功能 例如: 上传图片回显 上传完成 : 预览查看 , 删除等 如果是图片列表,还可能让你拖动图片排序 有的后台项目可能要给图片添加水印,添加标记 有 ...

最新文章

  1. python如何读取excel数据-使用Python读取电子表格中的数据
  2. dubbo配置文件加载顺序
  3. 第一章 TensorFlow基础——python语法(一)
  4. 11.1.2 DOM
  5. jboss架构_检查Red Hat JBoss BRMS部署架构的规则和事件(第一部分)
  6. 软件测试java三角形形状判定,软件测试技术基础实验——Junit 安装与 三角形问题的测试...
  7. 【Source Insight 】之marco学习笔记2
  8. 保存命令行输出信息到log的方法(ubunut下和arm-linux下有效)
  9. 英语句型之综合运用篇
  10. win7网络改局域网计算机名,局域网共享一键修复工具(支持win7) 修复windows7各种共享问题...
  11. 情侣博客源码php,wordpress如何搭建简单的情侣博客
  12. STEAM 正在检查可用更新 ,失败
  13. 人工智能在智能制造中的应用
  14. Ubuntu 安装 brightness-controller 调节显示亮度
  15. 一文讲清楚机械硬盘和固态硬盘的工作原理
  16. elementui中表格的表头设置背景颜色
  17. 计算机软件服务票可以抵扣吗,航天的软件技术维护费是否可以全额抵扣?
  18. 女孩取名:带日字旁好听有内涵的女孩名字
  19. Redis过期时间及过期策略
  20. 什么软件可以剪辑音乐?

热门文章

  1. 行为主义心理学在游戏领域的10年发展
  2. ubuntu局域网服务器搭建网站,ubuntu搭建局域网dns服务器
  3. 内置式永磁同步电机IPMSM,基于虚拟信号注入法最大转矩电流比MTPA控制仿真模型
  4. vrep与vs2015联合仿真(C/C++)
  5. 轻松入门微信小程序云开发(详细)
  6. 静态代码分析工具大全
  7. Python给gif图片加文字水印
  8. QTreeView的使用(四)
  9. Java的图标和由来
  10. QT QML 3D模型查看器