js实现限定区域范围拖拉拽效果


Posted in Javascript onNovember 20, 2020

本文实例为大家分享了js实现限定区域范围拖拉拽的具体代码,供大家参考,具体内容如下

需要在范围内拖拉拽,之前看来许多资料觉得都不是特别满足要求,今天自己写了一个,通过监听鼠标按下、鼠标抬起、鼠标移动事件来控制

代码如下

<!DOCTYPE html>

<html lang="en">
 <head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Document</title>
  <style>

   #drag {

    background: aqua;
    width: 200px;
    height: 200px;
    position: absolute;
    -moz-user-select: none;
    -khtml-user-select: none;
    user-select: none;

   }

   #parent {
    position: relative;
    background: #cde4dc;
    height: 80vh;
    overflow: hidden;

   }

  </style>
 </head>

<body>
  <section id="parent">
   <div id="drag"><div>这是一个测试</div></div>
  </section>
  <script type="text/javascript">

   //自执行函数,需要拖拽的元素需要设置position:absolute,父元素position:relative
   //有传父亲节点、若无则默认body为父节点

   ((parent, children, mouseType) => {

    if (!children) return;
    let childrenDiv = document.querySelector(children);
    childrenDiv.style.position = 'absolute';
    let parentDiv = parent

     ? document.querySelector(parent)
     : document.querySelector('body');

    let isDown = false;

    let x,
     y,
     l,
     t = 0;

    childrenDiv.onmousedown = function (e) {

     x = e.clientX;
     y = e.clientY;

     // 获取左部和底部的偏移量

     l = childrenDiv.offsetLeft;
     t = childrenDiv.offsetTop;
     isDown = true;
     childrenDiv.style.cursor = mouseType || 'move';

    };

    // 鼠标移动

    window.onmousemove = function (e) {

     if (!isDown) {

      return;

     }

     //获取移动后的x和y坐标

     let nx = e.clientX;
     let ny = e.clientY;

     //获取父元素的宽高

     let parentWidth = parentDiv.clientWidth;
     let parentHeight = parentDiv.clientHeight;

     //获取子元素的宽高

     let childrenWidth = childrenDiv.clientWidth;
     let childrenHight = childrenDiv.clientHeight;

     // 计算移动后的左偏移量和顶部偏移量

     let nLeft = nx - (x - l);
     let nTop = ny - (y - t);
     let nRight = nLeft + childrenWidth;
     let nBottom = nTop + childrenHight;
     nLeft = nLeft <= 0 ? 0 : nLeft; //判断左边距离是否越界
     nTop = nTop <= 0 ? 0 : nTop; //判断上边距离是否越界
     //判断右边距离大于父元素宽度

     if (nRight >= parentWidth) {

      nLeft = parentWidth - childrenHight;

     }

     // 判断下边界是否越界

     if (nBottom >= parentHeight) nTop = parentHeight - childrenHight;
     childrenDiv.style.left = nLeft + 'px';
     childrenDiv.style.top = nTop + 'px';

    };

    // 鼠标抬起事件
    document.onmouseup = function (e) {
     //鼠标抬起
     isDown = false;

     childrenDiv.style.cursor = 'default';

    };

   })('#parent', '#drag', 'move');

  </script>
 </body>
</html>

js实现限定区域范围拖拉拽效果

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

Javascript 相关文章推荐
Javascript 两个窗体之间传值实现代码
Sep 25 Javascript
JQuery扩展插件Validate 3通过参数设置错误信息
Sep 05 Javascript
js固定DIV高度,超出部分自动添加滚动条的简单方法
Jul 10 Javascript
手机平板等移动端适配跳转URL的js代码
Jan 25 Javascript
js代码实现随机颜色的小方块
Jul 30 Javascript
JavaScript观察者模式(经典)
Dec 09 Javascript
深入探究AngularJS框架中Scope对象的超级教程
Jan 04 Javascript
基于Node.js的JavaScript项目构建工具gulp的使用教程
May 20 Javascript
利用angular.copy取消变量的双向绑定与解析
Nov 25 Javascript
canvas 实现中国象棋
Feb 17 Javascript
新版小程序登录授权的方法
Dec 12 Javascript
vue项目中使用scss的方法步骤
May 16 Javascript
vue自定义插件封装,实现简易的elementUi的Message和MessageBox的示例
Nov 20 #Vue.js
详解vue 组件注册
Nov 20 #Vue.js
JavaScript 防抖和节流遇见的奇怪问题及解决
Nov 20 #Javascript
JavaScript 异步时序问题
Nov 20 #Javascript
JavaScript实现音乐导航效果
Nov 19 #Javascript
JavaScript实现无限轮播效果
Nov 19 #Javascript
微信小程序实现分页加载效果
Nov 19 #Javascript
You might like
php基于dom实现的图书xml格式数据示例
2017/02/03 PHP
Laravel 5.4向IoC容器中添加自定义类的方法示例
2017/08/15 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
ExtJS GridPanel 根据条件改变字体颜色
2010/03/08 Javascript
自己动手制作jquery插件之自动添加删除行功能介绍
2011/10/14 Javascript
用js实现trim()的解决办法
2013/04/16 Javascript
通过Javascript读取本地Excel文件内容的代码示例
2014/04/08 Javascript
js实现简洁的滑动门菜单(选项卡)效果代码
2015/09/04 Javascript
推荐VSCode 上特别好用的 Vue 插件之vetur
2017/09/14 Javascript
详解node Async/Await 更好的异步编程解决方案
2018/05/10 Javascript
基于mpvue的小程序项目搭建的步骤
2018/05/22 Javascript
js canvas实现红包照片效果
2018/08/21 Javascript
element ui table 增加筛选的方法示例
2018/11/02 Javascript
javascript中的this作用域详解
2019/07/15 Javascript
js实现点击图片在屏幕中间弹出放大效果
2019/09/11 Javascript
VueQuillEditor富文本上传图片(非base64)
2020/06/03 Javascript
Vue父子之间值传递的实例教程
2020/07/02 Javascript
[48:35]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 TNC vs Optic
2018/04/03 DOTA
在Python中操作字典之update()方法的使用
2015/05/22 Python
Django中的CACHE_BACKEND参数和站点级Cache设置
2015/07/23 Python
python安装mysql-python简明笔记(ubuntu环境)
2016/06/25 Python
python爬取拉勾网职位数据的方法
2018/01/24 Python
Django重置migrations文件的方法步骤
2019/05/01 Python
关于tf.nn.dynamic_rnn返回值详解
2020/01/20 Python
Python高并发解决方案实现过程详解
2020/07/31 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
2020/09/09 Python
详解python 条件语句和while循环的实例代码
2020/12/28 Python
BCBG官网:BCBGMAXAZRIA
2017/12/29 全球购物
简短证婚人证婚词
2014/01/09 职场文书
教师节演讲稿
2014/05/06 职场文书
诚信承诺书模板
2014/05/26 职场文书
五五普法心得体会
2014/09/04 职场文书
一份文言文检讨书
2014/09/13 职场文书
家庭财产分割协议书范本
2014/11/24 职场文书
2015年度企业工作总结
2015/05/21 职场文书
Python基础之字符串格式化详解
2021/04/21 Python