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;
//切换状态
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时,窗口不能继续外移
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";

}

QQ面板拖拽(慕课网DOM事件探秘)(上)的更多相关文章

  1. QQ面板拖拽(慕课网DOM事件探秘)(下)

    2.鼠标事件坐标获取 function fnDown(event) { var event = event || window.event; var oDrag = document.getEleme ...

  2. Android高级控件(六)——自定义ListView高仿一个QQ可拖拽列表的实现

    Android高级控件(六)--自定义ListView高仿一个QQ可拖拽列表的实现 我们做一些好友列表或者商品列表的时候,居多的需求可能就是需要列表拖拽了,而我们选择了ListView,也是因为使用L ...

  3. DOM事件探秘

    说到DOM事件,就不得不说以下几点: 1 事件流 事件流:描述的是从页面中接受事件的顺序 事件流分为事件冒泡流和事件捕获流.那么什么是事件冒泡,什么是事件捕获呢? 事件冒泡:即事件最开始由最具体的元素 ...

  4. 模拟拖拽图片 碰撞检测 DOM 鼠标事件 闭包

    <!doctype html><html lang="en"> <head> <meta charset="UTF-8" ...

  5. 鼠标拖拽定位和DOM各种尺寸详解

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. jquery 面板拖拽

    在网上找了好多的例子 都不满足我所需要 在网上找了一篇关于easyui是一个拓展的demo  然后根据demo 把我所需要的东西进行再次拓展 满足我的需求 也不多说了 上代码 首先 你肯定是要导eas ...

  7. 二、JavaScript语言--事件处理--DOM事件探秘

    第一章 事件流 事件:是文档或浏览器窗口中发生的.特定的交互瞬间.JavaScript和HTML之间的交互都是通过事件来实现的. 事件流:描述的是从页面中接受事件的顺序 IE:事件冒泡流 Netsca ...

  8. 二、JavaScript语言--事件处理--DOM事件探秘--下拉菜单

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. DOM事件

    在慕课网上学习了DOM事件探秘课程,特此整理了一下笔记. 慕课网DOM事件探秘课程地址:http://www.imooc.com/learn/138 事件 是文档或浏览器窗口中发生的特定的交互瞬间.[ ...

随机推荐

  1. tuple built-in function

    tuple tips: 1.对于Python中的tuple类型来说,他与其它的序列类型来讲最大的不同就是tuple是不可变的. 2.当你需要创建一个只有一个元素的tuple时,需要在元祖分隔符里面加一 ...

  2. 一步一步学Silverlight 2系列(17):数据与通信之ADO.NET Data Services

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  3. 常用文件操作模块json,pickle、shelve和XML

    一.json 和 pickle模块 用于序列化的两个模块 json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 Js ...

  4. Android的三种主流资源尺寸

    Android三种主流资源屏幕尺寸:QVGA.HVGA.WVGA VGA的分辨率是640x480像素 QVGA(Quarter VGA)就是320x240,即VGA分辨率的1/4 HVGA(Half ...

  5. [原创]java获取word里面的文本

    需求场景 开发的web办公系统如果需要处理大量的Word文档(比如有成千上万个文档),用户一定提出查找包含某些关键字的文档的需求,这就要求能够读取 word 中的文字内容,而忽略其中的文字样式.表格. ...

  6. 计算机科学 —— 时间戳(timestamp)

    时间戳的一个重要属性即是:唯一性,以起到唯一标识的作用: 1. linux 命令行 $ date +%s 1506222745 2. Python 时间戳 内置 time 库 >> tim ...

  7. java -- 虚拟机和内存

    从大方向来分:栈内存,堆内存,方法区,本地方法栈,程序计数器 java从存储数据的角度来分: 寄存器(register):最快的存储区,由编译器根据需求进行分配,不由认为控制. 堆栈(statck): ...

  8. Bootstrap-CL:下拉菜单

    ylbtech-Bootstrap-CL:下拉菜单 1.返回顶部 1. Bootstrap 下拉菜单(Dropdowns) 本章将重点介绍 Bootstrap 下拉菜单.下拉菜单是可切换的,是以列表格 ...

  9. View Controller Programming Guide for iOS---(五)---Resource Management in View Controllers

    Resource Management in View Controllers View controllers are an essential part of managing your app’ ...

  10. 洛谷 - P2598 - 狼和羊的故事 - 最大流

    https://www.luogu.org/problemnew/show/P2598 第一次写这种修篱笆的题目,上次好像晓阳dalao写了一个堵人的.好像还有能改变土地属性的. #include&l ...