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 相关文章推荐
页面实时更新时间的JS实例代码
Dec 18 Javascript
jquery prop的使用介绍及与attr的区别
Dec 19 Javascript
js实现div的切换特效上一个下一个
Feb 11 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
Apr 12 Javascript
BootStrap Table 分页后重新搜索问题的解决办法
Aug 08 Javascript
vue下history模式刷新后404错误解决方法
Aug 18 Javascript
微信小程序自定义toast弹窗效果的实现代码
Nov 15 Javascript
原生js实现获取form表单数据代码实例
Mar 27 Javascript
浅谈JS中几种轻松处理'this'指向方式
Sep 16 Javascript
微信小程序wx.getUserInfo授权获取用户信息(头像、昵称)的实现
Aug 19 Javascript
基于vue实现简易打地鼠游戏
Aug 21 Javascript
Javascript类型判断相关例题及解析
Aug 26 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
PHP开发中常用的8个小技巧
2008/08/27 PHP
解析php类的注册与自动加载
2013/07/05 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
2016/09/22 PHP
php与c 实现按行读取文件实例代码
2017/01/03 PHP
Windows平台实现PHP连接SQL Server2008的方法
2017/07/26 PHP
thinkPHP3.2.2框架行为扩展及demo示例
2018/06/19 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
PHP7 弃用功能
2021/03/09 PHP
javascript实现上传图片并预览的效果实现代码
2011/04/11 Javascript
JS中的构造函数详细解析
2014/03/10 Javascript
在JS数组特定索引处指定位置插入元素的技巧
2014/08/24 Javascript
jquery实现一个简单好用的弹出框
2014/09/26 Javascript
使用js Math.random()函数生成n到m间的随机数字
2014/10/09 Javascript
JavaScript中的setUTCDate()方法使用详解
2015/06/11 Javascript
使用CDN和AJAX加速WordPress中jQuery的加载
2015/12/05 Javascript
基于jquery实现无限级树形菜单
2016/03/22 Javascript
JS实现根据文件字节数返回文件大小的方法
2016/08/02 Javascript
AngularJS基于ui-route实现深层路由的方法【路由嵌套】
2016/12/14 Javascript
vue-router之实现导航切换过渡动画效果
2019/10/31 Javascript
vue-router 路由传参用法实例分析
2020/03/06 Javascript
vue的$http的get请求要加上params操作
2020/11/12 Javascript
详细解析Python中的变量的数据类型
2015/05/13 Python
python清除字符串中间空格的实例讲解
2018/05/11 Python
python 执行文件时额外参数获取的实例
2018/12/18 Python
Python supervisor强大的进程管理工具的使用
2019/04/24 Python
Django用户登录与注册系统的实现示例
2020/06/03 Python
Pycharm操作Git及GitHub的步骤详解
2020/10/27 Python
HTML5实现桌面通知 提示功能
2017/10/11 HTML / CSS
女士时装鞋:Chinese Laundry
2018/08/29 全球购物
如何启动时不需输入用户名与密码
2014/05/09 面试题
销售经理工作职责范文
2013/12/03 职场文书
大专生自我评价
2014/01/28 职场文书
小学国庆节活动方案策划书
2014/09/16 职场文书
2014年园林绿化工作总结
2014/12/11 职场文书
九九重阳节致辞
2015/07/31 职场文书
小学毕业教师寄语
2019/06/21 职场文书