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 相关文章推荐
jquery刷新页面的实现代码(局部及全页面刷新)
Jul 11 Javascript
CSS(js)限制页面显示的文本字符长度
Dec 27 Javascript
JavaScript实现自己的DOM选择器原理及代码
Mar 04 Javascript
使用js操作cookie的一点小收获分享
Sep 03 Javascript
javascript对下拉列表框(select)的操作实例讲解
Nov 29 Javascript
JS实现新浪博客左侧的Blog管理菜单效果代码
Oct 22 Javascript
jQuery中队列queue()函数的实例教程
May 03 Javascript
js操作数据库实现注册和登陆的简单实例
May 26 Javascript
AngularJS中watch监听用法分析
Nov 04 Javascript
Kotlin学习第一步 kotlin语法特性
May 25 Javascript
JS实现简易换图时钟功能分析
Jan 04 Javascript
Vue 数据响应式相关总结
Jan 28 Vue.js
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
PHP 和 XML: 使用expat函数(三)
2006/10/09 PHP
php 无限级 SelectTree 类
2009/05/19 PHP
基于PHP实现数据分页显示功能
2016/05/26 PHP
禁止js文件缓存的代码
2010/04/09 Javascript
javascript中onmouse事件在div中失效问题的解决方法
2012/01/09 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
详解JavaScript实现设计模式中的适配器模式的方法
2016/05/18 Javascript
JavaScript的==运算详解
2016/07/20 Javascript
js 获取元素所有兄弟节点的实现方法
2016/09/06 Javascript
DropDownList控件绑定数据源的三种方法
2016/12/24 Javascript
Canvas实现动态的雪花效果
2017/02/13 Javascript
浅谈Koa2框架利用CORS完成跨域ajax请求
2018/03/06 Javascript
JavaScript高级函数应用之分时函数实例分析
2018/08/03 Javascript
微信小程序使用swiper组件实现类3D轮播图
2018/08/29 Javascript
VueJs里利用CryptoJs实现加密及解密的方法示例
2019/04/29 Javascript
vue项目中实现缓存的最佳方案详解
2019/07/11 Javascript
JS手写一个自定义Promise操作示例
2020/03/16 Javascript
[43:35]TI4 循环赛第二日Liquid vs Fnatic
2014/07/11 DOTA
[01:03:37]Secret vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
[10:18]2018DOTA2国际邀请赛寻真——找回自信的TNCPredator
2018/08/13 DOTA
Python导入txt数据到mysql的方法
2015/04/08 Python
python查询sqlite数据表的方法
2015/05/08 Python
python filecmp.dircmp实现递归比对两个目录的方法
2020/05/22 Python
详解Python+Selenium+ChromeDriver的配置和问题解决
2021/01/19 Python
ZINVO手表官网:男士和女士手表
2019/03/10 全球购物
中国领先的汽车保养服务平台:途虎养车
2019/10/18 全球购物
德国高尔夫商店:Par71.de
2020/11/29 全球购物
.NET面试10题
2014/02/24 面试题
师范生的个人求职信范文
2014/01/04 职场文书
纺织工程专业个人求职信范文
2014/01/27 职场文书
护士自我评价
2014/02/01 职场文书
《匆匆》教学反思
2014/02/22 职场文书
中小学校园安全广播稿
2014/09/29 职场文书
会计继续教育培训心得体会
2016/01/19 职场文书
详细聊一聊mysql的树形结构存储以及查询
2022/04/05 MySQL
Python+SeaTable实现计算两个日期间的工作日天数
2022/07/07 Python