zoukankan      html  css  js  c++  java
  • 一款很不错的Js控制div层拖动/拖放代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>一款很不错的Js控制div层拖动/拖放代码</title>
    </head>

    <body>

    <script>

    var isIE = (document.all) ? true : false;
    // Demo by /
    var $ = function (id) {
     return "string" == typeof id ? document.getElementById(id) : id;
    };

    var Class = {
     create: function() {
      return function() { this.initialize.apply(this, arguments); }
     }
    }

    var Extend = function(destination, source) {
     for (var property in source) {
      destination[property] = source[property];
     }
    }

    var Bind = function(object, fun) {
     return function() {
      return fun.apply(object, arguments);
     }
    }

    var BindAsEventListener = function(object, fun) {
     return function(event) {
      return fun.call(object, (event || window.event));
     }
    }

    var CurrentStyle = function(element){
     return element.currentStyle || document.defaultView.getComputedStyle(element, null);
    }

    // Demo by /
    function addEventHandler(oTarget, sEventType, fnHandler) {
     if (oTarget.addEventListener) {
      oTarget.addEventListener(sEventType, fnHandler, false);
     } else if (oTarget.attachEvent) {
      oTarget.attachEvent("on" + sEventType, fnHandler);
     } else {
      oTarget["on" + sEventType] = fnHandler;
     }
    };

    function removeEventHandler(oTarget, sEventType, fnHandler) {
        if (oTarget.removeEventListener) {
            oTarget.removeEventListener(sEventType, fnHandler, false);
        } else if (oTarget.detachEvent) {
            oTarget.detachEvent("on" + sEventType, fnHandler);
        } else { 
            oTarget["on" + sEventType] = null;
        }
    };

    //拖放程序
    var Drag = Class.create();
    Drag.prototype = {
      //拖放对象
      initialize: function(drag, options) {
     this.Drag = $(drag);//拖放对象
     this._x = this._y = 0;//记录鼠标相对拖放对象的位置
     this._marginLeft = this._marginTop = 0;//记录margin
     //事件对象(用于绑定移除事件)
     this._fM = BindAsEventListener(this, this.Move);
     this._fS = Bind(this, this.Stop);
     
     this.SetOptions(options);
     // Demo by /
     this.Limit = !!this.options.Limit;
     this.mxLeft = parseInt(this.options.mxLeft);
     this.mxRight = parseInt(this.options.mxRight);
     this.mxTop = parseInt(this.options.mxTop);
     this.mxBottom = parseInt(this.options.mxBottom);
     
     this.LockX = !!this.options.LockX;
     this.LockY = !!this.options.LockY;
     this.Lock = !!this.options.Lock;
     
     this.onStart = this.options.onStart;
     this.onMove = this.options.onMove;
     this.onStop = this.options.onStop;
     
     this._Handle = $(this.options.Handle) || this.Drag;
     this._mxContainer = $(this.options.mxContainer) || null;
     
     this.Drag.style.position = "absolute";
     //透明
     if(isIE && !!this.options.Transparent){
      //填充拖放对象
      with(this._Handle.appendChild(document.createElement("div")).style){
       width = height = "100%"; backgroundColor = "#fff"; filter = "alpha(opacity:0)"; fontSize = 0;
      }
     }
     //修正范围
     this.Repair();
     addEventHandler(this._Handle, "mousedown", BindAsEventListener(this, this.Start));
      },
      //设置默认属性
      SetOptions: function(options) {
     this.options = {//默认值
      Handle:   "",//设置触发对象(不设置则使用拖放对象)
      Limit:   false,//是否设置范围限制(为true时下面参数有用,可以是负数)
      mxLeft:   0,//左边限制
      mxRight:  9999,//右边限制
      mxTop:   0,//上边限制
      mxBottom:  9999,//下边限制
      mxContainer: "",//指定限制在容器内
      LockX:   false,//是否锁定水平方向拖放
      LockY:   false,//是否锁定垂直方向拖放
      Lock:   false,//是否锁定
      Transparent: false,//是否透明
      onStart:  function(){},//开始移动时执行
      onMove:   function(){},//移动时执行
      onStop:   function(){}//结束移动时执行
     };
     Extend(this.options, options || {});
      },
      //准备拖动
      Start: function(oEvent) {
     if(this.Lock){ return; }
     this.Repair();
     //记录鼠标相对拖放对象的位置
     this._x = oEvent.clientX - this.Drag.offsetLeft;
     this._y = oEvent.clientY - this.Drag.offsetTop;
     //记录margin
     this._marginLeft = parseInt(CurrentStyle(this.Drag).marginLeft) || 0;
     this._marginTop = parseInt(CurrentStyle(this.Drag).marginTop) || 0;
     //mousemove时移动 mouseup时停止
     addEventHandler(document, "mousemove", this._fM);
     addEventHandler(document, "mouseup", this._fS);
     if(isIE){
      //焦点丢失
      addEventHandler(this._Handle, "losecapture", this._fS);
      //设置鼠标捕获
      this._Handle.setCapture();
     }else{
      //焦点丢失
      addEventHandler(window, "blur", this._fS);
      //阻止默认动作
      oEvent.preventDefault();
     };
     //附加程序
     this.onStart();
      },
      //修正范围
      Repair: function() {
     if(this.Limit){
      //修正错误范围参数
      this.mxRight = Math.max(this.mxRight, this.mxLeft + this.Drag.offsetWidth);
      this.mxBottom = Math.max(this.mxBottom, this.mxTop + this.Drag.offsetHeight);
      //如果有容器必须设置position为relative或absolute来相对或绝对定位,并在获取offset之前设置
      !this._mxContainer || CurrentStyle(this._mxContainer).position == "relative" || CurrentStyle(this._mxContainer).position == "absolute" || (this._mxContainer.style.position = "relative");
     }
      },
      //拖动
      Move: function(oEvent) {
     //判断是否锁定
     if(this.Lock){ this.Stop(); return; };
     //清除选择
     window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
     //设置移动参数
     var iLeft = oEvent.clientX - this._x, iTop = oEvent.clientY - this._y;
     //设置范围限制
     if(this.Limit){
      //设置范围参数
      var mxLeft = this.mxLeft, mxRight = this.mxRight, mxTop = this.mxTop, mxBottom = this.mxBottom;
      //如果设置了容器,再修正范围参数
      if(!!this._mxContainer){
       mxLeft = Math.max(mxLeft, 0);
       mxTop = Math.max(mxTop, 0);
       mxRight = Math.min(mxRight, this._mxContainer.clientWidth);
       mxBottom = Math.min(mxBottom, this._mxContainer.clientHeight);
      };
      //修正移动参数
      iLeft = Math.max(Math.min(iLeft, mxRight - this.Drag.offsetWidth), mxLeft);
      iTop = Math.max(Math.min(iTop, mxBottom - this.Drag.offsetHeight), mxTop);
     }
     //设置位置,并修正margin
     if(!this.LockX){ this.Drag.style.left = iLeft - this._marginLeft + "px"; }
     if(!this.LockY){ this.Drag.style.top = iTop - this._marginTop + "px"; }
     //附加程序
     this.onMove();
      },
      //停止拖动
      Stop: function() {
     //移除事件
     removeEventHandler(document, "mousemove", this._fM);
     removeEventHandler(document, "mouseup", this._fS);
     if(isIE){
      removeEventHandler(this._Handle, "losecapture", this._fS);
      this._Handle.releaseCapture();
     }else{
      removeEventHandler(window, "blur", this._fS);
     };
     //附加程序
     this.onStop();
      }
    };
    </script>

    <style>
    #idContainer{ border:10px solid #990000; 600px; height:300px;}
    #idDrag{ border:5px solid #C4E3FD; background:#C4E3FD; 50px; height:50px; top:50px; left:50px;}
    #idHandle{cursor:move; height:25px; background:#0000FF; overflow:hidden;}
    </style>

    <div id="idContainer">
    <div id="idDrag"><div id="idHandle"></div></div>
    </div>

    <input id="idReset" type="button" value="复位" />
    <input id="idLock" type="button" value="锁定" />
    <input id="idLockX" type="button" value="锁定水平" />
    <input id="idLockY" type="button" value="锁定垂直" />
    <input id="idLimit" type="button" value="范围锁定" />
    <input id="idLimitOff" type="button" value="取消范围锁定" />
    <br />拖放状态:<span id="idShow">未开始</span>

    <script>
    var drag = new Drag("idDrag", { mxContainer: "idContainer", Handle: "idHandle", Limit: true,
     onStart: function(){ $("idShow").innerHTML = "开始拖放"; },
     onMove: function(){ $("idShow").innerHTML = "left:"+this.Drag.offsetLeft+";top:"+this.Drag.offsetTop; },
     onStop: function(){ $("idShow").innerHTML = "结束拖放"; }
    });

    $("idReset").onclick = function(){
     drag.Limit = true;
     drag.mxLeft = drag.mxTop = 0;
     drag.mxRight = drag.mxBottom = 9999;
     drag.LockX = drag.LockY = drag.Lock = false;
    }

    $("idLock").onclick = function(){ drag.Lock = true; }
    $("idLockX").onclick = function(){ drag.LockX = true; }
    $("idLockY").onclick = function(){ drag.LockY = true; }
    $("idLimit").onclick = function(){  drag.mxRight = drag.mxBottom = 200;drag.Limit = true; }
    $("idLimitOff").onclick = function(){ drag.Limit = false; }
    </script>

    </body>
    </html>
    <p align="center">本特效收集于互联网,只为兴趣与学习交流,不作商业用途。</p>
  • 相关阅读:
    CCF CSP 题解
    CCF CSP 2019032 二十四点
    CCF CSP 2018121 小明上学
    CCF CSP 2019092 小明种苹果(续)
    CCF CSP 2019091 小明种苹果
    CCF CSP 2019121 报数
    CCF CSP 2019031 小中大
    CCF CSP 2020061 线性分类器
    CCF CSP 2020062 稀疏向量
    利用国家气象局的webservice查询天气预报(转载)
  • 原文地址:https://www.cnblogs.com/top5/p/1848535.html
Copyright © 2011-2022 走看看