js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)


Posted in Javascript onSeptember 19, 2017

QQ面板拖拽,效果如图

js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)

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";

}

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时,窗口不能继续外移
  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()方法

方法返回的是一个数组,切记

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 相关文章推荐
告诉大家什么是JSON
Jun 10 Javascript
关于COOKIE个数与大小的问题
Jan 17 Javascript
js 判断计算字符串长度/判断空的简单方法
Aug 05 Javascript
jquery $.each 和for怎么跳出循环终止本次循环
Sep 27 Javascript
jquery数组过滤筛选方法grep()简介
Jun 06 Javascript
JS中如何实现Laravel的route函数详解
Feb 12 Javascript
javascript设计模式之中介者模式学习笔记
Feb 15 Javascript
js中编码函数:escape,encodeURI与encodeURIComponent详解
Mar 21 Javascript
使用ES6语法重构React代码详解
May 09 Javascript
DataTables添加额外的查询参数和删除columns等无用参数实例
Jul 04 Javascript
vuex操作state对象的实例代码
Apr 25 Javascript
js正则表达式简单校验方法
Jan 03 Javascript
ECMAScript6变量的解构赋值实例详解
Sep 19 #Javascript
vue 粒子特效的示例代码
Sep 19 #Javascript
jQuery实现简单日期格式化功能示例
Sep 19 #jQuery
慕课网题目之js实现抽奖系统功能
Sep 19 #Javascript
使用vue与jquery实时监听用户输入状态的操作代码
Sep 19 #jQuery
JavaScript事件处理程序详解
Sep 19 #Javascript
jQuery选择器之属性筛选选择器用法详解
Sep 19 #jQuery
You might like
Javascript 各浏览器的 Javascript 效率对比
2008/01/23 Javascript
javascript AOP 实现ajax回调函数使用比较方便
2010/11/20 Javascript
FireFox下XML对象转化成字符串的解决方法
2011/12/09 Javascript
javascript检测对象中是否存在某个属性判断方法小结
2013/05/19 Javascript
JS实现OCX控件的事件响应示例
2014/09/17 Javascript
jQuery插件Tmpl的简单使用方法
2015/04/27 Javascript
JavaScript判断数组是否包含指定元素的方法
2015/07/01 Javascript
JavaScript实现邮箱地址自动匹配功能代码
2016/11/28 Javascript
基于jQuery实现数字滚动效果
2017/01/16 Javascript
基于cookie实现zTree树刷新后展开状态不变
2017/02/28 Javascript
Node.JS更改Windows注册表Regedit的方法小结
2017/08/18 Javascript
解决js ajax同步请求造成浏览器假死的问题
2018/01/18 Javascript
node中IO以及定时器优先级详解
2019/05/10 Javascript
JavaScript一元正号运算符示例代码
2019/06/30 Javascript
vue + typescript + video.js实现 流媒体播放 视频监控功能
2019/07/07 Javascript
js全屏事件fullscreenchange 实现全屏、退出全屏操作
2019/09/17 Javascript
基于redis的小程序登录实现方法流程分析
2020/05/25 Javascript
Python控制键盘鼠标pynput的详细用法
2019/01/28 Python
python实现简单聊天室功能 可以私聊
2019/07/12 Python
Python values()与itervalues()的用法详解
2019/11/27 Python
html5指南-5.使用web storage存储键值对的数据
2013/01/07 HTML / CSS
英国网络托管和域名领导者:Web Hosting UK
2017/10/15 全球购物
英国奢侈皮具品牌:Aspinal of London
2018/09/02 全球购物
什么是继承
2013/12/07 面试题
工商管理系学生的自我评价分享
2013/11/29 职场文书
军训自我鉴定
2013/12/14 职场文书
培训演讲稿范文
2014/01/12 职场文书
旅游网创业计划书
2014/01/31 职场文书
环保公益广告语
2014/03/13 职场文书
传播学专业毕业生自荐书
2014/07/01 职场文书
为什么说餐饮很难做,是因为你不了解这些新规则
2019/08/20 职场文书
python 爬取京东指定商品评论并进行情感分析
2021/05/27 Python
python中sqllite插入numpy数组到数据库的实现方法
2021/06/21 Python
浅谈MySQL之浅入深出页原理
2021/06/23 MySQL
Java 语言中Object 类和System 类详解
2021/07/07 Java/Android
JS精髓原型链继承及构造函数继承问题纠正
2022/06/16 Javascript