javascript鼠標(biāo)拖動層的JS方法
當(dāng)前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
Javascript 如何實現(xiàn)對象的拖動?
解決思路 這個效果并不算常見,通常用于游戲或個人站點中。因為拖曳是靠鼠標(biāo)來操作的,所以對鼠標(biāo)的位置的捕獲是問題的重點,然后才是根據(jù)鼠標(biāo)的位置設(shè)置層的位置。 具體步驟: 1.在對象(層)上按下鼠標(biāo)時,先捕獲到需要拖曳的對象,然后獲取或設(shè)置該對象的相關(guān)屬性。 obj=event.srcElement obj.setCapture() z=obj.style.zIndex obj.style.zIndex=100 x=event.offsetX y=event.offsetY down=true 2.開始拖曳時,捕獲鼠標(biāo)當(dāng)前位置,并根據(jù)該數(shù)值設(shè)置被拖曳對象的位置。 obj.style.posLeft=document.body.scrollLeft+event.x-x obj.style.posTop=document.body.scrollTop+event.y-y 3.拖曳完松開鼠標(biāo)后,重設(shè)標(biāo)志 down ,還原對象的 z-index并釋放對它的鼠標(biāo)捕捉。 down=false obj.style.zIndex=z obj.releaseCapture() 4.完整代碼。 <script> var x,y,z,down=false,obj function init(){ obj=event.srcElement //事件觸發(fā)對象 obj.setCapture() //設(shè)置屬于當(dāng)前對象的鼠標(biāo)捕捉 z=obj.style.zIndex //獲取對象的z軸坐標(biāo)值 //設(shè)置對象的z軸坐標(biāo)值為100,確保當(dāng)前層顯示在最前面 obj.style.zIndex=100 x=event.offsetX //獲取鼠標(biāo)指針位置相對于觸發(fā)事件的對象的X坐標(biāo) y=event.offsetY //獲取鼠標(biāo)指針位置相對于觸發(fā)事件的對象的Y坐標(biāo) down=true //布爾值,判斷鼠標(biāo)是否已按下,true為按下,false為未按下 } function moveit(){ //判斷鼠標(biāo)已被按下且onmouseover和onmousedown事件發(fā)生在同一對象上 if(down&&event.srcElement==obj){ with(obj.style){ /*設(shè)置對象的X坐標(biāo)值為文檔在X軸方向上的滾動距離加上當(dāng)前鼠標(biāo)指針相當(dāng)于文檔對象的X坐標(biāo)值減鼠標(biāo)按下時指針位置相對于觸發(fā)事件的對象的X坐標(biāo)*/ posLeft=document.body.scrollLeft+event.x-x /*設(shè)置對象的Y坐標(biāo)值為文檔在Y軸方向上的滾動距離加上當(dāng)前鼠標(biāo)指針相當(dāng)于文檔對象的Y坐標(biāo)值減鼠標(biāo)按下時指針位置相對于觸發(fā)事件的對象的Y坐標(biāo)*/ posTop=document.body.scrollTop+event.y-y } } } function stopdrag(){ //onmouseup事件觸發(fā)時說明鼠標(biāo)已經(jīng)松開,所以設(shè)置down變量值為false down=false obj.style.zIndex=z //還原對象的Z軸坐標(biāo)值 obj.releaseCapture() //釋放當(dāng)前對象的鼠標(biāo)捕捉 } </script> <div onmousedown=init() onmousemove=moveit() onmouseup=stopdrag() style="position:absolute;left:20;top:190;width:100;height:150;border:1px solid #000000;z-index:1;background:#eeeeee">Layer 1</div> <div onmousedown=init() onmousemove=moveit() onmouseup=stopdrag() style="position:absolute;left:60;top:10;width:100;height:150;border:1px solid #000000;z-index:2;background:#eeeeee">Layer 2</div> <div onmousedown=init() onmousemove=moveit() onmouseup=stopdrag() style="position:absolute;left:100;top:90;width:100;height:150;border:1px solid #000000;z-index:3;background:#eeeeee">Layer 3</div> 注意:只有 CSS 的 position 屬性值為 absolute 的對象才能進行拖動操作。 提示:如果需要將拖曳組件化,可以參考第二部分HTC一節(jié)。 技巧:可以在 init() 函數(shù)中加一句 event.cancelBubble=true ,以取消在該對象上的事件冒泡。 試一試:讀者可以試著實現(xiàn)移動其他對象,例如移動一個圖片或文本框。 特別提示 在拖曳對象前必須確保該對象的為絕對定位的,把上面的完整代碼保存就可以看到效果了,在實際就用時務(wù)必在對象上加上 onmousedown、onmousemove和onmouseup三個事件并觸發(fā)相應(yīng)函數(shù)。代碼運行效果如圖 3.8 所示。 圖 3.8 可拖動的層 特別說明 本例需要掌握的技巧比較多,捕捉鼠標(biāo),獲取鼠標(biāo)位置(相當(dāng)于對象),釋放鼠標(biāo)捕捉,文檔的滾動距離還有with 語句。 1. setCapture() 設(shè)置屬于當(dāng)前文檔的對象的鼠標(biāo)捕捉。 2. event.offsetX 設(shè)置或獲取鼠標(biāo)指針位置相對于觸發(fā)事件的對象的 x 坐標(biāo)。 3. event.offsetY 設(shè)置或獲取鼠標(biāo)指針位置相對于觸發(fā)事件的對象的 y 坐標(biāo)。 4. releaseCapture() 釋放當(dāng)前文檔中對象的鼠標(biāo)捕捉。 5. scrollLeft 設(shè)置或獲取位于對象左邊界和窗口中目前可見內(nèi)容的最左端之間的距離。 6. scrollTop 設(shè)置或獲取位于對象最頂端和窗口中可見內(nèi)容的最頂端之間的距離。 7. with 為一個或多個語句設(shè)定默認對象。 以下這個方法做出來的比較好看,并增加了層的幾個功能 3個不同高度的三維可拖動圖層的例子 ===================================================================== <html> <head> <title>_xWin</title> <style type='text/css'> <!-- a:visited{text-decoration:none;color:slategray;} a:hover{text-decoration:underline;color:slategray;} a:link{text-decoration:none;color:slategray;} --> </style> <script language=JScript> <!-- //可以打包為js文件; var x0=0,y0=0,x1=0,y1=0; var offx=6,offy=6; var moveable=false; var hover='orange',normal='slategray';//color; var index=10000;//z-index; //開始拖動; function startDrag(obj) { //鎖定標(biāo)題欄; obj.setCapture(); //定義對象; var win = obj.parentNode; var sha = win.nextSibling; //記錄鼠標(biāo)和層位置; x0 = event.clientX; y0 = event.clientY; x1 = parseInt(win.style.left); y1 = parseInt(win.style.top); //記錄顏色; normal = obj.style.backgroundColor; //改變風(fēng)格; obj.style.backgroundColor = hover; win.style.borderColor = hover; obj.nextSibling.style.color = hover; sha.style.left = x1 + offx; sha.style.top = y1 + offy; moveable = true; } //拖動; function drag(obj) { var win = obj.parentNode; var sha = win.nextSibling; if(moveable) { win.style.left = x1 + event.clientX - x0; win.style.top = y1 + event.clientY - y0; sha.style.left = parseInt(win.style.left) + offx; sha.style.top = parseInt(win.style.top) + offy; } } //停止拖動; function stopDrag(obj) { var win = obj.parentNode; var sha = win.nextSibling; win.style.borderColor = normal; obj.style.backgroundColor = normal; obj.nextSibling.style.color = normal; sha.style.left = obj.parentNode.style.left; sha.style.top = obj.parentNode.style.top; //放開標(biāo)題欄; obj.releaseCapture(); moveable = false; } //獲得焦點; function getFocus(obj) { index = index + 2; var idx = index; obj.style.zIndex=idx; obj.nextSibling.style.zIndex=idx-1; } function min(obj) { var win = obj.parentNode.parentNode; var sha = win.nextSibling; var tit = obj.parentNode; var msg = tit.nextSibling; var flg = msg.style.display=="none"; if(flg) { win.style.height = parseInt(msg.style.height) + parseInt(tit.style.height) + 2*2; sha.style.height = win.style.height; msg.style.display = "block"; obj.innerHTML = "0"; } else { win.style.height = parseInt(tit.style.height) + 2*2; sha.style.height = win.style.height; obj.innerHTML = "2"; msg.style.display = "none"; } } function cls(obj) { var win = obj.parentNode.parentNode; var sha = win.nextSibling; win.style.visibility = "hidden"; sha.style.visibility = "hidden"; } //創(chuàng)建一個對象; function xWin(id,w,h,l,t,tit,msg) { index = index+2; this.id = id; this.width = w; this.height = h; this.left = l; this.top = t; this.zIndex = index; this.title = tit; this.message = msg; this.obj = null; this.bulid = bulid; this.bulid(); } //初始化; function bulid() { var str = "" + "<div id=xMsg" + this.id + " " + "style='" + "z-index:" + this.zIndex + ";" + "width:" + this.width + ";" + "height:" + this.height + ";" + "left:" + this.left + ";" + "top:" + this.top + ";" + "background-color:" + normal + ";" + "color:" + normal + ";" + "font-size:10px;" + "font-family:Verdana;" + "position:absolute;" + "cursor:default;" + "border:2px solid " + normal + ";" + "' " + "onmousedown='getFocus(this)'>" + "<div " + "style='" + "background-color:" + normal + ";" + "width:" + (this.width-2*2) + ";" + "height:20;" + "color:white;" + "' " + "onmousedown='startDrag(this)' " + "onmouseup='stopDrag(this)' " + "onmousemove='drag(this)' " + ">" + "<span style='width:" + (this.width-2*12-4) + ";padding-left:3px;'>" + this.title + "</span>" + "<span style='width:12;border-width:0px;color:white;font-family:webdings;' onclick='min(this)'>0</span>" + "<span style='width:12;border-width:0px;color:white;font-family:webdings;' onclick='cls(this)'>r</span>" + "</div>" + "<div style='" + "width:100%;" + "height:" + (this.height-20-4) + ";" + "background-color:white;" + "line-height:14px;" + "word-break:break-all;" + "padding:3px;" + "'>" + this.message + "</div>" + "</div>" + "<div style='" + "width:" + this.width + ";" + "height:" + this.height + ";" + "top:" + this.top + ";" + "left:" + this.left + ";" + "z-index:" + (this.zIndex-1) + ";" + "position:absolute;" + "background-color:black;" + "filter:alpha(opacity=40);" + "'>?</div>"; //alert(str); document.body.insertAdjacentHTML("beforeEnd",str); } //--> </script> <script language='JScript'> <!-- function initialize() { var a = new xWin("1",160,200,200,200,"Message","xWin <br> A Cool Pop Div Window<br>Version:1.0<br>2002-8-13"); var b = new xWin("2",240,200,100,100,"Wildwind's Msgbox","Welcome to visited my personal website:<br><a href=http://www14.brinkster.com/wildcity target=_blank>http://wildcity.126.com</a><br>and u can also sign my guestbook at:<br><a href=http://www14.brinkster.com/wildcity/gbook target=_blank>http://wildcity.126.com/gbook</a><br><br>thx!!! =)..."); var c = new xWin("3",200,160,250,50,"Copyright","Copyright by <a href='mailto:wildwind_zz@21cn.com'>Wildwind</a>!"); } window.onload = initialize; //--> </script> </head> <body onselectstart='return false' oncontextmenu='return false'> </body> </html> 該文章在 2012/3/12 14:02:31 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |