js完美的div拖拽實(shí)例代碼
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>拖拽庫(kù)</title>
<style type="text/css">
div,h2,p{margin:0;padding:0;}
body{font:14px/1.5 arial;}
#box{width:100px;height:100px;background:#fef4eb;padding:5px;margin:50px;border:1px solid #f60;}
#box .title{height:25px;background:#f60;}
#tool{margin-bottom:10px;}
</style>
<script type="text/javascript">
function Drag()
{
//初始化
this.initialize.apply(this, arguments)
}
Drag.prototype = {
//初始化
initialize : function (drag, options)
{
this.drag = this.$(drag);
this._x = this._y = 0;
this._moveDrag = this.bind(this, this.moveDrag);
this._stopDrag = this.bind(this, this.stopDrag);
this.setOptions(options);
this.handle = this.$(this.options.handle);
this.maxContainer = this.$(this.options.maxContainer);
this.maxTop = Math.max(this.maxContainer.clientHeight, this.maxContainer.scrollHeight) - this.drag.offsetHeight;
this.maxLeft = Math.max(this.maxContainer.clientWidth, this.maxContainer.scrollWidth) - this.drag.offsetWidth;
this.limit = this.options.limit;
this.lockX = this.options.lockX;
this.lockY = this.options.lockY;
this.lock = this.options.lock;
this.onStart = this.options.onStart;
this.onMove = this.options.onMove;
this.onStop = this.options.onStop;
this.handle.style.cursor = "move";
this.changeLayout();
this.addHandler(this.handle, "mousedown", this.bind(this, this.startDrag))
},
changeLayout : function ()
{
this.drag.style.top = this.drag.offsetTop + "px";
this.drag.style.left = this.drag.offsetLeft + "px";
this.drag.style.position = "absolute";
this.drag.style.margin = "0"
},
startDrag : function (event)
{
var event = event || window.event;
this._x = event.clientX - this.drag.offsetLeft;
this._y = event.clientY - this.drag.offsetTop;
this.addHandler(document, "mousemove", this._moveDrag);
this.addHandler(document, "mouseup", this._stopDrag);
event.preventDefault && event.preventDefault();
this.handle.setCapture && this.handle.setCapture();
this.onStart()
},
moveDrag : function (event)
{
var event = event || window.event;
var iTop = event.clientY - this._y;
var iLeft = event.clientX - this._x;
if (this.lock) return;
this.limit && (iTop < 0 && (iTop = 0), iLeft < 0 && (iLeft = 0), iTop > this.maxTop && (iTop = this.maxTop), iLeft > this.maxLeft && (iLeft = this.maxLeft));
this.lockY || (this.drag.style.top = iTop + "px");
this.lockX || (this.drag.style.left = iLeft + "px");
event.preventDefault && event.preventDefault();
this.onMove()
},
stopDrag : function ()
{
this.removeHandler(document, "mousemove", this._moveDrag);
this.removeHandler(document, "mouseup", this._stopDrag);
this.handle.releaseCapture && this.handle.releaseCapture();
this.onStop()
},
//參數(shù)設(shè)置
setOptions : function (options)
{
this.options =
{
handle: this.drag, //事件對(duì)象
limit: true, //鎖定范圍
lock: false, //鎖定位置
lockX: false, //鎖定水平位置
lockY: false, //鎖定垂直位置
maxContainer: document.documentElement || document.body, //指定限制容器
onStart: function () {}, //開(kāi)始時(shí)回調(diào)函數(shù)
onMove: function () {}, //拖拽時(shí)回調(diào)函數(shù)
onStop: function () {} //停止時(shí)回調(diào)函數(shù)
};
for (var p in options) this.options[p] = options[p]
},
//獲取id
$ : function (id)
{
return typeof id === "string" ? document.getElementById(id) : id
},
//添加綁定事件
addHandler : function (oElement, sEventType, fnHandler)
{
return oElement.addEventListener ? oElement.addEventListener(sEventType, fnHandler, false) : oElement.attachEvent("on" + sEventType, fnHandler)
},
//刪除綁定事件
removeHandler : function (oElement, sEventType, fnHandler)
{
return oElement.removeEventListener ? oElement.removeEventListener(sEventType, fnHandler, false) : oElement.detachEvent("on" + sEventType, fnHandler)
},
//綁定事件到對(duì)象
bind : function (object, fnHandler)
{
return function ()
{
return fnHandler.apply(object, arguments)
}
}
};
//應(yīng)用
window.onload = function ()
{
var oBox = document.getElementById("box");
var oTitle = oBox.getElementsByTagName("h2")[0];
var oSpan = document.getElementsByTagName("span")[0];
var oDrag = new Drag(oBox, {handle:oTitle, limit:false});
var aInput = document.getElementsByTagName("input");
//鎖定范圍接口
aInput[0].onclick = function ()
{
oDrag.limit = !oDrag.limit;
this.value = oDrag.limit ? "取消鎖定范圍" : "鎖定范圍"
};
//水平鎖定接口
aInput[1].onclick = function ()
{
oDrag.lockX = !oDrag.lockX;
this.value = oDrag.lockX ? "取消水平鎖定" : "水平鎖定"
};
//垂直鎖定接口
aInput[2].onclick = function ()
{
oDrag.lockY = !oDrag.lockY;
this.value = oDrag.lockY ? "取消垂直鎖定" : "垂直鎖定"
};
//鎖定位置接口
aInput[3].onclick = function ()
{
oDrag.lock = !oDrag.lock;
this.value = oDrag.lock ? "取消鎖定位置" : "鎖定位置"
};
//開(kāi)始拖拽時(shí)方法
oDrag.onStart = function ()
{
oSpan.innerHTML = "開(kāi)始拖拽"
};
//開(kāi)始拖拽時(shí)方法
oDrag.onMove = function ()
{
oSpan.innerHTML = "left:" + this.drag.offsetLeft + ", top:" + this.drag.offsetTop
};
//開(kāi)始拖拽時(shí)方法
oDrag.onStop = function ()
{
oSpan.innerHTML = "結(jié)束拖拽"
};
};
</script>
</head>
<body>
<div id="tool">
<input type="button" value="鎖定范圍" />
<input type="button" value="水平鎖定" />
<input type="button" value="垂直鎖定" />
<input type="button" value="鎖定位置" />
</div>
<p>拖放狀態(tài):<span>未開(kāi)始</span></p>
<div id="box">
<h2 class="title"></h2>
</div>
</body>
</html>
</td>
</tr>
</table>
- JQuery Dialog(JS 模態(tài)窗口,可拖拽的DIV)
- Sortable.js拖拽排序使用方法解析
- js實(shí)現(xiàn)拖拽效果
- javascript實(shí)現(xiàn)移動(dòng)端上的觸屏拖拽功能
- 使用js實(shí)現(xiàn)的簡(jiǎn)單拖拽效果
- JS實(shí)現(xiàn)的文件拖拽上傳功能示例
- 使用javaScript實(shí)現(xiàn)鼠標(biāo)拖拽事件
- JavaScript實(shí)現(xiàn)水平進(jìn)度條拖拽效果
- JS實(shí)現(xiàn)移動(dòng)端觸屏拖拽功能
- JavaScript實(shí)現(xiàn)拖拽簡(jiǎn)單效果
相關(guān)文章
基于JavaScript實(shí)現(xiàn)復(fù)選框的全選和取消全選
這篇文章主要為大家詳細(xì)介紹了基于JavaScript實(shí)現(xiàn)復(fù)選框的全選和取消全選,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
JavaScript實(shí)現(xiàn)快速排序的方法分析
這篇文章主要介紹了JavaScript實(shí)現(xiàn)快速排序的方法,結(jié)合實(shí)例形式分析了快速排序的原理、實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2018-01-01
微信小程序搭建(mpvue+mpvue-weui+fly.js)的詳細(xì)步驟
這篇文章主要介紹了微信小程序搭建(mpvue+mpvue-weui+fly.js)的詳細(xì)步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
JavaScript實(shí)現(xiàn)的一個(gè)日期格式化函數(shù)分享
這篇文章主要介紹了JavaScript實(shí)現(xiàn)的一個(gè)日期格式化函數(shù)分享,本文給出了實(shí)現(xiàn)代碼和使用例子,需要的朋友可以參考下2014-12-12
JS+CSS3實(shí)現(xiàn)的簡(jiǎn)易鐘表效果示例
這篇文章主要介紹了JS+CSS3實(shí)現(xiàn)的簡(jiǎn)易鐘表效果,涉及JavaScript結(jié)合定時(shí)器的頁(yè)面元素動(dòng)態(tài)設(shè)置與數(shù)值計(jì)算相關(guān)操作技巧,需要的朋友可以參考下2019-04-04
js 關(guān)鍵詞高亮(根據(jù)ID/tag高亮關(guān)鍵字)案例介紹
關(guān)鍵詞高亮在開(kāi)發(fā)中會(huì)帶來(lái)很多的方便,關(guān)鍵詞高亮包括:根據(jù)ID高亮關(guān)鍵字/根據(jù)Tag名高亮關(guān)鍵字等等,感興趣的朋友可以了解下,希望本文對(duì)你有所幫助2013-01-01
JavaScrip如果基于url實(shí)現(xiàn)圖片下載
這篇文章主要介紹了JavaScrip如果基于url實(shí)現(xiàn)圖片下載,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
window.dialogArguments 使用說(shuō)明
window.dialogArguments 使用說(shuō)明,需要的朋友可以參考下。2011-04-04
js關(guān)閉模態(tài)窗口刷新父頁(yè)面或跳轉(zhuǎn)頁(yè)面
點(diǎn)擊按鈕時(shí),彈出B窗口(模態(tài))。在B窗口中添加數(shù)據(jù),提交后,要求B窗口自關(guān)閉,然后刷新A窗口(父),需要的朋友可以了解下2012-12-12

