请教一个问题:移动设备ipad弹窗拖拽怎样实现?

发布于 2022-09-12 00:10:15 字数 2693 浏览 25 评论 0

PC端参照网上代码,移动端一直没有实现成功。

export default {  
  bind (el, binding, vnode) {  
    const dialogHeaderEl = el.querySelector('.el-dialog\_\_header')  
    const dragDom = el.querySelector('.el-dialog')  
    dialogHeaderEl.style.cssText += ';cursor:move;'  
    dragDom.style.cssText += ';top:0px;'  
  
    // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);  
    const getStyle = (function () {  
      if (window.document.currentStyle) {  
        return (dom, attr) => dom.currentStyle\[attr\]  
      } else {  
        return (dom, attr) => getComputedStyle(dom, false)\[attr\]  
      }  
    })()  
  
    dialogHeaderEl.ontouchstart = e => {  
      // 鼠标按下,计算当前元素距离可视区的距离  
      const disX = e.touches\[0\].clientX - dialogHeaderEl.offsetLeft;  
      const disY = e.touches\[0\].clientY - dialogHeaderEl.offsetTop;  
  
      const dragDomWidth = dragDom.offsetWidth  
      const dragDomHeight = dragDom.offsetHeight  
  
      const screenWidth = document.body.clientWidth  
      const screenHeight = document.body.clientHeight  
  
      //不能超出可视区  
      const minDragDomLeft = dragDom.offsetLeft  
      const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth  
  
      const minDragDomTop = dragDom.offsetTop  
      const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomHeight  
  
      // 获取到的值带px 正则匹配替换  
      let styL = getStyle(dragDom, 'left')  
      let styT = getStyle(dragDom, 'top')  
  
      if (styL.includes('%')) {  
        styL = +document.body.clientWidth \* (+styL.replace(/\\%/g, '') / 100)  
        styT = +document.body.clientHeight \* (+styT.replace(/\\%/g, '') / 100)  
      } else {  
        styL = +styL.replace(/\\px/g, '')  
        styT = +styT.replace(/\\px/g, '')  
      }  
  
      document.ontouchmove = e => {  
        // 通过事件委托,计算移动的距离  
        let left = e.touches\[0\].clientX - disX  
        let top = e.touches\[0\].clientY - disY  
  
        // 边界处理  
        if (-left > minDragDomLeft) {  
          left = -minDragDomLeft  
        } else if (left > maxDragDomLeft) {  
          left = maxDragDomLeft  
        }  
  
        if (-top > minDragDomTop) {  
          top = -minDragDomTop  
        } else if (top > maxDragDomTop) {  
          top = maxDragDomTop  
        }  
  
        // 移动当前元素  
        dragDom.style.cssText += \`;left:${left + styL}px;top:${top + styT}px;\`  
  
        // emit onDrag event  
        vnode.child.$emit('dragDialog')  
      }  
  
      document.ontouchend = function (e) {  
        document.ontouchmove = null  
        document.ontouchend = null  
      }  
    }  
  }  
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文