JavaScript实现拖拽效果


Posted in Javascript onMarch 16, 2020

要实现JavaScript的拖拽效果,首先我们需要知道事件对象几个有关于实现拖拽效果的坐标

获取事件对象 var e = e || window.event;

根据需求需要用到的拖拽效果的坐标

clientX:鼠标点击位置相对于浏览器可视区域的水平偏移量(不会计算水平滚动的距离)

clientY:鼠标点击位置相对于浏览器可视区域的垂直偏移量(不会计算垂直滚动条的距离)

offsetX:鼠标点击位置相对于触发事件对象的水平距离

offsetY:鼠标点击位置相对于触发事件对象的垂直距离

pageX:鼠标点击位置相对于网页左上角的水平偏移量,也就是clientX加 上水平滚动条的距离

pageY:鼠标点击位置相对于网页左上角的垂直平偏移量,也就是clientY加上垂直滚动条的距离

offsetLeft:如果父元素中有定位的元素,那么就返回距离当前元素最近的定位元素边缘的距离

offsetTop:如果父元素中没有定位元素,那么就返回相对于body左边缘距离

获取元素自身大小:offsetWidth和offsetHeight / clientWidth和clientHeight

offsetWidth和clientWidth的区别:就是offsetWidth包含边框,clientWidth不包含边框

实现拖拽需要用到:clientWidth、clientHeight、clientX、clientY、offsetLeft、offsetTop

首先搭建好html结构和css样式

<div class="wrap">
 <div class="cover">

 </div>
</div>
* {
  margin: 0;
  padding: 0;
 }
 
 .wrap {
  width: 500px;
  height: 500px;
  border: 1px solid deeppink;
  position: relative;
  margin: 50px auto;
 }
 
 .cover {
  width: 150px;
  height: 150px;
  background: rgba(200, 7, 99, 0.5);
  display: none;
  position: absolute;
  left: 0;
  top: 0;
  cursor: move;
 }

注意:需要给大盒子和小盒子进行定位:子绝父相

接下来就JavaScript代码

<script>
 var wrap = document.querySelector(".wrap");
 var cover = document.querySelector(".cover");
 wrap.onmouseover = function() {
 cover.style.display = "block";
 wrap.onmousemove = function(e) {
  var e = e || window.event;
  var x1 = e.clientX;
  var y1 = e.clientY;
//这里获取到的e.clientX和e.clientY,可以看情况和需求改为e.pageX和e.pageY  
  var halfWidth = cover.clientWidth / 2;
  var halfHeight = cover.clientHeight / 2;
  var wrapLeft = wrap.offsetLeft;
  var wrapTop = wrap.offsetTop;
  var l = x1 - wrapLeft - halfWidth;
  var t = y1 - wrapTop - halfHeight;

  if (l <= 0) {
  l = 0
  }
  if (l >= wrap.clientWidth - cover.clientWidth) {
  l = wrap.clientWidth - cover.clientWidth
  }
  if (t <= 0) {
  t = 0
  }
  if (t >= wrap.clientHeight - cover.clientHeight) {
  t = wrap.clientHeight - cover.clientHeight
  }
  cover.style.left = l + "px";
  cover.style.top = t + "px"
 }
 }
 wrap.onmouseout = function() {
 cover.style.display = "none";
 }
</script>
var halfWidth = cover.clientWidth / 2;
var halfHeight = cover.clientHeight / 2;
var wrapLeft = wrap.offsetLeft;
var wrapTop = wrap.offsetTop;
var l = x1 - wrapLeft - halfWidth;
var t = y1 - wrapTop - halfHeight;
//限制范围
  if (l <= 0) {
    l = 0
   }
   if (l >= wrap.clientWidth - cover.clientWidth) {
    l = wrap.clientWidth - cover.clientWidth
   }
   if (t <= 0) {
    t = 0
   }
   if (t >= wrap.clientHeight - cover.clientHeight) {
    t = wrap.clientHeight - cover.clientHeight
   }

注意:这里要限制小盒子在大盒子之间移动的范围,左上角的限制,当小盒子超出范围时,将0赋值给l和t。右下角小盒子移动的范围在大盒子宽度减去小盒子的宽度。
其中为了使鼠标一直处于小盒子(cover)的最中间,需要减去小盒子宽度的一半。
再减去大盒子距离页面左边的边距和上边的边距就可以得到坐标

只要鼠标移入大盒子中,就能直接拖拽小盒子,并且鼠标一直处于小盒子的最中间。这样便完成了简单的拖拽效果。

JavaScript实现拖拽效果

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

Javascript 相关文章推荐
获取css样式表内样式的js函数currentStyle(IE),defaultView(FF)
Feb 14 Javascript
json原理分析及实例介绍
Nov 29 Javascript
jquery ajax 调用失败的原因示例介绍
Sep 27 Javascript
jquery插件开发之实现md5插件
Mar 17 Javascript
一个字符串反转函数可实现字符串倒序
Sep 15 Javascript
一个js过滤空格的小函数
Oct 10 Javascript
VUE中v-model和v-for指令详解
Jun 23 Javascript
vue基础之使用get、post、jsonp实现交互功能示例
Mar 12 Javascript
vue中input的v-model清空操作
Sep 06 Javascript
加速vue组件渲染之性能优化
Apr 09 Javascript
JS实现躲避粒子小游戏
Jun 18 Javascript
vscode 调试 node.js的方法步骤
Sep 15 Javascript
js实现点赞效果
Mar 16 #Javascript
Javascript Web Worker使用过程解析
Mar 16 #Javascript
Javascript ParentNode和ChildNode接口原理解析
Mar 16 #Javascript
JS手写一个自定义Promise操作示例
Mar 16 #Javascript
JS函数参数的传递与同名参数实例分析
Mar 16 #Javascript
vue css 引入asstes中的图片无法显示的四种解决方法
Mar 16 #Javascript
JS函数本身的作用域实例分析
Mar 16 #Javascript
You might like
追求程序速度,而不是编程的速度
2008/04/23 PHP
深入PHP获取随机数字和字母的方法详解
2013/06/06 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
2014/07/28 PHP
php中magic_quotes_gpc对unserialize的影响分析
2014/12/16 PHP
php获取文件类型和文件信息的方法
2015/07/10 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
PHP二维索引数组的遍历实例分析【2种方式】
2019/06/24 PHP
php的instanceof和判断闭包Closure操作示例
2020/01/26 PHP
jquery.jstree 增加节点的双击事件代码
2010/07/27 Javascript
IE6背景图片不缓存问题解决方案及图片使用策略多个方法小结
2012/05/14 Javascript
JavaScript中for..in循环陷阱介绍
2013/11/12 Javascript
js判断客户端是iOS还是Android等移动终端的方法
2013/12/11 Javascript
JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法
2014/11/03 Javascript
html的DOM中Event对象onabort事件用法实例
2015/01/21 Javascript
jquery实现翻动fadeIn显示的方法
2015/03/05 Javascript
JavaScript学习笔记之创建对象
2016/03/25 Javascript
Node.js中路径处理模块path详解
2016/11/14 Javascript
js实现数组去重方法及效率?Ρ? target=
2017/02/14 Javascript
JavaScript实现简单的星星评分效果
2017/05/18 Javascript
Vue 表单控件绑定的实现示例
2017/08/11 Javascript
vue使用echarts图表的详细方法
2018/10/22 Javascript
单线程JavaScript实现异步过程详解
2020/05/19 Javascript
python中使用mysql数据库详细介绍
2015/03/27 Python
python实现通过代理服务器访问远程url的方法
2015/04/29 Python
json跨域调用python的方法详解
2017/01/11 Python
python生成随机图形验证码详解
2017/11/08 Python
OpenCV2从摄像头获取帧并写入视频文件的方法
2018/08/03 Python
OpenCV+Python识别车牌和字符分割的实现
2019/01/31 Python
python可迭代对象去重实例
2020/05/15 Python
Python实现读取并写入Excel文件过程解析
2020/05/27 Python
日本网路线上商品代购服务:转送JAPAN
2016/08/05 全球购物
党的群众路线教育实践活动对照检查材料
2014/09/22 职场文书
小学生光盘行动倡议书
2015/04/28 职场文书
Vue中foreach数组与js中遍历数组的写法说明
2021/06/05 Vue.js
Mysql中where与on的区别及何时使用详析
2021/08/04 MySQL