VUE可随意拖动的弹窗组件

为了解决Vue项目中缺少可自由拖动窗口的问题,本文介绍了一个简单的自定义Vue组件,该组件允许用户通过鼠标拖动调整窗口位置,并提供了关闭按钮及确认取消操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  背景:项目需要,我们引入了前端框架就是目前最流行的框架之一vue,同时引入了一套由饿了吗维护的ui库,由于我们是在pc端使用发现它竟然没有提供可随意拖动的窗口,可能用的更多的时移动端吧吧,于是就随手写了一个,比较简单吧,但是做过的就会知道也是有一些小小的技巧,记录下吧留作备用。

  由于不是很难,就不做过多解释了,直接上代码:

  

  1 <template>
  2   <el-container v-bind:id="id"
  3                 v-if="dialogVisible">
  4     <el-header>
  5       <div @mousedown="mousedown">
  6         <h2 v-html="title"></h2>
  7         <div @click.stop="closeDialog()" style="position: absolute;top: 0px; right: 20px;">
  8         <span>
  9           <svg class="icon" aria-hidden="false">
 10             <use xlink:href='#el-icon-ext-close'></use>
 11           </svg>
 12         </span>
 13         </div>
 14       </div>
 15     </el-header>
 16     <el-main>
 17       <slot>这里是内容</slot>
 18     </el-main>
 19     <el-footer>
 20       <span class="dialog-footer">
 21         <el-button @click="closeDialog">取 消</el-button>
 22         <el-button type="primary" @click="closeDialog">确 定</el-button>
 23       </span>
 24     </el-footer>
 25   </el-container>
 26 </template>
 27 
 28 <script>
 29   export default {
 30     name: 'Window',
 31     props: {
 32       titlex: String,
 33       id: [String, Number]
 34     },
 35     data() {
 36       return {
 37         title: '标题',
 38         selectElement: ''
 39       }
 40     },
 41     computed: {
 42       dialogVisible: {
 43         get: function () {
 44           return this.$store.state.dialogVisible
 45         },
 46         set: function (newValue) {
 47           this.$store.commit('newDialogVisible', newValue)
 48         }
 49       }
 50     },
 51     methods: {
 52       closeDialog(e) {
 53         this.dialogVisible = false
 54         // alert(this.dialogVisible)
 55         this.$store.commit('newDialogVisible', false)
 56       },
 57       mousedown(event) {
 58         this.selectElement = document.getElementById(this.id)
 59         var div1 = this.selectElement
 60         this.selectElement.style.cursor = 'move'
 61         this.isDowm = true
 62         var distanceX = event.clientX - this.selectElement.offsetLeft
 63         var distanceY = event.clientY - this.selectElement.offsetTop
 64         // alert(distanceX)
 65         // alert(distanceY)
 66         console.log(distanceX)
 67         console.log(distanceY)
 68         document.onmousemove = function (ev) {
 69           var oevent = ev || event
 70           div1.style.left = oevent.clientX - distanceX + 'px'
 71           div1.style.top = oevent.clientY - distanceY + 'px'
 72         }
 73         document.onmouseup = function () {
 74           document.onmousemove = null
 75           document.onmouseup = null
 76           div1.style.cursor = 'default'
 77         }
 78       }
 79     }
 80   }
 81 </script>
 82 
 83 <style scoped>
 84   .el-container {
 85     position: absolute;
 86     height: 500px;
 87     width: 500px;
 88     border: 1px;
 89     top: 20%;
 90     left: 35%;
 91     border-radius: 2px;
 92   }
 93 
 94   .dialog-footer {
 95     text-align: right;
 96   }
 97 
 98   .el-main {
 99     background-color: white;
100   }
101 
102   .el-footer {
103     background-color: white;
104   }
105 
106   .el-header {
107     background-color: white;
108     color: #333;
109     line-height: 60px;
110   }
111 
112   .el-aside {
113     color: #333;
114   }
115 </style>

  备注:解决了鼠标拖动过快移除窗口后终端问题,其它优点请自测,如有问题请留言!

  版权声明:本博文有DarkFeng原创,欢迎转载、学习、讨论,翻版不究

转载于:https://www.cnblogs.com/higiser/p/9340237.html

Vue3是最新版本的Vue.js框架,它具有更强大的功能和性能优化,可以实现可拖动弹窗的封装。 首先,我们可以利用Vue3的自定义指令来实现拖动效果。首先在弹窗组件中添加一个容器元素,用来表示弹窗的位置和大小。然后,在该容器元素上添加一个自定义指令,比如"v-draggable"。在该自定义指令中,我们可以通过监听鼠标事件来实现拖动功能。当鼠标按下时,记录当前鼠标的位置坐标,并监听鼠标移动事件,不断地更新弹窗容器的位置坐标。最后,在鼠标松开的时候,停止拖动。 接下来,我们可以为弹窗组件添加一些控制按钮,比如关闭按钮和最小化按钮。这些按钮可以通过Vue3的事件绑定来实现对应的功能。例如,点击关闭按钮后,可以通过触发一个"close"事件来关闭弹窗。 此外,我们还可以利用Vue3的响应式数据和计算属性来实现弹窗的位置和大小自动调整。通过监听窗口大小变化的事件,并实时更新弹窗容器的位置和大小,使之适应不同的显示设备和分辨率。 最后,为了防止拖动时超出边界的情况,我们可以在自定义指令中添加一些边界限制的判断逻辑,以确保弹窗不会超出容器范围。 综上所述,通过Vue3的自定义指令、事件绑定、响应式数据和计算属性,我们可以很方便地封装一个可拖动弹窗组件,并且可以根据需要添加其他功能和样式,以满足不同的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值