JavaScript 限定範圍的拖拽效果
有時拖拽要限定在某一個指定的元素之內。
下面就通過程式碼例項介紹一下如何實現此效果,程式碼例項如下:
[HTML] 純文字檢視 複製程式碼執行程式碼<!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>拖拽效果限制範圍-螞蟻部落</title> <style type="text/css"> *{ margin:0px; padding:0px; } body{ padding:50px; } #box{ width:350px; height:250px; background:red; overflow:hidden; position:relative; } #drag{ width:50px; height:50px; background:green; position:absolute; } </style> <script type="text/javascript"> window.onload=function(){ var obox=document.getElementById("box"); var odrag=document.getElementById("drag"); var isDrag=false; var x,y; odrag.onmousedown=down; document.onmousemove=move; document.onmouseup=up; function down(ev){ var ev=window.event||ev; x=ev.clientX-this.offsetLeft; y=ev.clientY-this.offsetTop; this.style.cursor="move"; isDrag=true; } function move(ev){ if(isDrag){ var ev=window.event||ev; odrag.style.left=(ev.clientX-x)+"px"; odrag.style.top=(ev.clientY-x)+"px"; if(parseInt(odrag.style.left)<0){ odrag.style.left=0; } if(parseInt(odrag.style.top)<0){ odrag.style.top=0; } if(parseInt(odrag.style.left)>obox.clientWidth-odrag.clientWidth){ odrag.style.left=(obox.clientWidth-odrag.clientWidth)+"px"; } if(parseInt(odrag.style.top)>obox.clientHeight-odrag.clientHeight){ odrag.style.top=(obox.clientHeight-odrag.clientHeight)+"px"; } } } function up(){ isDrag=false; odrag.style.cursor="pointer"; } } </script> </head> <body> <div id="box"> <div id="drag"></div> </div> </body> </html>
程式碼實現了拖拽效果,並且將拖拽返回限定在紅色的div之內,下面就介紹一下實現過程。
一.實現原理:
原理非常的簡單,綠色div為絕對定位,它父元素的定位方式是相對定位,那麼綠色div的定位參考物件就是紅色的div。當進行拖動的時候就會判斷元素的left和top屬性值是否超出了紅色父元素的邊界,如果超出,就將它的top和left屬性值設定為邊界臨界狀態,這樣就實現了將綠色div限定於紅色div之內。
二.程式碼註釋:
(1).window.onload=function(){},當文件內容完全載入完成之後再去執行函式中的程式碼。
(2).var obox=document.getElementById("box"),獲取id屬性值為box的元素。
(3).var odrag=document.getElementById("drag"),獲取id屬性值為drag的元素。
(4).var isDrag=false,此變數用於標識div是否可以被拖動。
(5).var x,y,用於存放滑鼠指標距離要拖動div的左邊緣和上邊緣的距離。
(6).odrag.onmousedown=down,為綠色div註冊onmousedown事件處理函式。
(7).document.onmousemove=move,為document物件註冊onmousemove事件處理函式,之所以沒有直接給odrag註冊,是因為利用事件冒泡可以防止滑鼠滑出div導致拖動失效現象。
(8).document.onmouseup=up,為document物件註冊onmouseup事件處理函式,同樣利用了事件冒泡。
(9).function down(ev){},onmousedown事件處理函式,ev為事件物件。
(10).var ev=window.event||ev,為了相容各主要瀏覽器。
(11).x=ev.clientX-this.offsetLeft,獲取滑鼠指標距離div左邊緣的距離。
(12).y=ev.clientY-this.offsetTop,獲取滑鼠指標距離div上邊緣的距離。
(13).this.style.cursor="move",將滑鼠的指標形狀設定為十字型。
(14).isDrag=true,將isDrag值設定為true,也就是可以拖動。
(15).function move(ev){},onmousemove事件處理函式,ev為事件物件。
(16).if(isDrag),判斷是否可以拖動。
(17).odrag.style.left=(ev.clientX-x)+"px",設定div的lef屬性值。
(18).odrag.style.top=(ev.clientY-x)+"px",設定div的top屬性值。
(19).if(parseInt(odrag.style.left)<0),如果小於0,說明超出左邊緣。
(20).odrag.style.left=0,將left屬性值設定為0,那麼恰好在父元素的左邊緣。
(21).if(parseInt(odrag.style.top)<0),這個原理同上,只是方位不同,這裡不多介紹了。
(22).if(parseInt(odrag.style.left)>obox.clientWidth-odrag.clientWidth),用於判斷綠色div的left屬性值是否大於父元素的寬度減去綠色div的寬度,也就是說是否超過了父元素的右邊界。
(23).odrag.style.left=(obox.clientWidth-odrag.clientWidth)+"px",將綠色div的left屬性值設定為obox.clientWidth-odrag.clientWidth,也就是說綠色div的右邊界恰好在父div的右邊緣。
(24),.if(parseInt(odrag.style.top)>obox.clientHeight-odrag.clientHeight),原理同上,這裡不多介紹了。
(25).function up(){},onmouseup事件處理函式。
(26).isDrag=false,設定為不能拖動。
三.相關閱讀:
(1).JavaScript 註冊事件處理函式一章節。
(2).var ev=window.event||ev一章節。
(3).JavaScript parseInt()一章節。
(4).JavaScript clientWidth一章節。
(5).JavaScript 事件冒泡一章節。
相關文章
- JavaScript 拖拽限定範圍JavaScript
- JavaScript 限定範圍拖動效果JavaScript
- JavaScript拖拽效果JavaScript
- Elasticsearch聚合學習之三:範圍限定Elasticsearch
- jQuery Validate限定輸入數字大小的範圍jQuery
- div拖動範圍限定在指定元素內
- JavaScript元素拖拽路徑回放效果JavaScript
- JavaScript基礎 —— DOM:遍歷 與 範圍JavaScript
- 原生JS拖拽效果JS
- canvas矩形拖拽效果Canvas
- elementui 當表格有固定列,拖動條在固定列的範圍內時拖拽不動UI
- 詳解javascript拖拽(二)拖拽的應用及示例JavaScript
- 範圍分割槽
- 軟考——範圍
- 隨機範圍小數和隨機範圍整數隨機
- Range範圍選區的理解
- 列舉範圍內的字串字串
- 關於SAP的MRP範圍
- MySQL欄位的取值範圍MySql
- SciPy 應用範圍
- 使用BottomSheetBehavior實現美團拖拽效果
- Cookie 的特徵與範圍用例Cookie特徵
- 基礎 變數的作用範圍變數
- 不可變陣列的範圍求和陣列
- jQuery的ztree仿windows檔案新建和拖拽效果jQueryWindows
- 基於javascript的拖拽類封裝^o^JavaScript封裝
- python - 生成時間範圍Python
- int/double資料範圍
- 保護範圍和物件物件
- Blender修改視野範圍
- 動態範圍控制原理
- 檢視分割槽範圍
- PFMEA如何定義範圍?
- 資料型別範圍資料型別
- 列舉和列舉的取值範圍
- 團體標準的適用範圍
- java位運算子的應用範圍Java
- 生成某個範圍的隨機數隨機