js實現(xiàn)QQ面板拖拽效果(慕課網(wǎng)DOM事件探秘)(全)
更新時間:2017年09月19日 09:04:32 作者:喵嘻嘻
這篇文章主要為大家詳細介紹了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;
//關閉頁面
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");
//點擊顯示下拉單
loginState.onclick = function (e) {
stateList.style.display = "block";
//阻止事件冒泡;
e = event || window.event;
if(e.stopPropagation){
e.stopPropagation();
}else{
e.cancelBubble = true;
}
};
//鼠標滑過,背景變色
for (var i = 0; i < lis.length; i++) {
lis[i].onmouseover = function () {
this.style.backgroundColor = "#888";
};
lis[i].onmouseout = function () {
this.style.backgroundColor = "#fff";
};
//鼠標點擊,txt改變,圖標改變
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");
//光標按下時光標和面板之間的距離;
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;
//當l=0時,窗口不能繼續(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";
}
要點:
1.阻止事件冒泡
loginState.onclick點擊事件冒泡,導致下拉列表無法點開
loginState.onclick = function () {
stateList.style.display = "block";
}
document.onclick = function () {
stateList.style.display = "none";
}
lis[i].onclick列表項的點擊事件冒泡,導致下拉列表無法隱藏
lis[i].onclick = function () {
stateList.style.display = "none";
}
loginState.onclick = function () {
stateList.style.display = "block";
}
2.鼠標事件坐標獲取
function fnDown(event) {
var event = event || window.event;
var oDrag = document.getElementById("loginPanel");
//光標按下時光標和面板之間的距離;
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;
//當l=0時,窗口不能繼續(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()方法
方法返回的是一個數(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;
}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- Javascript DOM事件操作小結(監(jiān)聽鼠標點擊、釋放,懸停、離開等)
- JavaScript DOM事件(筆記)
- JavaScript call apply使用 JavaScript對象的方法綁定到DOM事件后this指向問題
- JS對象與JSON互轉換、New Function()、 forEach()、DOM事件流等js開發(fā)基礎小結
- 關于javascript DOM事件模型的兩件事
- javascript循環(huán)變量注冊dom事件 之強大的閉包
- 談談我對JavaScript DOM事件的理解
- 深入理解JS DOM事件機制
- 理解javascript中DOM事件
- js中DOM事件綁定分析
- JavaScript將DOM事件處理程序封裝為event.js 出現(xiàn)的低級錯誤問題
- js DOM的事件常見操作實例詳解
相關文章
uni-app使用uploadFile上傳多張圖片的具體實現(xiàn)
在微信小程序中不支持多張圖片上傳,需要做循環(huán)實現(xiàn)多張圖片上傳,下面這篇文章主要給大家介紹了關于uni-app使用uploadFile上傳多張圖片的具體實現(xiàn),需要的朋友可以參考下2023-04-04
js圖數(shù)據(jù)結構處理 迪杰斯特拉算法代碼實例
這篇文章主要介紹了js圖數(shù)據(jù)結構處理 迪杰斯特拉算法代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-09-09
用js實現(xiàn)判斷當前網(wǎng)址的來路如果不是指定的來路就跳轉到指定頁面
用js實現(xiàn)判斷當前網(wǎng)址的來路如果不是指定的來路就跳轉到指定頁面,需要的朋友可以參考下。2011-05-05
JavaScript給按鈕綁定點擊事件(onclick)的方法
這篇文章主要介紹了JavaScript給按鈕綁定點擊事件(onclick)的方法,涉及javascript綁定onclick的基本技巧,非常具有實用價值,需要的朋友可以參考下2015-04-04

