亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

javascript實現拖放效果

2019-11-20 11:00:36
字體:
來源:轉載
供稿:網友

本文實例為大家分享的是一個拖放的效果,參考的代碼,重構以下,加以理解學習。

首先來看效果:

拖動div

     

拖放狀態:未開始 

【程序說明】

拖動原理:其實就是在拖動塊上監聽mousedown事件,鼠標點擊時,通過事件對象獲取對應的坐標參數。然后鼠標移動時再監聽document上的mousemove事件,獲取鼠標的clientX 和clientY坐標然后設置拖動塊的left 和 top。

首先是監聽mousedown事件

復制代碼 代碼如下:
EventUtil.addEventHandler(this.Drag, "mousedown", BindAsEventListener(this, this.Start));

然后在Start上添加mousemove 和 mouseup 事件

//監聽mousemove 和 mouseup事件EventUtil.addEventHandler(document, "mousemove", this._fM);EventUtil.addEventHandler(document, "mouseup", this._fS);

鼠標移動時,設置拖動塊的left 和 top 屬性 :

if(!this.LockX)this.Drag.style.left = iLeft + "px"; if(!this.LockY)this.Drag.style.top = iTop + "px"; 

水平和垂直鎖定:通過判斷LockX 和lockY屬性來限制對于的top 和 left 屬性即可。

范圍限制鎖定:通過計算容器的寬高和拖動塊的寬高差值來設定最大left值和top值,來限制拖動塊的left值和top值會在一定的范圍里。

完整DEMO:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>JavaScript拖放效果</title> <style type="text/css">   </style></head><body> <div id="drag-wrap" style="height: 300px;margin:10px;border:5px solid #FF8000;background:#8080C0;position: relative;">   <div class="draggable" id="drag" style="width:100px;height: 100px;position: absolute;top: 100px;left:100px;background:#eee;border:1px solid #aceaac;cursor: move;">拖動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 type="text/javascript">  /**   *工具函數   */   var isIE = (document.all) ? true : false ;    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 BindAsEventListener = function(object,func){   return function(event){    return func.call(object,event || window.event);   }  };   var Bind = function(object,func){   return function(){    return func.apply(object,arguments);   }  };    /**   *跨瀏覽器事件對象   */  var EventUtil = {   //事件注冊處理程序   addEventHandler:function(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;     }    },    //事件移除處理程序    removeEventHandler:function(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;     }    },    getEvent:function(event){     return event ? event : window.event;    },    getTarget:function(event){     return event.target || event.srcElement;    }  };    /**   *拖放程序   */   var Drag= Class.create();    Drag.prototype = {    //初始化對象    initialize:function(drag,options){     this.Drag = $$(drag);//拖放對象     this._x = this._y = 0;//記錄鼠標相對于拖放對象的位置     //事件對象(用于綁定移除事件)     this._fM = BindAsEventListener(this, this.Move);    this._fS = Bind(this, this.Stop);    this.Drag.style.position = "absolute";    this.marginLeft = this.marginTop = 0;//記錄margin    //設置參數    this.setOptions(options);    //獲取相關參數及類型轉換    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.Lock = !!this.options.Lock;    this.LockX = !!this.options.LockX;    this.LockY = !!this.options.LockY;     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;    //監聽拖動對象mousedown事件    EventUtil.addEventHandler(this.Drag, "mousedown", BindAsEventListener(this, this.Start));     },    //準備拖動     Start:function(oEvent){     if(this.Lock){return;}//如果鎖定則不執行     //記錄mousedown觸發時鼠標相對于拖放對象的位置     this._x = oEvent.clientX - this.Drag.offsetLeft;    this._y = oEvent.clientY - this.Drag.offsetTop;    //監聽mousemove 和 mouseup事件    EventUtil.addEventHandler(document, "mousemove", this._fM);    EventUtil.addEventHandler(document, "mouseup", this._fS);    },     //拖動    Move:function(oEvent){     //設置移動參數     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);     }     //XY鎖定     if(!this.LockX)this.Drag.style.left = iLeft + "px";    if(!this.LockY)this.Drag.style.top = iTop + "px";    //執行附加程序    this.onMove();    },    //停止拖動    Stop:function(){    EventUtil.removeEventHandler(document, "mousemove", this._fM);    EventUtil.removeEventHandler(document, "mouseup", this._fS);    //執行附加程序    this.onStop();    },    //設置默認參數    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 || {});    }   };   //初始化拖動對象  var drag = new Drag('drag',{mxContainer:'drag-wrap',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;   $$("idShow").innerHTML = "復位";  }  $$("idLock").onclick = function(){ drag.Lock = true;$$("idShow").innerHTML = "鎖定全部";}  $$("idLockX").onclick = function(){ drag.LockX = true; $$("idShow").innerHTML = "鎖定水平";}  $$("idLockY").onclick = function(){ drag.LockY = true; $$("idShow").innerHTML = "鎖定垂直";}  $$("idLimit").onclick = function(){  drag.mxRight = drag.mxBottom = 200;drag.Limit = true;$$("idShow").innerHTML = "范圍鎖定"; }  $$("idLimitOff").onclick = function(){ drag.Limit = false; $$("idShow").innerHTML = "取消范圍鎖定";} </script></body></html>

以上就是javascript實現拖放效果的代碼,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产视频精品一区二区三区| 精品成人在线视频| 国产精品高潮呻吟久久av野狼| 国产精品久久久久免费a∨大胸| 日韩av综合网站| 欧美激情18p| 中文字幕一区电影| 亚洲精品国产精品国自产在线| 色爱av美腿丝袜综合粉嫩av| 亚洲精品v欧美精品v日韩精品| 国产在线拍偷自揄拍精品| 国产不卡一区二区在线播放| 国产福利精品在线| 日韩av中文字幕在线免费观看| 永久555www成人免费| 91国内揄拍国内精品对白| 国产香蕉97碰碰久久人人| 国产精品白嫩初高中害羞小美女| 国产精品露脸自拍| 亚洲a∨日韩av高清在线观看| 欧美午夜视频在线观看| 日韩欧美一区二区三区久久| 亚洲天堂男人天堂女人天堂| 成人精品一区二区三区电影黑人| 欧美午夜精品久久久久久浪潮| 国产精品久久久久高潮| 欧美尺度大的性做爰视频| 成人免费视频xnxx.com| 国产综合福利在线| 在线观看日韩视频| 国产伦精品一区二区三区精品视频| 亚洲第一福利视频| 成人免费在线视频网址| 国产精品香蕉av| 欧美一二三视频| 性欧美视频videos6一9| 国产精品扒开腿爽爽爽视频| 国产亚洲精品久久久久久777| 66m—66摸成人免费视频| 18久久久久久| 国产精品丝袜一区二区三区| 欧美性猛交xxx| 亚洲欧美成人精品| 成人欧美一区二区三区在线湿哒哒| 亚洲情综合五月天| 亚洲欧洲xxxx| 国产精品人成电影在线观看| 精品亚洲国产成av人片传媒| 国产视频自拍一区| 亚洲激情电影中文字幕| 亚洲欧美激情四射在线日| 日本国产一区二区三区| 亚洲人成在线播放| 欧美日本国产在线| 亚洲国产成人久久综合一区| 亚洲人成网站免费播放| 亚洲天堂av在线播放| 国产精品久久9| 日韩电影中文字幕在线观看| 欧美自拍大量在线观看| 影音先锋欧美在线资源| 亚洲美女久久久| 黑丝美女久久久| 久久免费少妇高潮久久精品99| 日韩免费中文字幕| 日本久久精品视频| 国产区精品视频| 国产精品久久久久久久久久| 欧美激情精品久久久久久| 中文字幕日韩欧美在线视频| 国产午夜一区二区| 亚洲精品成人久久电影| 欧美大片va欧美在线播放| 欧美二区乱c黑人| 色小说视频一区| 欧美性猛交xxxx偷拍洗澡| 欧美黄色成人网| 精品一区精品二区| 少妇高潮久久久久久潘金莲| 91性高湖久久久久久久久_久久99| 国产一区二区三区丝袜| 欧美激情视频一区二区| 亚洲国产精品高清久久久| 亚洲国产欧美久久| 91理论片午午论夜理片久久| 国产中文字幕亚洲| 久久伊人91精品综合网站| 久久影视电视剧凤归四时歌| 日韩精品免费在线| 欧美日韩亚洲一区二| 一区二区在线视频播放| 色悠久久久久综合先锋影音下载| 成人精品一区二区三区电影黑人| www.日韩不卡电影av| 日韩成人中文字幕| 久久国产精品视频| 国产一区二区黄| 日韩av在线影视| 色婷婷综合成人| 国模精品一区二区三区色天香| 精品美女国产在线| 6080yy精品一区二区三区| 亚洲综合在线中文字幕| 秋霞成人午夜鲁丝一区二区三区| 欧美黑人性猛交| 欧美乱妇40p| 日韩免费av在线| 亚洲国产成人av在线| 日韩高清有码在线| 色偷偷88888欧美精品久久久| 亚洲国产精品悠悠久久琪琪| 一本色道久久88精品综合| 久久久国产91| 国产精品久久久久久久久久| 国产视频综合在线| 91日本在线观看| 欧美激情一区二区三区在线视频观看| 欧美精品激情视频| 国模精品一区二区三区色天香| 日韩在线观看电影| 91精品国产综合久久男男| 奇米影视亚洲狠狠色| 欧美性极品xxxx做受| 欧美剧在线观看| 国产日本欧美一区二区三区在线| 中文字幕久久精品| 国产日产久久高清欧美一区| 亚洲国产欧美久久| 亚洲乱亚洲乱妇无码| 欧美国产高跟鞋裸体秀xxxhd| 69av视频在线播放| 91精品国产高清| 狠狠色香婷婷久久亚洲精品| 欧洲成人免费aa| 欧美日韩精品在线观看| 国产一区二区动漫| 中文字幕日韩精品有码视频| 日韩av影视在线| 日本一区二区三区在线播放| 性金发美女69hd大尺寸| 亚洲电影免费观看高清完整版在线| www.亚洲一区| 中文字幕亚洲情99在线| 精品少妇一区二区30p| 亚洲性av在线| 国产精品劲爆视频| 久久久成人的性感天堂| 97国产精品免费视频| 欧美日韩国产专区| 欧美尺度大的性做爰视频| 九色精品美女在线| 在线播放日韩av| 俺去啦;欧美日韩| 久久久久久久久中文字幕| 国产精品专区一| 亚洲欧美在线免费观看| 国产成人高清激情视频在线观看| 视频在线观看一区二区| 91久久国产精品| 日韩精品中文字| 欧美成人午夜剧场免费观看| 日韩美女视频中文字幕| 成人精品一区二区三区电影黑人| 亚洲第一中文字幕|