js實(shí)現(xiàn)QQ面板拖拽效果(慕課網(wǎng)DOM事件探秘)(全)
QQ面板拖拽,效果如圖

JavaScript代碼如下:
function getByClass(clsName, parent) {
var oParent = parent ? document.getElementById(parent) : document,
eles = [],
elements = oParent.getElementsByTagName('*');
for (var i = 0, l = elements.length; i < l; i++) {
if (elements[i].className == clsName) {
eles.push(elements[i]);
}
}
return eles;
}
window.onload = drag;
function drag() {
var oTitle = getByClass("login_logo_webqq", "loginPanel")[0];
//拖頁
oTitle.onmousedown = fnDown;
//關(guān)閉頁面
var close = document.getElementById("ui_boxyClose");
close.onclick = winClose;
//切換狀態(tài)
var loginState = document.getElementById("loginState");
var stateList = document.getElementById("loginStatePanel");
var lis = stateList.getElementsByTagName("li");
var stateTxt = document.getElementById("login2qq_state_txt");
var loginStateShow = document.getElementById("loginStateShow");
//點(diǎn)擊顯示下拉單
loginState.onclick = function (e) {
stateList.style.display = "block";
//阻止事件冒泡;
e = event || window.event;
if(e.stopPropagation){
e.stopPropagation();
}else{
e.cancelBubble = true;
}
};
//鼠標(biāo)滑過,背景變色
for (var i = 0; i < lis.length; i++) {
lis[i].onmouseover = function () {
this.style.backgroundColor = "#888";
};
lis[i].onmouseout = function () {
this.style.backgroundColor = "#fff";
};
//鼠標(biāo)點(diǎn)擊,txt改變,圖標(biāo)改變
lis[i].onclick = function (e) {
stateList.style.display = "none";
//阻止事件冒泡
e = event || window.event;
if(typeof e.stopPropagation){
e.stopPropagation();
}else {
e.cancelBubble = true;
}
var id = this.id;
loginStateShow.className = "login-state-show "+id;
var text = getByClass("stateSelect_text",id)[0].innerHTML;
stateTxt.innerHTML = text;
}
}
document.onclick = function () {
stateList.style.display = "none";
}
}
function winClose() {
var box = document.getElementById("loginPanel");
box.style.display = "none";
}
function fnDown(event) {
var event = event || window.event;
var oDrag = document.getElementById("loginPanel");
//光標(biāo)按下時(shí)光標(biāo)和面板之間的距離;
var disX = event.clientX - oDrag.offsetLeft;
var disY = event.clientY - oDrag.offsetTop;
//移動
document.onmousemove = function (event) {
event = event || window.event;
fnMove(event, disX, disY);
};
document.onmouseup = function () {
document.onmousemove = null;
document.onmouseup = null;
}
}
function fnMove(event, posX, posY) {
var oDrag = document.getElementById("loginPanel");
var l = event.clientX - posX;
var t = event.clientY - posY;
var winW = document.documentElement.clientWidth;
var winH = document.documentElement.clientHeight;
var maxW = winW - oDrag.offsetWidth - 10;
var maxH = winH - oDrag.offsetHeight;
//當(dāng)l=0時(shí),窗口不能繼續(xù)外移
if (l < 0) {
l = 0;
} else if (l > maxW) {
l = maxW;
}
if (t < 10) {
t = 10;
} else if (t > maxH) {
t = maxH;
}
oDrag.style.left = l + "px";
oDrag.style.top = t + "px";
}
要點(diǎn):
1.阻止事件冒泡
loginState.onclick點(diǎn)擊事件冒泡,導(dǎo)致下拉列表無法點(diǎn)開
loginState.onclick = function () {
stateList.style.display = "block";
}
document.onclick = function () {
stateList.style.display = "none";
}
lis[i].onclick列表項(xiàng)的點(diǎn)擊事件冒泡,導(dǎo)致下拉列表無法隱藏
lis[i].onclick = function () {
stateList.style.display = "none";
}
loginState.onclick = function () {
stateList.style.display = "block";
}
2.鼠標(biāo)事件坐標(biāo)獲取
function fnDown(event) {
var event = event || window.event;
var oDrag = document.getElementById("loginPanel");
//光標(biāo)按下時(shí)光標(biāo)和面板之間的距離;
var disX = event.clientX - oDrag.offsetLeft;
var disY = event.clientY - oDrag.offsetTop;
//移動
document.onmousemove = function (event) {
event = event || window.event;
fnMove(event, disX, disY);
};
document.onmouseup = function () {
document.onmousemove = null;
document.onmouseup = null;
}
}
function fnMove(event, posX, posY) {
var oDrag = document.getElementById("loginPanel");
var l = event.clientX - posX;
var t = event.clientY - posY;
var winW = document.documentElement.clientWidth;
var winH = document.documentElement.clientHeight;
var maxW = winW - oDrag.offsetWidth - 10;
var maxH = winH - oDrag.offsetHeight;
//當(dāng)l=0時(shí),窗口不能繼續(xù)外移
if (l < 0) {
l = 0;
} else if (l > maxW) {
l = maxW;
}
if (t < 10) {
t = 10;
} else if (t > maxH) {
t = maxH;
}
oDrag.style.left = l + "px";
oDrag.style.top = t + "px";
}
3.封裝各瀏覽器通用的getElementsByClassName()方法
方法返回的是一個(gè)數(shù)組,切記
function getByClass(clsName, parent) {
var oParent = parent ? document.getElementById(parent) : document,
eles = [],
elements = oParent.getElementsByTagName('*');
for (var i = 0, l = elements.length; i < l; i++) {
if (elements[i].className == clsName) {
eles.push(elements[i]);
}
}
return eles;
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Javascript DOM事件操作小結(jié)(監(jiān)聽鼠標(biāo)點(diǎn)擊、釋放,懸停、離開等)
- JavaScript DOM事件(筆記)
- JavaScript call apply使用 JavaScript對象的方法綁定到DOM事件后this指向問題
- JS對象與JSON互轉(zhuǎn)換、New Function()、 forEach()、DOM事件流等js開發(fā)基礎(chǔ)小結(jié)
- 關(guān)于javascript DOM事件模型的兩件事
- javascript循環(huán)變量注冊dom事件 之強(qiáng)大的閉包
- 談?wù)勎覍avaScript DOM事件的理解
- 深入理解JS DOM事件機(jī)制
- 理解javascript中DOM事件
- js中DOM事件綁定分析
- JavaScript將DOM事件處理程序封裝為event.js 出現(xiàn)的低級錯(cuò)誤問題
- js DOM的事件常見操作實(shí)例詳解
相關(guān)文章
JavaScript使用pop方法移除數(shù)組最后一個(gè)元素用法實(shí)例
這篇文章主要介紹了JavaScript使用pop方法移除數(shù)組最后一個(gè)元素,實(shí)例分析了javascript中pop方法的使用技巧,需要的朋友可以參考下2015-04-04
Javascript學(xué)習(xí)之談?wù)凧S的全局變量跟局部變量(推薦)
這篇文章主要介紹了Javascript學(xué)習(xí)之談?wù)凧S的全局變量跟局部變量雖然腳本之家小編以前發(fā)過,但還是這篇文章整理的比較好,需要的朋友可以參考一下2016-08-08
Javascript Ajax異步讀取RSS文檔具體實(shí)現(xiàn)
這篇文章主要介紹了Javascript Ajax異步讀取RSS文檔具體實(shí)現(xiàn),有需要的朋友可以參考一下2013-12-12
JS基于onclick事件實(shí)現(xiàn)單個(gè)按鈕的編輯與保存功能示例
這篇文章主要介紹了JS基于onclick事件實(shí)現(xiàn)單個(gè)按鈕的編輯與保存功能,結(jié)合實(shí)例形式分析了JS實(shí)現(xiàn)onclick響應(yīng)事件的轉(zhuǎn)換相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02
信息頁文內(nèi)畫中畫廣告js實(shí)現(xiàn)代碼(文中加載廣告方式)
一般來說文章內(nèi)容中的廣告點(diǎn)擊率更好,也更容易被訪客看到,如果直接將廣告放到頁面頭部會影響網(wǎng)站的速度,所以一般都比較喜歡這種方法,這里分享下實(shí)現(xiàn)方法2016-01-01

