js拖拽功能实现代码解析


Posted in Javascript onNovember 28, 2016

本文解决的问题:

1、怎样在网页中实现拖曳功能;

2、document.documentElementdocument.body的区别。
document.documentElement.clientWidth指整个html文档的宽度,document.body.clientWidth的宽度。这两者是不一样的。可以在console控制台通过console.log(document.documentElement)和console.log(document.body)进行测试。

3、getBoundingClientRect().leftoffsetLeft的区别。
getBoundingClientRect()用于获取元素的left、top、right、bottom。offset获取相对于父级的left和top。getBoundingClientRect()获取相对于窗口的left、top、right、bottom。

4、e.clientX指的是鼠标点相对于窗口的坐标。

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>弹窗</title>
 <style type="text/css">
  #mask {
   position: fixed;
   left:0;
   top:0;
   width:100%;
   height: 100%;
   background-color: hsla(250,100%,50%,0.6);
   display: none;
  }
  #popBox {
   position: absolute;
   background-color: #fff;
   width:200px;
   height: 200px;
   /*left:50%;
   top:50%;*/
   /*margin-top: -100px;
   margin-left: -100px;*/
  }
 </style>
</head>
<body>
 <button id="clickBtn">点击</button>
 <div id="mask">
  <div id="popBox"></div>
 </div>
 <script type="text/javascript">
  var clickBtn = document.getElementById("clickBtn");
  var popBox = document.getElementById("popBox")
  var mask = document.getElementById("mask");
  clickBtn.onclick = function() {
   mask.style.display = "block";
   popBox.style.left = (document.documentElement.clientWidth - popBox.offsetWidth)/2 + "px";
   popBox.style.top = (document.documentElement.clientHeight - popBox.offsetHeight)/2 + "px";

  }
  popBox.onclick = function(e) {
   var e = e || window.event;//e指所有代码的集合,通过它可以获取事件的各种属性。
   e.cancelBubble = true;//阻止事件冒泡,即点击事件不会传递到mask这一层,意味着不会触发点击mask事件代码。
  }
  mask.onclick = function() {
   mask.style.display = "none";
  }

  //拖拽 mousedown->mousemove->mouseup 
  popBox.onmousedown = function(e) {
   var e = e || window.event;
   var pos = popBox.getBoundingClientRect();//getBoundingClientRect()用于获取元素的left、top、right、bottom。offset获取相对于父级的left和top。getBoundingClientRect()获取相对于窗口的left、top、right、bottom。
   var oX = e.clientX - pos.left;//clientX指相对于窗口的坐标。
   var oY = e.clientY - pos.top;
   document.onmousemove = function(e) {
    var e = e || window.event;
    var oLeft = e.clientX - oX;
    var oTop = e.clientY - oY;
    popBox.style.left = oLeft + "px";
    popBox.style.top = oTop + "px";
    if (oLeft<0) {
     popBox.style.left = 0 + "px";
    };
    if (oLeft>document.documentElement.clientWidth - popBox.offsetWidth) {
     popBox.style.left = document.documentElement.clientWidth - popBox.offsetWidth + "px";//document.documentElement.clientWidth指整个html文档的宽度,document.body.clientWidth的宽度。这两者是不一样的。可以在console控制台通过console.log(document.documentElement)和console.log(document.body)进行测试。


    }
    if (oTop<0) {
     popBox.style.top = 0 + "px";
    };
    if (oTop > document.documentElement.clientHeight - popBox.offsetHeight) {
     popBox.style.top = document.documentElement.clientHeight - popBox.offsetHeight + "px";
    }

   }
   popBox.onmouseup = function() {
    document.onmousemove = null;
   }
  }
 </script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js中for in的用法示例解析
Dec 25 Javascript
jQuery往返城市和日期查询实例讲解
Oct 09 Javascript
JavaScript+html5 canvas绘制渐变区域完整实例
Jan 26 Javascript
js select下拉联动 更具级联性!
Apr 17 Javascript
JavaScript严格模式详解
Jan 16 Javascript
iOS + node.js使用Socket.IO框架进行实时通信示例
Apr 14 Javascript
详谈jQuery中使用attr(), prop(), val()获取value的异同
Apr 25 jQuery
vuex实现的简单购物车功能示例
Feb 13 Javascript
Vue实现购物车的全选、单选、显示商品价格代码实例
May 06 Javascript
vue-property-decorator用法详解
Dec 12 Javascript
vue实现计算器功能
Feb 22 Javascript
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
Sep 10 Javascript
百度搜索框智能提示案例jsonp
Nov 28 #Javascript
JS函数多个参数默认值指定方法分析
Nov 28 #Javascript
ajax级联菜单实现方法实例分析
Nov 28 #Javascript
jQuery select自动选中功能实现方法分析
Nov 28 #Javascript
JS两种类型的表单提交方法实例分析
Nov 28 #Javascript
简单实现JavaScript图片切换效果
Nov 28 #Javascript
jQGrid动态填充select下拉框的选项值(动态填充)
Nov 28 #Javascript
You might like
phpmailer发送gmail邮件实例详解
2013/06/24 PHP
详解PHP编码转换函数应用技巧
2016/10/22 PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
2017/02/23 PHP
php获取目录中所有文件名及判断文件与目录的简单方法
2017/03/04 PHP
基于jquery的lazy loader插件实现图片的延迟加载[简单使用]
2011/05/07 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
2012/02/11 Javascript
JavaScript中把数字转换为字符串的程序代码
2013/06/19 Javascript
nodejs读取memcache示例分享
2014/01/02 NodeJs
Javascript中引用示例介绍
2014/02/21 Javascript
javascript 实现 原路返回
2015/01/21 Javascript
jQuery+Ajax+PHP+Mysql实现分页显示数据实例讲解
2015/09/27 Javascript
Javascript的动态增加类的实现方法
2016/10/20 Javascript
jquery处理checkbox(复选框)是否被选中实例代码
2017/06/12 jQuery
JS检测是否可以访问公网服务器功能代码
2017/06/19 Javascript
es6学习之解构时应该注意的点
2017/08/29 Javascript
JS实现的缓冲运动效果示例
2018/04/30 Javascript
mpvue中使用flyjs全局拦截的实现代码
2018/09/13 Javascript
vue使用echarts图表的详细方法
2018/10/22 Javascript
vue的注意规范之v-if 与 v-for 一起使用教程
2019/08/04 Javascript
微信小程序3D轮播实现代码
2019/09/19 Javascript
vue简单练习 桌面时钟的实现代码实例
2019/09/19 Javascript
JavaScript的垃圾回收机制与内存管理
2020/08/06 Javascript
vue 解决data中定义图片相对路径页面不显示的问题
2020/08/13 Javascript
微信小程序实现身份证取景框拍摄
2020/09/09 Javascript
[02:28]DOTA2亚洲邀请赛附加赛 RECAP赛事回顾
2015/01/29 DOTA
Python中处理字符串之isalpha()方法的使用
2015/05/18 Python
python九九乘法表的实例
2017/09/26 Python
python使用turtle库绘制树
2018/06/25 Python
对Python 数组的切片操作详解
2018/07/02 Python
python 求某条线上特定x值或y值的点坐标方法
2019/07/09 Python
Pytorch释放显存占用方式
2020/01/13 Python
解决pycharm修改代码后第一次运行不生效的问题
2021/02/06 Python
大学生家政服务项目创业计划书
2014/01/30 职场文书
政风行风整改方案
2014/10/25 职场文书
2014年精神文明建设工作总结
2014/11/19 职场文书
评职称个人总结
2015/03/05 职场文书