//HTML渲染完后再加载 window.onload = function () { var oPanel = document.getElementById('loginPanel'); //登录界面 var oTitle = document.getElementsByClassName('login_logo_webqq')[0]; //标题栏 var oStatus = document.getElementById('loginState'); //状态栏 var oClock = document.getElementById('ui_boxyClose'); //关闭按钮 //按住标题栏事件 oTitle.onmousedown = function () { var disX = event.clientX - oPanel.offsetLeft; //鼠标点击处和界面左边界的距离 var disY = event.clientY - oPanel.offsetTop; //鼠标点击处和界面上边界的距离 //鼠标移动事件:触发登陆界面跟随 document.onmousemove = function (event/*传入事件*/) { event = event || window.event; //取出事件 var left = event.clientX - disX; //界面左边界水平坐标 var top = event.clientY - disY; //界面上边界垂直坐标 var maxLeft = document.documentElement.clientWidth - oPanel.offsetWidth; //界面左边界水平坐标最大限制 var maxTop = document.documentElement.clientHeight - oPanel.offsetHeight; //界面上边界垂直坐标最大限制 //如果水平坐标超过最大限制,则界面不再跟随鼠标移动 if (left > maxLeft - 10) { left = maxLeft - 10; //为关闭按钮预留10px空间 } else if (left < 0) { left = 0; } //同理 if (top > maxTop) { top = maxTop; } else if (top < 10) { top = 10; //为关闭按钮预留10px空间 } oPanel.style.left = left + 'px'; //client和offset为整型数,不带单位 oPanel.style.top = top + 'px'; //松开鼠标键事件:界面不再跟随 document.onmouseup = function () { document.onmousemove = null; //移动事件不再触发任何活动 } } } //点击状态栏事件:弹出状态选择菜单(下拉菜单) oStatus.onclick = function () { event.stopPropagation(); //阻止冒泡事件,防止点击了父节点(HTML文档)导致菜单关闭 var sPanel = document.getElementById('loginStatePanel'); //下拉菜单 var pLists = document.getElementsByClassName('statePanel_li'); //菜单列表 sPanel.style.display = 'block'; //显示下HTML拉菜单 //遍历菜单列表,添加动态效果 for (var i = 0; i < pLists.length; i++) { //鼠标经过事件:触发灰色背景 pLists[i].onmouseover = function () { this.style.backgroundColor = '#999'; } //鼠标移开事件:背景颜色恢复 pLists[i].onmouseout = function () { this.style.backgroundColor = '#fff'; } //鼠标点击事件:更改状态栏内容并关闭下拉菜单 pLists[i].onclick = function (event) { event = event || window.event; event.stopPropagation(); //阻止冒泡事件,防止点击了父节点(状态栏)导致下拉菜单关闭失败 var sShow = document.getElementById('loginStateShow'); //状态栏图标 var sTxt = document.getElementById('login2qq_state_txt'); //状态栏文本 sShow.className = 'login-state-show ' + this.id; //修改状态栏图标为选中项的状态图标 sTxt.innerHTML = this.getElementsByTagName('div')[1].innerHTML; //修改状态栏文本为选中项的状态文本 sPanel.style.display = 'none'; //关闭下拉菜单 } } /*点击HTML文档事件(除状态栏外的其他区域):触发下拉菜单关闭 若点击了状态栏,则不会触发此操作(冒泡被阻止)*/ document.onclick = function () { sPanel.style.display = 'none'; } } //点击关闭按钮事件:触发登录界面隐藏 oClock.onclick = function () { oPanel.style.display = 'none'; } }
通过class来获取元素
事件类型:
鼠标事件
键盘事件
document.getElementByClassName()
IE10以前的浏览器不支持
不同的事件类型
跟着鼠标光标移动的框,都有一个绝对定位:position:absolute;
onmousedown:在用户按下任何鼠标按钮时触发
光标位置 clientX clientY
onmousemove 当鼠标指针在元素内部移动时重复地触发
鼠标事件详情
1、任何能够跟着鼠标移动的东西 都要有一个前提:绝对定位
2、鼠标事件都是在浏览器窗口中的特定位置上发生的。这个位置信息保存在事件的clientX和clientY属性中。所有浏览器都支持这两个属性,它们的值表示事件发生时鼠标指针在视口中的水平和垂直坐标。不包括页面滚动的距离。
3、js ie10以下版本不支持document.getElementsByClassName
4、js封装getClass方法,获取class
5、实现随鼠标拖动,需要让窗口的坐标随着鼠标移动,鼠标的坐标保存在时间的clientX和clientY两个属性中。
6、onmousedown鼠标按下 窗口和鼠标的位置同步;
element.style.left/top=clientX/Y+'px';
onmousemove当鼠标指针在元素内部移动时重复地触发
2.在指定区域(整个QQ面板)按下——页面随光标移动,即页面的坐标与光标坐标一致——释放鼠标是停止移动
3.clientX与clentY能够获取鼠标的光标位置;onmousedown鼠标按下事件;移动要用到onmousemove事件,当鼠标指针在元素内部移动时重复的触发;clientX与clentY是event这个对象的属性,非ie用event,ie用window.event
在IE10之前的游览器不支持document.getElementByClassName()。因此为了解决游览器不兼容的问题,首先我们需要封装一个获取类名的方法(这个面板的样式大部分是用class写的)
// 封装一个取类名方法
function getClasses(clsName,parent){
var oParent = parent ? document.getElementById(parent) : document,
eles = [],
elements = oParent.getElementsByTagName("*");
for(var i=0,j=elements.length;i<j;i++){
if(elements[i].className === clsName){
eles.push(elements[i]);
}
}
return eles;
}
2.在指定区域(整个QQ面板)按下——页面随光标移动,即页面的坐标与光标坐标一致——释放鼠标是停止移动
3.clientX与clentY能够获取鼠标的光标位置;onmousedown鼠标按下事件;移动要用到onmousemove事件,当鼠标指针在元素内部移动时重复的触发;clientX与clentY是event这个对象的属性,非ie用event,ie用window.event
QQ面板拖拽效果的制作
在IE10之前的游览器不支持document.getElementByClassName()。因此为了解决游览器不兼容的问题,首先我们需要封装一个获取类名的方法(这个面板的样式大部分是用class写的)