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 相关文章推荐
比较全面的event对像在IE与FF中的区别 推荐
Sep 21 Javascript
jquery的Tooltip插件 qtip使用详细说明
Sep 08 Javascript
jquery submit ie6下失效的原因分析及解决方法
Nov 15 Javascript
深入理解JavaScript系列(43):设计模式之状态模式详解
Mar 04 Javascript
jQuery实现自定义事件的方法
Apr 17 Javascript
JS+CSS实现滑动切换tab菜单效果
Aug 25 Javascript
好好了解一下Cookie(强烈推荐)
Jun 14 Javascript
jQuery插件HighCharts绘制2D饼图效果示例【附demo源码下载】
Mar 21 jQuery
JQuery EasyUI的一些常用组件
Jul 12 jQuery
laydate日历控件使用方法详解
Nov 20 Javascript
让Vue也可以使用Redux的方法
May 23 Javascript
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
Apr 17 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
PHP+MYSQL会员系统的登陆即权限判断实现代码
2011/09/23 PHP
探讨PHP调用时间格式的参数详解
2013/06/06 PHP
php获取指定日期之间的各个周和月的起止时间
2014/11/24 PHP
php实现上传图片文件代码
2015/07/19 PHP
Symfony学习十分钟入门经典教程
2016/02/03 PHP
分享几种好用的PHP自定义加密函数(可逆/不可逆)
2020/09/15 PHP
JavaScript this 深入理解
2009/07/30 Javascript
javascript window.opener的用法分析
2010/04/07 Javascript
用js小类库获取浏览器的高度和宽度信息
2012/01/15 Javascript
js 与 php 通过json数据进行通讯示例
2014/03/26 Javascript
jquery中map函数与each函数的区别实例介绍
2014/06/23 Javascript
avalon js实现仿微博拖动图片排序
2015/08/14 Javascript
JS实现仿微博可关闭弹出层效果
2015/09/21 Javascript
jQuery实现简洁的导航菜单效果
2015/11/23 Javascript
Google 地图API资料整理及详细介绍
2016/08/06 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(同步显示图像位置信息)
2016/12/02 Javascript
微信小程序 WebSocket详解及应用
2017/01/21 Javascript
JS实现简单的天数计算器完整实例
2017/04/28 Javascript
Vue实现一个返回顶部backToTop组件
2017/07/25 Javascript
Iphone手机、安卓手机浏览器控制默认缩放大小的方法总结(附代码)
2017/08/18 Javascript
Angular中响应式表单的三种更新值方法详析
2017/08/22 Javascript
Vue 中使用vue2-highcharts实现top功能的示例
2018/03/05 Javascript
微信小程序第三方框架对比 之 wepy / mpvue / taro
2019/04/10 Javascript
回顾Javascript React基础
2019/06/15 Javascript
vue结合el-upload实现腾讯云视频上传功能
2020/07/01 Javascript
写一个Vue loading 插件
2020/11/09 Javascript
[00:33]2016完美“圣”典风云人物:Sccc宣传片
2016/12/03 DOTA
浅谈用Python实现一个大数据搜索引擎
2017/11/28 Python
PyQt5组件读取参数的实例
2019/06/25 Python
Python DataFrame一列拆成多列以及一行拆成多行
2019/08/06 Python
基于keras输出中间层结果的2种实现方式
2020/01/24 Python
python实现读取类别频数数据画水平条形图案例
2020/04/24 Python
Python判断远程服务器上Excel文件是否被人打开的方法
2020/07/13 Python
严选全球尖货,立足香港:Bonpont宝盆
2018/07/24 全球购物
商业街策划方案
2014/05/31 职场文书
唐山大地震观后感
2015/06/05 职场文书