移动端盒子拖动效果(有效,坑已踩)(自定义指令)

思路:
1、把要拖动的元素进行相对定位,通过改变定位的px数值来实现拖动效果。
2、通过移动端手指触摸屏幕事件来计算px的值。

实现步骤:

方法一:全局封装
1、建个js文件,将方法封装成vue自定义指令
import Vue from 'vue';
// 1.参数一:指令的名称,定义时指令前面不需要写v-
// 2.参数二:是一个对象,该对象中有相关的操作函数
// 3.在调用的时候必须写v-

const drag = Vue.directive('drag', {
  // 2.每个
  // inserted表示一个元素,插入到DOM中会执行inserted函数,只触发一次,
  // 函数中第一个参数永远是el,表示绑定指令的元素,el参数是原生js对象
  // 注意:通过el.focus()是无法获取焦点的,因为只有插入DOM后才生效
  inserted: function (el) {
    // 1.开会触摸屏幕
    el.ontouchstart = function (e) {
      let disx = e.targetTouches[0].pageX - el.offsetLeft;
      let disy = e.targetTouches[0].pageY - el.offsetTop;
      let maxTop = document.body.clientHeight - el.offsetHeight
      let maxLeft = document.body.clientWidth - el.offsetWidth
      // 2.手指持续移动
      document.ontouchmove = function (e) {
        let left = e.targetTouches[0].pageX - disx
        let top = e.targetTouches[0].pageY - disy
        // 设置上下左右边界
        if (top <= 0) {
          top = 0
        } else if (top > maxTop) {
          top =  `${maxTop}px`
        }else {
          top = `${top}px`
        }
        if (left <= 0) {
          left = 0
        } else if (left > maxLeft) {
          left =  `${maxLeft}px`
        }else {
          left = `${left}px`
        }
        el.style.top = top
        el.style.left = left
      }
      // 3.手指离开屏幕
      document.ontouchend = function (e) {
        // 这里必须要清除,否则点击别的元素也会触发拖动
        document.ontouchmove = document.ontouchend = null;
      }
    }
  }
})
export default drag;
2、在要使用的vue文件内引用封装的js文件,并给要拖动的元素添加自定义指令即可
<template>
  <!-- 拖拽元素 -->
  <div class="goinvoice" >
    <div class="main" v-drag ></div>
  </div>
</template>

<script>
import drag from './drag'

export default {}
</script>

<style>
  .goinvoice {
    width: 100%;
    height: 100%;
    position: fixed;
    left: 0;
    top: 0;
    background: rgba(0, 0, 0, 0.5);
    z-index: 100;
  }
  .main {
    width: 100px;
    height: 100px;
    background: white;
    position: absolute;
    top: 28%;
    left: 50%;
    z-index: 101;
    padding: 10px;
    border-radius: 2px;
  }
</style>
方法二:组件内封装(可用于有eslint校验的项目)
1、封装
export default {
  directives: {
    drag: {
      inserted: function (el) {
        // 1.开会触摸屏幕
        el.ontouchstart = function (e) {
          let disx = e.targetTouches[0].pageX - el.offsetLeft
          let disy = e.targetTouches[0].pageY - el.offsetTop
          let maxTop = document.body.clientHeight - el.offsetHeight
          let maxLeft = document.body.clientWidth - el.offsetWidth
          // 2.手指持续移动
          document.ontouchmove = function (e) {
            let left = e.targetTouches[0].pageX - disx
            let top = e.targetTouches[0].pageY - disy
            // 设置上下左右边界
            if (top <= 0) {
              top = 0
            } else if (top > maxTop) {
              top = `${maxTop}px`
            } else {
              top = `${top}px`
            }
            if (left <= 0) {
              left = 0
            } else if (left > maxLeft) {
              left = `${maxLeft}px`
            } else {
              left = `${left}px`
            }
            el.style.top = top
            el.style.left = left
          }
          // 3.手指离开屏幕
          document.ontouchend = function (e) {
            // 这里必须要清除,否则点击别的元素也会触发拖动
            document.ontouchmove = document.ontouchend = null
          }
        }
      }
    }
  },
  
}
2、使用
<template>
  <!-- 拖拽元素 -->
  <div class="goinvoice" >
    <div class="main" v-drag ></div>
  </div>
</template>

<style>
  .goinvoice {
    width: 100%;
    height: 100%;
    position: fixed;
    left: 0;
    top: 0;
    background: rgba(0, 0, 0, 0.5);
    z-index: 100;
  }
  .main {
    width: 100px;
    height: 100px;
    background: white;
    position: absolute;
    top: 28%;
    left: 50%;
    z-index: 101;
    padding: 10px;
    border-radius: 2px;
  }
</style>

注意:
pc端只需要把手指触摸屏幕的三个事件改成鼠标对应的三个事件,pageX 、pageY的获取方式也改一下即可e.pageX

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现小方块的拖拽效果,可以通过自定义指令来实现。以下是实现步骤: 1. 在指令中绑定拖拽元素的事件监听器,包括mousedown、mousemove和mouseup事件。 2. 在mousedown事件中记录鼠标按下时的位置和拖拽元素的初始位置。 3. 在mousemove事件中计算鼠标移动的距离,并将拖拽元素的位置进行相应的调整。 4. 在mouseup事件中清除事件监听器。 下面是一个实现小方块拖拽效果自定义指令的示例代码: ```javascript // 注册自定义指令 Vue.directive('drag', { bind: function (el, binding, vnode) { // 记录拖拽元素的初始位置 var initX, initY, startX, startY; // 鼠标按下时的事件处理函数 function mouseDownHandler(e) { initX = el.offsetLeft; initY = el.offsetTop; startX = e.clientX; startY = e.clientY; // 添加事件监听器 document.addEventListener('mousemove', mouseMoveHandler); document.addEventListener('mouseup', mouseUpHandler); } // 鼠标移动时的事件处理函数 function mouseMoveHandler(e) { var deltaX = e.clientX - startX; var deltaY = e.clientY - startY; // 计算拖拽元素的新位置 var newX = initX + deltaX; var newY = initY + deltaY; // 设置拖拽元素的新位置 el.style.left = newX + 'px'; el.style.top = newY + 'px'; } // 鼠标松开时的事件处理函数 function mouseUpHandler() { // 移除事件监听器 document.removeEventListener('mousemove', mouseMoveHandler); document.removeEventListener('mouseup', mouseUpHandler); } // 添加鼠标按下事件监听器 el.addEventListener('mousedown', mouseDownHandler); } }); ``` 使用该指令时,只需要在需要实现拖拽效果的小方块元素上添加v-drag指令即可: ```html <div v-drag class="drag-box"></div> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值