麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > JavaScript > 正文

原生js實(shí)現(xiàn)拖拽功能基本思路詳解

2019-11-19 14:00:17
字體:
供稿:網(wǎng)友

如果要設(shè)置物體拖拽,那么必須使用三個(gè)事件,并且這三個(gè)事件的使用順序不能顛倒。

1.onmousedown:鼠標(biāo)按下事件
2.onmousemove:鼠標(biāo)移動(dòng)事件
3.onmouseup:鼠標(biāo)抬起事件

  拖拽的基本原理就是根據(jù)鼠標(biāo)的移動(dòng)來移動(dòng)被拖拽的元素。鼠標(biāo)的移動(dòng)也就是x、y坐標(biāo)的變化;元素的移動(dòng)就是style.position的 top和left的改變。當(dāng)然,并不是任何時(shí)候移動(dòng)鼠標(biāo)都要造成元素的移動(dòng),而應(yīng)該判斷鼠標(biāo)左鍵的狀態(tài)是否為按下狀態(tài),是否是在可拖拽的元素上按下的。

基本思路如下:

拖拽狀態(tài) = 0鼠標(biāo)在元素上按下的時(shí)候{     拖拽狀態(tài) = 1     記錄下鼠標(biāo)的x和y坐標(biāo)     記錄下元素的x和y坐標(biāo)     }   鼠標(biāo)在元素上移動(dòng)的時(shí)候{     如果拖拽狀態(tài)是0就什么也不做。     如果拖拽狀態(tài)是1,那么     元素y = 現(xiàn)在鼠標(biāo)y - 原來鼠標(biāo)y + 原來元素y     元素x = 現(xiàn)在鼠標(biāo)x - 原來鼠標(biāo)x + 原來元素x     }     鼠標(biāo)在任何時(shí)候放開的時(shí)候{     拖拽狀態(tài) = 0   } 

部分實(shí)例代碼:

HTML部分

<div class="calculator" id="drag">**********</div> 

CSS部分

calculator {   position: absolute; /*設(shè)置絕對(duì)定位,脫離文檔流,便于拖拽*/   display: block;   width: 218px;   height: 280px;   cursor: move;  /*鼠標(biāo)呈拖拽狀*/ } 

JS部分

window.onload = function() {   //拖拽功能(主要是觸發(fā)三個(gè)事件:onmousedown/onmousemove/onmouseup)   var drag = document.getElementById('drag');   //點(diǎn)擊某物體時(shí),用drag對(duì)象即可,move和up是全局區(qū)域,也就是整個(gè)文檔通用,應(yīng)該使用document對(duì)象而不是drag對(duì)象(否則,采用drag對(duì)象時(shí)物體只能往右方或下方移動(dòng))   drag.onmousedown = function(e) {     var e = e || window.event; //兼容ie瀏覽器     var diffX = e.clientX - drag.offsetLeft; //鼠標(biāo)點(diǎn)擊物體那一刻相對(duì)于物體左側(cè)邊框的距離=點(diǎn)擊時(shí)的位置相對(duì)于瀏覽器最左邊的距離-物體左邊框相對(duì)于瀏覽器最左邊的距離     var diffY = e.clientY - drag.offsetTop;     /*低版本ie bug:物體被拖出瀏覽器可是窗口外部時(shí),還會(huì)出現(xiàn)滾動(dòng)條,       解決方法是采用ie瀏覽器獨(dú)有的2個(gè)方法setCapture()/releaseCapture(),這兩個(gè)方法,       可以讓鼠標(biāo)滑動(dòng)到瀏覽器外部也可以捕獲到事件,而我們的bug就是當(dāng)鼠標(biāo)移出瀏覽器的時(shí)候,       限制超過的功能就失效了。用這個(gè)方法,即可解決這個(gè)問題。注:這兩個(gè)方法用于onmousedown和onmouseup中*/       if(typeof drag.setCapture!='undefined'){         drag.setCapture();       }     document.onmousemove = function(e) {       var e = e || window.event; //兼容ie瀏覽器       var left=e.clientX-diffX;       var top=e.clientY-diffY;       //控制拖拽物體的范圍只能在瀏覽器視窗內(nèi),不允許出現(xiàn)滾動(dòng)條       if(left<0){         left=0;       }else if(left >window.innerWidth-drag.offsetWidth){         left = window.innerWidth-drag.offsetWidth;       }       if(top<0){         top=0;       }else if(top >window.innerHeight-drag.offsetHeight){         top = window.innerHeight-drag.offsetHeight;       }       //移動(dòng)時(shí)重新得到物體的距離,解決拖動(dòng)時(shí)出現(xiàn)晃動(dòng)的現(xiàn)象       drag.style.left = left+ 'px';       drag.style.top = top + 'px';     };     document.onmouseup = function(e) { //當(dāng)鼠標(biāo)彈起來的時(shí)候不再移動(dòng)       this.onmousemove = null;       this.onmouseup = null; //預(yù)防鼠標(biāo)彈起來后還會(huì)循環(huán)(即預(yù)防鼠標(biāo)放上去的時(shí)候還會(huì)移動(dòng))       //修復(fù)低版本ie bug       if(typeof drag.releaseCapture!='undefined'){         drag.releaseCapture();       }     };   }; }; 

總結(jié)

以上所述是小編給大家介紹的原生js實(shí)現(xiàn)拖拽功能基本思路詳解,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)武林網(wǎng)網(wǎng)站的支持!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 九九热在线视频观看 | 羞羞羞羞视频 | 美国av片在线观看 | 国产精品性夜天天视频 | 成码无人av片在线观看网站 | 国产91对白叫床清晰播放 | 免费在线成人网 | 国产精品99一区二区 | 久久久免费电影 | 久色网站 | 黄色网址在线免费 | 久久久久久久亚洲精品 | 亚洲一区二区三区四区精品 | 久久97超碰 | 人人舔人人插 | 美女久久久久久久久 | 欧美一级做一a做片性视频 日韩黄色片免费看 | avlululu| 国产成人精品免高潮在线观看 | 亚洲成人福利在线 | 欧美77| 黄污网站在线 | av影片在线观看 | 精品黑人一区二区三区国语馆 | 狠狠干91 | 久久久久久久久久久国产精品 | 欧美日韩爱爱视频 | 精品偷拍久久 | 新久草在线视频 | av免费入口 | 中文字幕 亚洲一区 | 国产一区二区三区四 | 亚洲精品成人18久久久久 | 茄子福利视频 | 亚洲欧美日韩中文在线 | 国产一级片91| 国产一区精品在线观看 | 成人毛片在线免费看 | 超碰人人做人人爱 | 亚洲精品永久视频 | 国产91影院 |