직접 캡슐화한 기본 JS 드래그 방법(권장)

高洛峰
풀어 주다: 2016-12-05 17:24:39
원래의
1332명이 탐색했습니다.

코드:

function drag(t,p){
 
  var point = p || null,
    target = t || null,
    resultX = 0,
    resultY = 0;
 
  (!point)? point = target : ''; //如果没有拖动点,则拖动点默认为整个别拖动元素
 
  function getPos(t){
    var offsetLeft = 0,
      offsetTop = 0,
      offsetParent = t;
 
    while(offsetParent){
      offsetLeft+=offsetParent.offsetLeft;
      offsetTop+=offsetParent.offsetTop;
      offsetParent = offsetParent.offsetParent;
    }
 
    return {'top':offsetTop,'left':offsetLeft};
  }
 
  function core(){
 
    var width = document.body.clientWidth || document.documentElement.clientWidth,
      height = document.body.clientHeight || document.documentElement.clientHeight; 
      maxWidth = width - target.offsetWidth,
      maxHeight = height - target.offsetHeight;
 
    (resultX >= maxWidth)? target.style.left = maxWidth+'px' : (resultX > 0)?target.style.left = resultX +'px': ''; //重置默认位置。
    (resultY >= maxHeight)?  target.style.top = maxHeight +'px' : (resultY > 0)?target.style.top = resultY +'px':''; //重置默认位置。
 
    point.onmousedown=function(e){  
      var e = e || window.event,
        coordX = e.clientX,
        coordY = e.clientY,
        posX = getPos(target).left,
        posY = getPos(target).top;
 
      point.setCapture && point.setCapture();  //将Mouse事件锁定到指定元素上。
      document.onmousemove=function(e){
 
        var ev = e || window.event,
          moveX = ev.clientX,
          moveY = ev.clientY;
 
        resultX = moveX - (coordX - posX); //结果值是坐标点减去被拖动元素距离浏览器左侧的边距
        resultY = moveY - (coordY - posY);
 
        (resultX > 0 )?((resultX < maxWidth)?target.style.left = resultX+&#39;px&#39; : target.style.left = maxWidth+&#39;px&#39;) : target.style.left = &#39;0px&#39;; 
        (resultY > 0 )?((resultY < maxHeight)?target.style.top = resultY+&#39;px&#39; : target.style.top = maxHeight+&#39;px&#39;) : target.style.top = &#39;0px&#39;; 
 
        ev.stopPropagation && ev.stopPropagation(); 
        ev.preventDefault;
        ev.returnValue = false;
        ev.cancelBubble = true;
      };
    };
    document.onmouseup=function(){  // 解决拖动时,当鼠标指向的DOM对象非拖动点元素时,无法触发拖动点的onmousedown的BUG。
      document.onmousemove = null;  
      point.releaseCapture && point.releaseCapture();  // 将Mouse事件从指定元素上移除。
    };
    point.onmouseup=function(e){
      var e = e || window.event;
      document.onmousemove = null;
      point.releaseCapture && point.releaseCapture();
    };
  }
  core();
  window.onresize = core;  
}
로그인 후 복사

사용법:

drag(t,p)
/* 
 * 说明 
 * t 表示被拖动的元素
 * p 表示拖动点
*/
 
// 注意:如果省略拖动点,默认可拖动的区域是整个被拖动元素
로그인 후 복사


관련 라벨:
js
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿