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 相关文章推荐
告诉大家什么是JSON
Jun 10 Javascript
深入理解JSON数据源格式
Jan 10 Javascript
JavaScript获取XML数据附示例截图
Mar 05 Javascript
js触发select onchange事件的小技巧
Aug 05 Javascript
AngularJs表单校验功能实例代码
Feb 09 Javascript
vuex 的简单使用
Mar 22 Javascript
vue里input根据value改变背景色的实例
Sep 29 Javascript
详解如何在Angular优雅编写HTTP请求
Dec 05 Javascript
Node.js对MongoDB进行增删改查操作的实例代码
Apr 18 Javascript
vue+web端仿微信网页版聊天室功能
Apr 30 Javascript
微信小程序实现按字母排列选择城市功能
Nov 25 Javascript
VUE项目实现主题切换的多种方法
Nov 26 Vue.js
百度搜索框智能提示案例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
ThinkPHP表单令牌错误的相关解决方法分析
2016/05/20 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
2018/01/16 PHP
Jquery 表单取值赋值的一些基本操作
2009/10/11 Javascript
JQuery验证工具类搜集整理
2013/01/16 Javascript
javascript获取form里的表单元素的示例代码
2014/02/14 Javascript
javascript+canvas制作九宫格小程序
2014/12/28 Javascript
jQuery原型属性和原型方法详解
2015/07/07 Javascript
基于JavaScript Array数组方法(新手必看篇)
2016/08/20 Javascript
js实现控制textarea输入字符串的个数,鼠标按下抬起判断输入字符数
2016/10/25 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
利用NPM淘宝的node.js镜像加速nvm
2017/03/27 Javascript
js自定义瀑布流布局插件
2017/05/16 Javascript
JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法示例
2018/07/27 Javascript
微信小程序顶部导航栏滑动tab效果
2019/01/28 Javascript
Python牛刀小试密码爆破
2011/02/03 Python
python连接MySQL、MongoDB、Redis、memcache等数据库的方法
2013/11/15 Python
基于wxpython开发的简单gui计算器实例
2015/05/30 Python
Python找出list中最常出现元素的方法
2016/06/14 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
2018/04/06 Python
记一次python 内存泄漏问题及解决过程
2018/11/29 Python
python实现转圈打印矩阵
2019/03/02 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
2019/08/31 Python
python 3.6.7实现端口扫描器
2019/09/04 Python
简单了解Python write writelines区别
2020/02/27 Python
柯基袜:Corgi Socks
2017/01/26 全球购物
英国景点门票网站:attractiontix
2019/08/27 全球购物
Java面试题汇总
2015/12/06 面试题
创业计划书如何编写
2014/02/06 职场文书
新教师工作感言
2014/02/16 职场文书
领导失职检讨书
2014/02/24 职场文书
高三学习决心书
2014/03/11 职场文书
给校长的建议书200字
2014/05/16 职场文书
自主招生推荐信格式模板
2015/03/24 职场文书
导游词之四川武侯祠
2019/10/21 职场文书
如何使JavaScript休眠或等待
2021/04/27 Javascript
Spring mvc是如何实现与数据库的前后端的连接操作的?
2021/06/30 Java/Android