vue 指令实现 窗口的拖动

直接上代码,

directives: {
      /*自定义拖拽*/
      drag: {
        inserted: function (el, binding, vnode) {
          var odiv = el.parentNode // 获取元素的父级 也就是这个移动的窗口
          el.onmousedown = function (eve) {
            eve = eve || window.event
            var mx = eve.pageX // 鼠标点击时的x坐标位置
            var my = eve.pageY // 鼠标点击时的y坐标位置
            var dleft = odiv.offsetLeft // 窗口初始的位置
            var dtop = odiv.offsetTop
            var clientWidth = document.documentElement.clientWidth // 页面的宽
            var oWidth = odiv.clientWidth // 窗口的宽度
            var maxX = clientWidth - oWidth // x轴能移动的最大距离
            var clientHeight = document.documentElement.clientHeight // 页面的高
            var oHeight = odiv.clientHeight // 窗口的高度
            var maxY = clientHeight - oHeight // y轴能移动的最大距离
            document.onmousemove = function (e) {
              e.preventDefault()
              var x = e.pageX // 移动时鼠标X坐标
              var y = e.pageY // 移动时鼠标Y坐标
              var left = x - mx + dleft // 移动后对话框新的left值
              var Top = y - my + dtop // 移动后对话框新的Top值
              if (left < 0) {
                left = 0
              }
              if (left > maxX) {
                left = maxX
              }
              if (Top < 0) {
                Top = 0
              }
              if (Top > maxY) {
                Top = maxY
              }
              odiv.style.left = left + 'px'
              odiv.style.top = Top + 'px'
              odiv.style.marginLeft = 0
              odiv.style.marginTop = 0
            }
            document.onmouseup = function () {
              document.onmouseup = ''
              document.onmousemove = ''
            }
          }
        },

在需要移动的窗口的子元素中绑定该指令,样式需要绝对定位

<div class="imgbox">
    <div v-drag class="content"></div>
</div>

 

实现vue窗口拖拽不要离开页面的功能,可以使用HTML5的drag事件和Vue指令结合实现。 首先,在窗口容器上添加v-drag指令,并在指令中绑定drag事件。 然后,在drag事件中实现窗口拖拽功能,并判断拖拽时是否超出页面边界。 具体代码如下: ```html <template> <div class="window" v-drag></div> </template> <script> export default { directives: { drag: { bind(el, binding) { let startX, startY, initialMouseX, initialMouseY; el.addEventListener("dragstart", function (e) { startX = el.offsetLeft; startY = el.offsetTop; initialMouseX = e.clientX; initialMouseY = e.clientY; e.dataTransfer.setDragImage(el, 0, 0); }); el.addEventListener("drag", function (e) { const dx = e.clientX - initialMouseX; const dy = e.clientY - initialMouseY; const offsetX = startX + dx; const offsetY = startY + dy; if ( offsetX >= 0 && offsetY >= 0 && offsetX + el.offsetWidth <= window.innerWidth && offsetY + el.offsetHeight <= window.innerHeight ) { el.style.left = offsetX + "px"; el.style.top = offsetY + "px"; } }); }, }, }, }; </script> <style> .window { position: absolute; width: 200px; height: 200px; background-color: #ccc; } </style> ``` 在上面的代码中,我们使用了HTML5的drag事件来实现窗口拖拽功能。在v-drag指令中绑定了dragstart和drag事件,分别用于获取窗口的初始位置和拖拽时的位置信息,并在drag事件中实现窗口拖拽效果。同时,我们还使用了offsetLeft、offsetTop、offsetWidth和offsetHeight等属性来判断窗口是否超出页面边界。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值