工作需要寫的一個(gè)js拖拽組件
/*
*使用方法:
* var d = new Drag({id:'dragPannel',maxLeft:500,maxTop:200});
* d.ready();
*請(qǐng)注意:
* 拖動(dòng)對(duì)象的left和top樣式必須寫在其style屬性里邊
*
*/
//矯正調(diào)用者。將 fn 作為 newObj 的方法調(diào)用
function repairCaller(newObj, fn){
return function(){
return fn.apply(newObj, arguments);
}
}
function Drag( config ){
this.moveTarget = T.dom.get( config.id );
this.startLeft = parseInt(this.moveTarget.style.left); //每次拖動(dòng)開(kāi)始時(shí)被拖動(dòng)對(duì)象的 left,top
this.startTop = parseInt(this.moveTarget.style.top);
this.startClientX = this.startLeft; //保存拖動(dòng)開(kāi)始時(shí)事件的 clientX, clientY
this.startClientY = this.startTop;
this.MAX_LEFT = config.maxLeft||document.documentElement.clientWidth - this.moveTarget.offsetWidth; //元素可以移動(dòng)的最大范圍
this.MAX_TOP = config.maxTop||document.documentElement.clientHeight - this.moveTarget.offsetHeight;
this.lock = true;
}
Drag.prototype.ready = function(){
//綁定事件
T.bind(document, "mousedown", repairCaller(this,this.down));
T.bind(document, "mousemove", repairCaller(this,this.move));
T.bind(document, "mouseup", repairCaller(this,this.stop));
}
Drag.prototype.down = function(){
//取得事件對(duì)象
var event = T.event.getEvent(arguments[0]),
target = T.event.getTarget(event);
if (target == this.moveTarget){
this.lock = false;
//在事件開(kāi)始時(shí)保存各種坐標(biāo)位置
this.startLeft = parseInt(this.moveTarget.style.left);
this.startTop = parseInt(this.moveTarget.style.top);
this.startClientX = event.clientX;
this.startClientY = event.clientY;
}
};
Drag.prototype.move = function(){
if(!this.lock ){
//取得事件對(duì)象
var event = T.event.getEvent(arguments[0]),
target = T.event.getTarget(event);
if(target == this.moveTarget){
//如有選擇內(nèi)容,清除之
//window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
//湊數(shù)拖動(dòng)范圍有沒(méi)超過(guò)最大限制
var realLeft = this.startLeft + event.clientX - this.startClientX, //實(shí)際的移動(dòng)范圍
realTop = this.startTop + event.clientY - this.startClientY,
rightLeft , rightTop; //正確的 left, top 取值
rightLeft = realLeft > this.MAX_LEFT ? this.MAX_LEFT : ( realLeft > 0 ? realLeft : 0 );
rightTop = realTop > this.MAX_TOP ? this.MAX_TOP : ( realTop > 0 ? realTop : 0 );
this.moveTarget.style.left = rightLeft + "px";
this.moveTarget.style.top = rightTop + "px";
}
else{
this.lock = true;
}
}
};
Drag.prototype.stop = function(){
this.lock = true
};
后記:
在寫的過(guò)程中非常需要注意的幾點(diǎn)是:
1、拖動(dòng)層的 position、left 和 top 必須寫在 style 里
2、移動(dòng)過(guò)程中設(shè)置 left 和 top 要帶單位,否則不起作用
3、多級(jí) div 嵌套時(shí)需要給父 div 加 over-flow:hidden 樣式
完畢!
相關(guān)文章
JavaScript驗(yàn)證18位身份證號(hào)碼最后一位正確性的實(shí)現(xiàn)代碼
這篇文章主要介紹了JavaScript驗(yàn)證18位身份證號(hào)碼最后一位正確性的實(shí)現(xiàn)代碼,小編親測(cè)有效,需要的朋友可以參考下2014-08-08JS window.opener返回父頁(yè)面的應(yīng)用
網(wǎng)上支付開(kāi)發(fā)分為支付平臺(tái)和客戶端兩部分。當(dāng)客戶端進(jìn)入支付平臺(tái)時(shí),需要在新窗體打開(kāi)支付平臺(tái)頁(yè)面。2009-10-10Javascript獲取頁(yè)面元素的絕對(duì)位置實(shí)現(xiàn)
這篇文章主要為大家介紹了Javascript獲取頁(yè)面元素的絕對(duì)位置實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11原生JS實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲
這篇文章主要為大家詳細(xì)介紹了原生JS實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06JS實(shí)現(xiàn)自動(dòng)切換文字的導(dǎo)航效果代碼
這篇文章主要介紹了JS實(shí)現(xiàn)自動(dòng)切換文字的導(dǎo)航效果代碼,涉及javascript動(dòng)態(tài)切換頁(yè)面樣式的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08js根據(jù)手機(jī)客戶端瀏覽器類型,判斷跳轉(zhuǎn)官網(wǎng)/手機(jī)網(wǎng)站多個(gè)實(shí)例代碼
這篇文章主要介紹了js根據(jù)手機(jī)客戶端瀏覽器類型,判斷跳轉(zhuǎn)官網(wǎng)/手機(jī)網(wǎng)站多個(gè)實(shí)例代碼,需要的朋友可以參考下2016-04-04bootstrap折疊調(diào)用collapse()后data-parent不生效的快速解決辦法
今天做的項(xiàng)目,用到了bootstrap的折疊功能,這個(gè)功能需要只展開(kāi)一個(gè)折疊框,點(diǎn)擊一個(gè)就會(huì)自動(dòng)隱藏另一個(gè),實(shí)現(xiàn)起來(lái)也很容易,但是在測(cè)試時(shí)同事提出了一個(gè)bug,怎么解決呢?今天小編通過(guò)本教程給大家分享下2017-02-02