可以拖動(dòng)的div 實(shí)現(xiàn)代碼第1/2頁
當(dāng)鼠標(biāo)點(diǎn)擊div時(shí),觸發(fā)一個(gè)事件,讓div的位置屬性(left,top)隨著鼠標(biāo)位置變化而變化,當(dāng)鼠標(biāo)釋放后,div的位置屬性就用了鼠標(biāo)釋放時(shí)的位置。
鼠標(biāo)點(diǎn)擊時(shí)觸發(fā)事件是很容易做到的,只要在div的標(biāo)簽里加上onmouseclick就可以了,現(xiàn)在我們要解決的問題是如何讓div的位置隨著鼠標(biāo)的位置變化而變化。
雖然這可能是一個(gè)很簡單的推理過程,不過還是羅嗦點(diǎn)說清楚吧。div的left和top是div左上角的坐標(biāo),當(dāng)我們把鼠標(biāo)移到div中點(diǎn)擊的時(shí)候,無疑鼠標(biāo)的坐標(biāo)和div的坐標(biāo)是不一致的,這時(shí)候如果我們簡單的讓div的坐標(biāo)等于鼠標(biāo)的坐標(biāo),那么看起來的效果就不是那么完美了,所以我們先要得到鼠標(biāo)的坐標(biāo)和div坐標(biāo)的差,然后在鼠標(biāo)移動(dòng)到的時(shí)候,在鼠標(biāo)坐標(biāo)上減去這個(gè)差來得到div的坐標(biāo)(如果不太明白,那就先補(bǔ)習(xí)一下網(wǎng)頁的基礎(chǔ)知識(shí))。
接下來的事情就簡單了,當(dāng)鼠標(biāo)移動(dòng)的時(shí)候,我們不斷的計(jì)算得到div的坐標(biāo),并改變,在鼠標(biāo)釋放的時(shí)候,這個(gè)事件就被移除。
整個(gè)js函數(shù)如下:
function beginDrag(elementToDrag,event)
{
var deltaX=event.clientX-parseInt(elementToDrag.style.left);
var deltaY=event.clientY-parseInt(elementToDrag.style.top);
if(document.addEventListener)
{
document.addEventListener(”mousemove”,moveHandler,true);
document.addEventListener(”mouseup”,upHandler,true);
//document.addEventListener(”mouseout”,upHandler,true);
}
else if(document.attachEvent)
{
document.attachEvent(”onmousemove”,moveHandler);
document.attachEvent(”onmouseup”,upHandler);
//document.attachEvent(”onmouseout”,upHandler);
}
if(event.stopPropagation) event.stopPropagation();
else event.cancelBubble=true;
if(event.preventDefault) event.preventDefault();
else event.returnValue=false;
function moveHandler(e)
{
if (!e) e=window.event; //如果是IE的事件對象,那么就用window.event
//全局屬性,否則就用DOM二級標(biāo)準(zhǔn)的Event對象。
elementToDrag.style.left=(e.clientX-deltaX)+”px”;
elementToDrag.style.top=(e.clientY-deltaY)+”px”;
if(e.stopPropagation) e.stopPropagation();
else e.cancelBubble=true;
}
function upHandler(e)
{
if(document.removeEventListener)
{
document.removeEventListener(”mouseup”,upHandler,true);
document.removeEventListener(”mousemove”,moveHandler,true);}
else
{
document.detachEvent(”onmouseup”,upHandler);
document.detachEvent(”onmousemove”,moveHandler);}
}
if (!e) e=window.event;
if(e.stopPropagation) e.stopPropagation();
else e.cancelBubble=true;
}
相關(guān)文章
如何優(yōu)雅地取消 JavaScript 異步任務(wù)
這篇文章主要介紹了如何優(yōu)雅地取消 JavaScript 異步任務(wù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03鼠標(biāo)劃過實(shí)現(xiàn)延遲加載并隱藏層的js代碼
鼠標(biāo)劃過延遲加載隱藏層的效果,想必大家都有見到過吧,在本文將為大家詳細(xì)介紹下使用js是如何實(shí)現(xiàn)的,感興趣的朋友可以參考下2013-10-10完美解決spring websocket自動(dòng)斷開連接再創(chuàng)建引發(fā)的問題
下面小編就為大家?guī)硪黄昝澜鉀Qspring websocket自動(dòng)斷開連接再創(chuàng)建引發(fā)的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03JS判斷Android、iOS或?yàn)g覽器的多種方法(四種方法)
這篇文章主要介紹了JS判斷Android、iOS或?yàn)g覽器的多種方法(四種方法),需要的朋友可以參考下2017-06-06js判斷兩個(gè)數(shù)組相等的5種方法實(shí)例
再最近的一次實(shí)際項(xiàng)目開發(fā)中,又遇到了需要對兩個(gè)數(shù)組內(nèi)容進(jìn)行比較的需求,索性整理下,這篇文章主要給大家介紹了關(guān)于js判斷兩個(gè)數(shù)組相等的5種方法,需要的朋友可以參考下2022-05-05window.location和document.location的區(qū)別分析
用戶不能改變document.location(因?yàn)檫@是當(dāng)前顯示文檔的位置)。但是,可以改變window.location (用其它文檔取代當(dāng)前文檔)window.location本身也是一個(gè)對象,而document.location不是對象2008-12-12JS Object.preventExtensions(),Object.seal()與Object.freeze()用
這篇文章主要介紹了JS Object.preventExtensions(),Object.seal()與Object.freeze()用法,結(jié)合實(shí)例形式分析了javascript控制對象擴(kuò)展、密封、凍結(jié)等相關(guān)函數(shù)與操作技巧,需要的朋友可以參考下2018-08-08用Javascript 和 CSS 實(shí)現(xiàn)腳注(Footnote)效果
腳注(Footnote)是向用戶提供更多信息的一個(gè)最佳途徑,也是主體信息的一個(gè)有效補(bǔ)充,常見于各種印刷書籍中。2009-09-09JavaScript獲取移動(dòng)設(shè)備型號的實(shí)現(xiàn)代碼(JS獲取手機(jī)型號和系統(tǒng))
這篇文章主要介紹了JavaScript獲取移動(dòng)設(shè)備型號的實(shí)現(xiàn)代碼,需要的朋友可以參考下2018-03-03