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 相关文章推荐
使用隐藏的new来创建对象
Mar 29 Javascript
Webkit的跨域安全问题说明
Sep 13 Javascript
如何使用Jquery获取Form表单中被选中的radio值
Aug 09 Javascript
Javascript中的Callback方法浅析
Mar 15 Javascript
前端js实现文件的断点续传 后端PHP文件接收
Oct 14 Javascript
小程序点赞收藏功能的实现代码示例
Sep 07 Javascript
vue实现同一个页面可以有多个router-view的方法
Sep 20 Javascript
node和vue实现商城用户地址模块
Dec 05 Javascript
实现一个 Vue 吸顶锚点组件方法
Jul 10 Javascript
微信小程序基于movable-view实现滑动删除效果
Jan 08 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
Jul 26 Javascript
JS使用setInterval计时器实现挑战10秒
Nov 08 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
phpmyadmin导入(import)文件限制的解决办法
2009/12/11 PHP
php 读取shell管道传输过来的内容
2010/03/01 PHP
php数组函数序列之in_array() - 查找数组中是否存在指定值
2011/11/07 PHP
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
BOOM vs RR BO3 第一场2.13
2021/03/10 DOTA
jquery 插件 任意位置浮动固定层
2008/12/25 Javascript
JavaScript 新手24条实用建议[TUTS+]
2009/06/21 Javascript
不一样的文字闪烁 轮番闪烁
2009/11/11 Javascript
IE和Firefox的Javascript兼容性总结[推荐收藏]
2011/10/19 Javascript
js设置文本框中焦点位置在最后的示例代码(简单实用)
2014/03/04 Javascript
jquery实现的简单二级菜单效果代码
2015/09/22 Javascript
jQuery Mobile开发中日期插件Mobiscroll使用说明
2016/03/02 Javascript
jQuery和JavaScript节点插入元素的方法对比
2016/11/18 Javascript
Webpack执行命令参数详解
2017/06/17 Javascript
深入理解vue $refs的基本用法
2017/07/13 Javascript
ES6中的Promise代码详解
2017/10/09 Javascript
Vue 仿QQ左滑删除组件功能
2018/03/12 Javascript
如何在 Vue 中使用 JSX
2021/02/14 Vue.js
[00:38]TI珍贵瞬间系列(二):笑
2020/08/26 DOTA
通过代码实例展示Python中列表生成式的用法
2015/03/31 Python
Python 模块EasyGui详细介绍
2017/02/19 Python
python实现逐个读取txt字符并修改
2018/12/24 Python
使用Django实现把两个模型类的数据聚合在一起
2020/03/28 Python
Python通过len函数返回对象长度
2020/10/22 Python
空指针到底是什么
2012/08/07 面试题
2014年财务工作总结范文
2014/11/11 职场文书
个人借款协议书范本
2014/11/17 职场文书
放射科岗位职责
2015/02/14 职场文书
超市员工辞职信范文
2015/05/12 职场文书
自书遗嘱范文
2015/08/07 职场文书
2016秋季田径运动会广播稿
2015/12/21 职场文书
小学数学新课改心得体会
2016/01/22 职场文书
2019职场实习报告该怎么写?
2019/07/01 职场文书
自定义函数实现单词排序并运用于PostgreSQL(实现代码)
2021/04/22 PostgreSQL
关于vue中如何监听数组变化
2021/04/28 Vue.js
能让Python提速超40倍的神器Cython详解
2021/06/24 Python