利用vue自定义指令directive实现拖动elementUI的dialog

叁歲伎倆 2021-12-20 00:39 388阅读 0赞
  1. <template>
  2. <el-dialog :visible.sync="testDialog" title="测试弹框拖拽" v-dialogDrag="{ x: transformX, y: transformY }" :close-on-click-modal="false" :append-to-body="true" :modal-append-to-body="true">
  3. </el-dialog>
  4. </template>
  5. <script>
  6. Vue.directive('dialogDrag', {
  7. bind(el, binding, vnode, oldVnode) {
  8. // 获取拖拽内容头部
  9. const dialogHeaderEl = el.querySelector('.el-dialog__header');
  10. const dragDom = el.querySelector('.el-dialog');
  11. dragDom.style.transform="translate("+binding.value.x+"px,"+binding.value.y+"px)";
  12. dialogHeaderEl.style.cursor = 'move';
  13. // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
  14. const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null);
  15. // 鼠标按下事件
  16. dialogHeaderEl.onmousedown = (e) => {
  17. // 鼠标按下,计算当前元素距离可视区的距离 (鼠标点击位置距离可视窗口的距离)
  18. const disX = e.clientX - dialogHeaderEl.offsetLeft;
  19. const disY = e.clientY - dialogHeaderEl.offsetTop;
  20. // 获取到的值带px 正则匹配替换
  21. let styL, styT;
  22. // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
  23. if (sty.left.includes('%')) {
  24. styL = +document.body.clientWidth * (+sty.left.replace(/\%/g, '') / 100)+binding.value.x;
  25. styT = +document.body.clientHeight * (+sty.top.replace(/\%/g, '') / 100)+binding.value.y;
  26. } else {
  27. styL = +sty.left.replace(/\px/g, '')+binding.value.x;
  28. styT = +sty.top.replace(/\px/g, '')+binding.value.y;
  29. };
  30. // 鼠标拖拽事件
  31. document.onmousemove = function (e) {
  32. // 通过事件委托,计算移动的距离 (开始拖拽至结束拖拽的距离)
  33. const l = e.clientX - disX;
  34. const t = e.clientY - disY;
  35. let finallyL = l + styL;
  36. let finallyT = t + styT;
  37. // 边界值判定 注意clientWidth scrollWidth区别 要减去之前的top left值
  38. if (finallyL < 0) {顶部
  39. finallyL = 0
  40. } else if (finallyL > dragDom.offsetParent.clientWidth - dragDom.clientWidth) {///底部
  41. finallyL = dragDom.offsetParent.clientWidth - dragDom.clientWidth
  42. }
  43. if (finallyT < 0) {顶部
  44. finallyT = 0
  45. } else if (finallyT > dragDom.offsetParent.clientHeight - dragDom.clientHeight) (///底部
  46. finallyT = dragDom.offsetParent.clientHeight - dragDom.clientHeight
  47. )
  48. binding.value.x=finallyL;
  49. binding.value.y=finallyT;
  50. dragDom.style.transform="translate("+finallyL+"px,"+finallyT+"px)";
  51. //将此时的位置传出去
  52. //binding.value({x:e.pageX,y:e.pageY})
  53. };
  54. document.onmouseup = function (e) {
  55. document.onmousemove = null;
  56. document.onmouseup = null;
  57. };
  58. }
  59. }
  60. })
  61. export default {
  62. name: "testDialog",
  63. data(){
  64. return{
  65. testDialog:true,
  66. transformX:100,
  67. transformY:200
  68. }
  69. },
  70. methods:{
  71. open:function () {
  72. this.testDialog=true
  73. }
  74. }
  75. }
  76. </script>
  77. <style>
  78. .el-dialog{
  79. margin: 0 !important;
  80. /*transform: translate(366px, 140px);*/
  81. }
  82. </style>

网上实现的demo挺多的,这里主要是使用

  1. transform: translate(x,y)来实现移动

发表评论

表情:
评论列表 (有 0 条评论,388人围观)

还没有评论,来说两句吧...

相关阅读