怎么用javascript進(jìn)行拖拽
你首先要聲明一個(gè)evnet對(duì)象.不論何時(shí)你移動(dòng)鼠標(biāo)/點(diǎn)擊/按鍵等等,會(huì)對(duì)應(yīng)一個(gè)event的事件.在Internet Explorer里event是全局變量,會(huì)被存儲(chǔ)在window.event里. 在firefox中,或者其他瀏覽器,event事件會(huì)被相應(yīng)的自定義函數(shù)獲?。?dāng)我們將mouseMove函數(shù)賦值于document.onmousemove,mouseMove會(huì)獲取鼠標(biāo)移動(dòng)事件.
(ev = ev || window.event) 這樣讓ev在所有瀏覽器下獲取了event事件,在Firefox下"||window.event"將不起作用,因?yàn)閑v已經(jīng)有了賦值.在MSIE下ev是空的,所以ev將設(shè)置為window.event.
因?yàn)槲覀冊(cè)谶@篇文章中需要多次獲取鼠標(biāo)坐標(biāo),所以我們?cè)O(shè)計(jì)了mouseCoords這個(gè)函數(shù),它只包含了一個(gè)參數(shù),就是the event.
我們需要運(yùn)行在MSIE與Firefox為首的其他瀏覽器下.Firefox以event.pageX和event.pageY來代表鼠標(biāo)相應(yīng)于文檔左上角的位置.如果你有一個(gè)500*500的窗口,而且你的鼠標(biāo)在正中間,那么paegX和pageY將是250,當(dāng)你將頁面往下滾動(dòng)500px,那么pageY將是750.此時(shí)pageX不變,還是250.
MSIE和這個(gè)相反,MSIE將event.clientX與event.clientY來代表鼠標(biāo)與ie窗口的位置,并不是文檔.當(dāng)我們有一個(gè)500*500的窗口,鼠標(biāo)在正中間,那么clientX與clientY也是250,如果你垂直滾動(dòng)窗口到任何位置,clientY仍然是250,因?yàn)橄鄬?duì)ie窗口并沒有變化.想得到正確的結(jié)果,我們必須加入scrollLeft與scrollTop這兩個(gè)相對(duì)于文檔鼠標(biāo)位置的屬性.最后,由于MSIE并沒有0,0的文檔起始位置,因?yàn)橥ǔ?huì)設(shè)置2px的邊框在周圍,邊框的寬度包含在document.body.clientLeft與clientTop這兩個(gè)屬性中,我們?cè)偌尤脒@些到鼠標(biāo)的位置中.
很幸運(yùn),這樣mouseCoords函數(shù)就完成了,我們不再為坐標(biāo)的事操心了.
捕捉鼠標(biāo)點(diǎn)擊
下次我們將知道鼠標(biāo)何時(shí)點(diǎn)擊與何時(shí)放開.如果我們跳過這一步,我們?cè)谧鐾献r(shí)將永遠(yuǎn)不知道鼠標(biāo)移動(dòng)上面時(shí)的動(dòng)作,這將是惱人的與違反直覺的.
這里有兩個(gè)函數(shù)幫助我們:onmousedown與onmouseup.我們預(yù)先設(shè)置函數(shù)來接收document.onmousemove,這樣看起來很象我們會(huì)獲取document.onmousedown與document.onmouseup.但是當(dāng)我們獲取document.onmousedown時(shí),我們同時(shí)獲取了任何對(duì)象的點(diǎn)擊屬性如:text,images,tables等等.我們只想獲取那些需要拖拽的屬性,所以我們?cè)O(shè)置函數(shù)來獲取我們需要移動(dòng)的對(duì)象.
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
移動(dòng)一個(gè)元素
我們知道了怎么捕捉鼠標(biāo)移動(dòng)與點(diǎn)擊.剩下的就是移動(dòng)元素了.首先,要確定一個(gè)明確的頁面位置,css樣式表要用'absolute'.設(shè)置元素絕對(duì)位置意味著我們可以用樣式表的.top和.left來定位,可以用相對(duì)位置來定位了.我們將鼠標(biāo)的移動(dòng)全部相對(duì)頁面top-left,基于這點(diǎn),我們可以進(jìn)行下一步了.
當(dāng)我們定義item.style.position='absolute',所有的操作都是改變left坐標(biāo)與top坐標(biāo),然后它移動(dòng)了.
document.onmousemove = mouseMove;
document.onmouseup = mouseUp;
var dragObject = null;
var mouseOffset = null;
function getMouseOffset(target, ev){
ev = ev || window.event;
var docPos = getPosition(target);
var mousePos = mouseCoords(ev);
return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
}
function getPosition(e){
var left = 0;
var top = 0;
while (e.offsetParent){
left += e.offsetLeft;
top += e.offsetTop;
e = e.offsetParent;
}
left += e.offsetLeft;
top += e.offsetTop;
return {x:left, y:top};
}
function mouseMove(ev){
ev = ev || window.event;
var mousePos = mouseCoords(ev);
if(dragObject){
dragObject.style.position = 'absolute';
dragObject.style.top = mousePos.y - mouseOffset.y;
dragObject.style.left = mousePos.x - mouseOffset.x;
return false;
}
}
function mouseUp(){
dragObject = null;
}
function makeDraggable(item){
if(!item) return;
item.onmousedown = function(ev){
dragObject = this;
mouseOffset = getMouseOffset(this, ev);
return false;
}
}
相關(guān)文章
javascript css紅色經(jīng)典選項(xiàng)卡效果實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了javascript css紅色經(jīng)典選項(xiàng)卡效果的實(shí)現(xiàn)代碼,需要的朋友可以參考下2016-05-05
js使瀏覽器窗口最大化實(shí)現(xiàn)代碼(適用于IE)
點(diǎn)擊最大化按鈕后,瀏覽器的內(nèi)容填充滿顯示器,瀏覽器窗口的邊框被擠出顯示器。而該js的最大化效果是瀏覽器的邊框在顯示器內(nèi)顯示,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下2013-08-08
!DOCTYPE聲明對(duì)JavaScript的影響分析
DOCTYPE是document type(文檔類型)的簡寫,在web設(shè)計(jì)中用來說明你用的XHTML或者HTML是什么版本。2010-04-04
$.browser.msie 為空或不是對(duì)象問題的多種解決方法
因?yàn)槭褂昧薺query判斷ie,所以使用了$.browser.msie但是在jquery 1.9以后的版本中不再支持$.browser而使用$.browser來替代2017-03-03
js或jquery動(dòng)態(tài)輸出select option的實(shí)現(xiàn)代碼
在 JavaScript 中動(dòng)態(tài)生成 <option> 元素并添加到 <select> 下拉列表中,可以通過以下幾種方式實(shí)現(xiàn),以下是不同場(chǎng)景下的完整代碼示例2025-03-03

