jQuery使用drag效果實(shí)現(xiàn)自由拖拽div
偶然間看到了以前做的一個(gè)簡潔的div拖拽效果,修改了一下加點(diǎn)注釋,經(jīng)測試完美通過firefox/chrome/ie6-11,現(xiàn)拿來分享一下。
先說一下實(shí)現(xiàn)原理及要點(diǎn),最主要的有三步。第一步是mousedown事件,鼠標(biāo)mousedown的時(shí)候記錄此時(shí)的鼠標(biāo)X軸和Y軸以及拖拽框的left和top,并且給拖拽標(biāo)記賦值true,代表拖拽動作就緒。第二步是mousemove事件,此時(shí)動態(tài)獲取鼠標(biāo)的X軸和Y軸,然后計(jì)算出來拖拽框新的left和top并賦值使其實(shí)現(xiàn)拖拽效果。第三步是mouseup事件,鼠標(biāo)彈起時(shí)給拖拽標(biāo)記賦值false,拖拽動作完成。
html代碼如下:
<div class="divWrap" id="move1" style="width: 200px; height: 200px; background: Green; border: 1px solid red; position: absolute; top: 100px; left: 100px; cursor: move; -moz-user-select: none; -webkit-user-select: none;"></div> <div class="divWrap" style="width: 200px; height: 200px; background: brown; border: 1px solid red; position: absolute; top: 300px; left: 100px;"> <h3 id="move2" style="height: 45px; line-height: 45px; font-size: 18px; background: red; margin: 0; cursor: move; -moz-user-select: none; -webkit-user-select: none;">Title--Move</h3> </div>
js代碼如下:
(function($) { $.fn.dragDiv = function(divWrap) { return this.each(function() { var $divMove = $(this);//鼠標(biāo)可拖拽區(qū)域 var $divWrap = divWrap ? $divMove.parents(divWrap) : $divMove;//整個(gè)移動區(qū)域 var mX = 0, mY = 0;//定義鼠標(biāo)X軸Y軸 var dX = 0, dY = 0;//定義div左、上位置 var isDown = false;//mousedown標(biāo)記 if(document.attachEvent) {//ie的事件監(jiān)聽,拖拽div時(shí)禁止選中內(nèi)容,firefox與chrome已在css中設(shè)置過-moz-user-select: none; -webkit-user-select: none; $divMove[0].attachEvent('onselectstart', function() { return false; }); } $divMove.mousedown(function(event) { var event = event || window.event; mX = event.clientX; mY = event.clientY; dX = $divWrap.offset().left; dY = $divWrap.offset().top; isDown = true;//鼠標(biāo)拖拽啟動 }); $(document).mousemove(function(event) { var event = event || window.event; var x = event.clientX;//鼠標(biāo)滑動時(shí)的X軸 var y = event.clientY;//鼠標(biāo)滑動時(shí)的Y軸 if(isDown) { $divWrap.css({"left": x - mX + dX, "top": y - mY + dY});//div動態(tài)位置賦值 } }); $divMove.mouseup(function() { isDown = false;//鼠標(biāo)拖拽結(jié)束 }); }); }; })(jQuery); // $(document).ready(function() { $("#move1").dragDiv();//拖拽整個(gè)div $("#move2").dragDiv(".divWrap");//拖拽div頭部 });
最后要說明一下,在開始拖拽動作之前,要禁止選中內(nèi)容,否則影響拖拽效果。firefox和chrome可以通過css來設(shè)置:{-moz-user-select: none; -webkit-user-select: none;},ie本來也可以直接在html里寫一個(gè)onselectstart="return false",但似乎chrome受了點(diǎn)影響,所以決定取消這個(gè)寫法,然后在js里為ie瀏覽器寫一個(gè)onselectstart事件。
這個(gè)小插件只是簡單實(shí)現(xiàn)拖拽效果,但兼容性很好,里面也用到了一些知識點(diǎn)和技巧。當(dāng)然也可以借助這個(gè)插件或里面的思想繼續(xù)擴(kuò)展,寫一個(gè)比較完善的拖拽插件(如:Draggable和Droppable)。
以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。
- jQuery 移動端拖拽(模塊化開發(fā),觸摸事件,webpack)
- jQuery拖拽通過八個(gè)點(diǎn)改變div大小
- jQuery實(shí)現(xiàn)div拖拽效果實(shí)例分析
- jQuery div拖拽用法實(shí)例
- jQuery控制Div拖拽效果完整實(shí)例分析
- jquery實(shí)現(xiàn)拖拽調(diào)整Div大小
- jQuery拖拽div實(shí)現(xiàn)思路
- jquery實(shí)現(xiàn)div拖拽寬度示例代碼
- JQuery Dialog(JS 模態(tài)窗口,可拖拽的DIV)
- Jquery實(shí)現(xiàn)移動端控制DIV拖拽
相關(guān)文章
使用jQuery給Table動態(tài)增加行、清空table的方法
這篇文章主要介紹了使用jQuery給Table動態(tài)增加行、清空table的方法,非常不錯,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09jQuery Checkbox 全選 反選的簡單實(shí)例
本文主要介紹了Checkbox的全選、反選的簡單實(shí)例,需要的朋友可以參考下2016-11-11jQuery右側(cè)選項(xiàng)卡焦點(diǎn)圖片輪播特效代碼分享
這篇文章主要介紹了jQuery右側(cè)選項(xiàng)卡焦點(diǎn)圖片輪播特效,一段清新可愛的焦點(diǎn)圖輪播代碼,有需要的小伙伴可以參考下2015-09-09Jquery 點(diǎn)擊按鈕自動高亮實(shí)現(xiàn)原理及代碼
拓展一個(gè)點(diǎn)擊按鈕自動高亮的原理很簡單,在點(diǎn)擊的時(shí)候給元素加上一個(gè)自定義的attr,具體實(shí)現(xiàn)祥看本文2014-04-04Jquery+ajax+JAVA(servlet)實(shí)現(xiàn)下拉菜單異步取值
這篇文章主要介紹了Jquery+ajax+JAVA(servlet)實(shí)現(xiàn)下拉菜單異步取值的相關(guān)資料,需要的朋友可以參考下2016-03-03