JS面向?qū)ο缶幊虒?shí)現(xiàn)的拖拽功能案例詳解
本文實(shí)例講述了JS面向?qū)ο缶幊虒?shí)現(xiàn)的拖拽功能。分享給大家供大家參考,具體如下:
原始的面向過程代碼:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <style> #box { width: 100px; height: 100px; background: blue; position: absolute; } </style> <title>拖拽</title> <script> var oBox=null; var disX=0; var disY=0; window.onload=function(){ oBox=document.getElementById('box'); oBox.onmousedown=fnDown; }; //鼠標(biāo)按下事件 function fnDown(ev){ var oEvent = ev||event; disX = oEvent.clientX - oBox.offsetLeft; disY = oEvent.clientY - oBox.offsetTop; document.onmousemove = fnMove; document.onmouseup = fnUp; } //鼠標(biāo)移動(dòng)事件 function fnMove(ev){ var oEvent=ev||event; oBox.style.left = oEvent.clientX - disX + 'px'; oBox.style.top = oEvent.clientY - disY + 'px'; } //鼠標(biāo)抬起事件 function fnUp(){ document.onmousemove = null; document.onmouseup = null; } </script> </head> <body> <div id="box"></div> </body> </html>
下面是面向?qū)ο蟮拇a
drag.js
/** * 拖拽 * @param {Object} id div的id */ function Drag(id){ this.oBox = document.getElementById(id); this.disX = 0; this.disY = 0; var _this = this; this.oBox.onmousedown = function(){ _this.fnDown(); } } //鼠標(biāo)按下 Drag.prototype.fnDown = function(ev){ var oEvent = ev || event; this.disX = oEvent.clientX - this.oBox.offsetLeft; this.disY = oEvent.clientY - this.oBox.offsetTop; var _this = this; document.onmousemove = function(){ _this.fnMove(); }; document.onmouseup = function(){ _this.fnUp(); }; } //鼠標(biāo)移動(dòng) Drag.prototype.fnMove = function(ev){ var oEvent= ev || event; this.oBox.style.left = oEvent.clientX - this.disX + 'px'; this.oBox.style.top = oEvent.clientY - this.disY + 'px'; } //鼠標(biāo)抬起 Drag.prototype.fnUp = function(){ document.onmousemove = null; document.onmouseup = null; }
drag.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <style> div { position: absolute; } </style> <title>拖拽</title> <script type="text/javascript" src="../js/drag.js" ></script> <script> window.onload = function(){ var drag1 = new Drag("box1"); var drag1 = new Drag("box2"); }; </script> </head> <body> <div id="box1" style="background: red;width: 200px;height: 200px;"></div> <div id="box2" style="background: blue;width: 100px;height: 100px;"></div> </body> </html>
此拖拽有一個(gè)問題,就是沒有控制拖拽出邊界的問題。但我們又不想去修改代碼,那我們?cè)趺醋??學(xué)過java的應(yīng)該都知道可以寫一個(gè)子類來做一些更加具體的操作,又保留了父類的功能,就是繼承。
html
<script type="text/javascript" src="../js/drag.js" ></script> <script type="text/javascript" src="../js/dragLimit.js" ></script> <script> window.onload = function(){ var drag1 = new Drag("box1"); var drag1 = new DragLimit("box2");//藍(lán)色是不會(huì)超出邊界的 }; </script> <body> <div id="box1" style="background: red;width: 200px;height: 200px;"></div> <div id="box2" style="background: blue;width: 100px;height: 300px;"></div> </body>
DragLimit.js:DragLimit繼承自Drag,控制了不能出邊界
/** * 限制邊界的拖拽,繼承自Drag * @param {Object} id */ function DragLimit(id){ Drag.call(this, id); } //繼承方法 for(var p in Drag.prototype){ DragLimit.prototype[p] = Drag.prototype[p]; } /** * 覆寫父類的鼠標(biāo)移動(dòng)方法,控制不能移出邊界 */ DragLimit.prototype.fnMove = function(ev){ var oEvent= ev || event; var left = oEvent.clientX - this.disX; var top = oEvent.clientY - this.disY; //控制邊界 if(left < 0){ left = 0; } else if(left > document.documentElement.clientWidth-this.oBox.offsetWidth){ left = document.documentElement.clientWidth-this.oBox.offsetWidth; } if(top <= 0){ top = 0; } else if(top > document.documentElement.clientHeight-this.oBox.offsetHeight){ top = document.documentElement.clientHeight-this.oBox.offsetHeight; } this.oBox.style.left = left + 'px'; this.oBox.style.top = top + 'px'; }
感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運(yùn)行工具:http://tools.jb51.net/code/HtmlJsRun測(cè)試上述代碼運(yùn)行效果。
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
利用Bootstrap Multiselect實(shí)現(xiàn)下拉框多選功能
這篇文章主要介紹了利用Bootstrap Multiselect實(shí)現(xiàn)下拉框多選功能,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-04-04帝國(guó)cms首頁(yè)列表頁(yè)實(shí)現(xiàn)點(diǎn)贊功能
這篇文章主要介紹了帝國(guó)cms首頁(yè)列表頁(yè)實(shí)現(xiàn)點(diǎn)贊功能的相關(guān)資料,需要的朋友可以參考下2017-10-10JavaScript表單即時(shí)驗(yàn)證 驗(yàn)證不成功不能提交
這篇文章主要為大家詳細(xì)介紹了JavaScript表單即時(shí)驗(yàn)證,驗(yàn)證不成功不能提交,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08一個(gè)關(guān)于javascript匿名函數(shù)的問題分析
一個(gè)關(guān)于javascript匿名函數(shù)的問題分析,學(xué)習(xí)js的朋友可以參考下2012-03-03原生JS面向?qū)ο髮?shí)現(xiàn)打磚塊小游戲
這篇文章主要為大家詳細(xì)介紹了原生JS面向?qū)ο髮?shí)現(xiàn)打磚塊小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09比較簡(jiǎn)單實(shí)用的使用正則三種版本的js去空格處理方法
比較簡(jiǎn)單實(shí)用的使用正則三種版本的js去空格處理方法...2007-11-11bootstrap插件treeview實(shí)現(xiàn)全選父節(jié)點(diǎn)下所有子節(jié)點(diǎn)和反選功能
這篇文章主要為大家詳細(xì)介紹了bootstrap插件treeview實(shí)現(xiàn)全選父節(jié)點(diǎn)下所有子節(jié)點(diǎn)、反選功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07js的隱含參數(shù)(arguments,callee,caller)使用方法
本篇文章只要是對(duì)js的隱含參數(shù)(arguments,callee,caller)使用方法進(jìn)行了介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助2014-01-01