js (vue、react)通用元素任意拖拽效果

22 篇文章 0 订阅
21 篇文章 2 订阅
// 可拖拽组件:pc和Mobile
function useMove(el) {
  el.style.position = 'fixed';
  let offsetX, offsetY, oL, oT, oLeft, oTop;
  const browser = {
      versions: function () {
          const u = navigator.userAgent;
          return {
              mobile: !!u.match(/AppleWebKit.*Mobile.*/), //判断设备
              //  ..... 其他设备信息
          };
      }(),
  }
  if (!browser.versions.mobile) {//Pc
      if (el != null) {
          el.addEventListener('mousedown', function (event) {
              if (event.button == 0 && el != null) {
                  const lexObj = getComputedStyle(el);
                  offsetX = event.pageX - el.offsetLeft + parseInt(lexObj['margin-left']);
                  offsetY = event.pageY - el.offsetTop + parseInt(lexObj['margin-right']);
                  const move = function (event) {
                      if (el != null) {
                          let x = event.pageX - offsetX;
                          let y = event.pageY - offsetY;
                          if (x < 0) {
                              x = 0;
                          } else if (x > document.documentElement.clientWidth - el.offsetWidth) {
                              x = document.documentElement.clientWidth - el.offsetWidth
                          }
                          if (y < 0) {
                              y = 0;
                          } else if (y > document.documentElement.clientHeight - el.offsetHeight) {
                              y = document.documentElement.clientHeight - el.offsetHeight
                          }
                          el.style.left = x + 'px';
                          el.style.top = y + 'px';
                      }
                      return false;
                  }
                  document.addEventListener('mousemove', move);
                  const stop = function () {
                      document.removeEventListener('mousemove', move);
                      document.removeEventListener('mouseup', stop);
                  }
                  document.addEventListener('mouseup', stop);
              }
              return false;
          });
      }
  } else { //Mobile
      if (el != null) {
          const maxW = document.body.clientWidth - el.offsetWidth;
          const maxH = document.body.clientHeight - el.offsetHeight;
          const defaultEvent = function (e) {
              e.preventDefault();
          }
          el.addEventListener('touchstart', function (e) {
              const ev = e || window.event;
              const touch = ev.targetTouches[0];
              oL = touch.clientX - el.offsetLeft;
              oT = touch.clientY - el.offsetTop;
              document.addEventListener("touchmove", defaultEvent, false);
              el.addEventListener('touchmove', function (e) {
                  const ev = e || window.event;
                  const touch = ev.targetTouches[0];
                  oLeft = touch.clientX - oL;
                  oTop = touch.clientY - oT;
                  if (oLeft < 0) {
                      oLeft = 0;
                  } else if (oLeft >= maxW) {
                      oLeft = maxW;
                  }
                  if (oTop < 0) {
                      oTop = 0;
                  } else if (oTop >= maxH) {
                      oTop = maxH;
                  }
                  el.style.left = oLeft + 'px';
                  el.style.top = oTop + 'px';
              });
              el.addEventListener('touchend', function () {
                  document.removeEventListener("touchmove", defaultEvent);
              });
          });
      }
  }
}


export default useMove;

 使用:useMove(this.$refs["attributeInput"].$el);

基于原生html5的拖拽插件
Sortable.js中文网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值