js實(shí)現(xiàn)可拖動(dòng)DIV的方法
隨著時(shí)代的變化,越來(lái)越感覺到j(luò)s的重要性,js不僅可以做web頁(yè)面(如Ext框架),還可以做一些web的特效,這些特效不僅兼容PC,而且兼容手機(jī)端,畢竟是基于瀏覽器的,和平臺(tái)沒關(guān)系。現(xiàn)在微軟的windows8 系統(tǒng)的App都可以用js開發(fā)了,大家有時(shí)間可以去嘗試一下。
現(xiàn)在切入正題,說(shuō)一下js 實(shí)現(xiàn)可拖動(dòng)Div.實(shí)現(xiàn)這個(gè)功能我們先說(shuō)一下思路:
1.捕捉鼠標(biāo)div的mousedown事件
2.捕捉 document的 mousemove事件
3.取消事件
然后我們看一下代碼:
function Drag(id) {
var $ = function (flag) {
return document.getElementById(flag);
}
$(id).onmousedown = function (e) {
var d = document;
var page = {
event: function (evt) {
var ev = evt || window.event;
return ev;
},
pageX: function (evt) {
var e = this.event(evt);
return e.pageX || (e.clientX + document.body.scrollLeft - document.body.clientLeft);
},
pageY: function (evt) {
var e = this.event(evt);
return e.pageY || (e.clientY + document.body.scrollTop - document.body.clientTop);
},
layerX: function (evt) {
var e = this.event(evt);
return e.layerX || e.offsetX;
},
layerY: function (evt) {
var e = this.event(evt);
return e.layerY || e.offsetY;
}
}
var x = page.layerX(e);
var y = page.layerY(e);
if (dv.setCapture) {
dv.setCapture();
}
else if (window.captureEvents) {
window.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP);
}
d.onmousemove = function (e) {
var tx = page.pageX(e) - x;
var ty = page.pageY(e) - y;
dv.style.left = tx + "px";
dv.style.top = ty + "px";
}
d.onmouseup = function () {
if (dv.releaseCapture) {
dv.releaseCapture();
}
else if (window.releaseEvents) {
window.releaseEvents(Event.MOUSEMOVE | Event.MOUSEUP);
}
d.onmousemove = null;
d.onmouseup = null;
}
}
}
代碼分析:
1.
獲取div對(duì)象
var $ = function (flag) {
return document.getElementById(flag);
}
2.捕捉document的mousedown事件:
里面有這么一段代碼:
var page = {
event: function (evt) {
var ev = evt || window.event;
return ev;
},
pageX: function (evt) {
var e = this.event(evt);
return e.pageX || (e.clientX + document.body.scrollLeft - document.body.clientLeft);
},
pageY: function (evt) {
var e = this.event(evt);
return e.pageY || (e.clientY + document.body.scrollTop - document.body.clientTop);
},
layerX: function (evt) {
var e = this.event(evt);
return e.layerX || e.offsetX;
},
layerY: function (evt) {
var e = this.event(evt);
return e.layerY || e.offsetY;
}
}
其中event獲取鼠標(biāo)事件,pageX,pageY獲取鼠標(biāo)的坐標(biāo),layerX,layerY獲取鼠標(biāo)距離div邊框的距離。
還有一段代碼:
if (dv.setCapture) {
dv.setCapture();
}
else if (window.captureEvents) {
window.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP);
}
這個(gè)就是捕捉div的MouseMove和MouseUp事件,不懂得tx可以到網(wǎng)上查查。
3. document的MouseMove和mouseUp事件:
d.onmousemove = function (e) {
var tx = page.pageX(e) - x;
var ty = page.pageY(e) - y;
dv.style.left = tx + "px";
dv.style.top = ty + "px";
}
d.onmouseup = function () {
if (dv.releaseCapture) {
dv.releaseCapture();
}
else if (window.releaseEvents) {
window.releaseEvents(Event.MOUSEMOVE | Event.MOUSEUP);
}
d.onmousemove = null;
d.onmouseup = null;
}
其中的tx,ty就是最重要的代碼了,是設(shè)置div坐標(biāo)的
有的人可能會(huì)問為什么要-x,-y?
x,y其實(shí)就是獲取鼠標(biāo)距離div邊框的距離,如果不減掉的話
鼠標(biāo)箭頭的坐標(biāo)和div的x,y坐標(biāo)一樣了,這樣拖動(dòng)之后,鼠標(biāo)的位置會(huì)偏到左上角,效果就是,拖動(dòng)之后會(huì)彈動(dòng)一下。
if (dv.releaseCapture) {
dv.releaseCapture();
}
else if (window.releaseEvents) {
window.releaseEvents(Event.MOUSEMOVE | Event.MOUSEUP);
}
d.onmousemove = null;
d.onmouseup = null;
上面這段代碼就是在鼠標(biāo)松開之后取消document的onmousemove,onmouseup事件。
最近都在學(xué)習(xí)js,后續(xù)有新的心得體會(huì)也會(huì)與大家分享,希望與大家共同學(xué)習(xí),進(jìn)步。
- js 鼠標(biāo)拖動(dòng)對(duì)象 可讓任何div實(shí)現(xiàn)拖動(dòng)效果
- javascript div 彈出可拖動(dòng)窗口
- 利用javascript移動(dòng)div層-javascript 拖動(dòng)層
- js通過八個(gè)點(diǎn) 拖動(dòng)改變div大小的實(shí)現(xiàn)方法
- js拖動(dòng)div 當(dāng)鼠標(biāo)移動(dòng)時(shí)整個(gè)div也相應(yīng)的移動(dòng)
- javascript 可以拖動(dòng)的DIV(二)
- Javascript實(shí)現(xiàn)的類似Google的Div拖動(dòng)效果代碼
- JavaScript實(shí)現(xiàn)可拖拽的拖動(dòng)層Div實(shí)例
- javascript實(shí)現(xiàn)div的拖動(dòng)并調(diào)整大小類似qq空間個(gè)性編輯模塊
- js實(shí)現(xiàn)div色塊拖動(dòng)錄制
相關(guān)文章
Javascript 各瀏覽器的 Javascript 效率對(duì)比
2008-01-01
js實(shí)現(xiàn)類似iphone的網(wǎng)頁(yè)滑屏解鎖功能示例【附源碼下載】
這篇文章主要介紹了js實(shí)現(xiàn)類似iphone的網(wǎng)頁(yè)滑屏解鎖功能,結(jié)合完整實(shí)例形式分析了javascript動(dòng)態(tài)操作頁(yè)面元素實(shí)現(xiàn)解鎖效果的相關(guān)實(shí)現(xiàn)技巧,并附帶供讀者源碼下載參考,需要的朋友可以參考下2019-06-06
JS利用cookies設(shè)置每隔24小時(shí)彈出框
這篇文章主要介紹了利用cookies設(shè)置每隔24小時(shí)彈出框的實(shí)例代碼,需要的朋友可以參考下2017-04-04
基于javascript實(shí)現(xiàn)數(shù)字英文驗(yàn)證碼
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)數(shù)字英文驗(yàn)證碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
前端實(shí)現(xiàn)水印功能的幾種方法及優(yōu)缺點(diǎn)
這篇文章主要介紹了前端開發(fā)中實(shí)現(xiàn)網(wǎng)頁(yè)或圖像水印的六種方法,包括使用CSS背景圖、HTML5?Canvas、SVG、圖片處理庫(kù)、HTML?DOM元素以及后端生成,每種方法都有其優(yōu)缺點(diǎn),適用于不同的場(chǎng)景,需要的朋友可以參考下2025-01-01
詳解JavaScript中typeof與instanceof用法
typeof用以獲取一個(gè)變量或者表達(dá)式的類型而instanceof用于判斷一個(gè)變量是否某個(gè)對(duì)象的實(shí)例,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-10-10

