近日項目中要做一個鼠標拖拽層的效果,於是手動使用Jquery做了一個,發出來跟大伙兒分享一下,並希望能得到高手的指點,如果哪位大俠覺得我的思路和代碼不正確或者需要改進的話,希望能指點一二,在下感激不盡。
我的思路是這樣的:
1、在鼠標按下的時候,捕獲鼠標的當前位置;
2、得到要移動對象的當前位置信息;
3、鼠標移動時,計算鼠標移動的距離,將這個距離更新到對象的位置,在我的代碼中,我試用絕對定位來表示對象的位置;
4、當鼠標移出對象或者鼠標彈起的時候,則認為對象處於不能移動的狀態。這個在我的代碼中使用一個bool類型的變量isMouseDown表示,當這個變量為true的時候,則說明對象處於可移動狀態,如果為false的時候,表示對象處於不可移動狀態。鼠標移出對象或者彈出的時候,就將isMouseDown置為false。
好了,思路就是這樣,下面將代碼貼出來,如果我的思路中表達的不清楚的話,可以在代碼中看出來:
注:依照樓下的建議調整了一下代碼,基本上兼容瀏覽器,但是鼠標移動太快的時候就會出現不能移動,這一點如果有哪位大俠知道的話還請指點一下
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml" > 3 <head> 4 <title>使用鼠標拖動層代碼</title> 5 <style type="text/css"> 6 #Main 7 { 8 width:400px; 9 height:400px; 10 position:absolute; 11 top:10px; 12 left:0; 13 border:1px solid #CCC; 14 border-radius:5px; 15 background-color:Green; 16 } 17 h3 18 { 19 margin:0; 20 width:400px; 21 height:40px; 22 background-color:Gray; 23 cursor:move; 24 line-height:40px; 25 border-radius:5px 5px 0 0; 26 } 27 </style> 28 <script type="text/javascript" src="http://code.jquery.com/jquery-1.8.3.min.js"></script> 29 <script type="text/javascript"> 30 //注冊一個Jquery的鼠標拖動函數,參數為要拖動的對象 31 $.fn.extend({ SliderObject: function (objMoved) { 32 var mouseDownPosiX; 33 var mouseDownPosiY; 34 var InitPositionX; 35 var InitPositionY; 36 var obj = $(objMoved) == undefined ? $(this) : $(objMoved); 37 $(this).mousedown(function (e) { 38 //當鼠標按下時捕獲鼠標位置以及對象的當前位置 39 mouseDownPosiX = e.pageX; 40 mouseDownPosiY = e.pageY; 41 42 InitPositionX = obj.css("left").replace("px", ""); 43 InitPositionY = obj.css("top").replace("px", ""); 44 obj.mousemove(function (e) {//這個地方改成$(document).mousemove貌似可以避免因鼠標移動太快而失去焦點的問題 45 //貌似只有IE支持這個判斷,Chrome和Firefox還沒想到好的辦法 46 //if ($(this).is(":focus")) { 47 var tempX = parseInt(e.pageX) - parseInt(mouseDownPosiX) + parseInt(InitPositionX); 48 var tempY = parseInt(e.pageY) - parseInt(mouseDownPosiY) + parseInt(InitPositionY); 49 obj.css("left", tempX + "px").css("top", tempY + "px"); 50 //}; 51 //當鼠標彈起或者離開元素時,將鼠標彈起置為false,不移動對象 52 }).mouseup(function () { 53 obj.unbind("mousemove"); 54 }).mouseleave(function () { 55 obj.unbind("mousemove"); 56 }); 57 }) 58 } 59 }); 60 $(document).ready(function () { 61 $("h3").SliderObject($("#Main")); 62 }) 63 </script> 64 </head> 65 <body> 66 <div id="Main"> 67 <h3>鼠標放在這里拖動我</h3> 68 <div id="Container">可以使用鼠標拖動的層</div> 69 </div> 70 </body> 71 </html>