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之对系统的toFixed()方法的修正
May 08 Javascript
快速查找数组中的某个元素并返回下标示例
Sep 03 Javascript
浅析JavaScript中的隐式类型转换
Dec 05 Javascript
Javascript实现简单的富文本编辑器附演示
Jun 16 Javascript
浅谈jQuery添加的HTML,JS失效的问题
Oct 05 Javascript
js 中获取制定的cook信息实现方法
Nov 19 Javascript
js 去掉字符串前后空格实现代码集合
Mar 25 Javascript
vuejs使用FormData实现ajax上传图片文件
Aug 08 Javascript
Vue Element 分组+多选+可搜索Select选择器实现示例
Jul 23 Javascript
JQuery获取可视区尺寸和文档尺寸及制作悬浮菜单示例
May 14 jQuery
Node Express用法详解【安装、使用、路由、中间件、模板引擎等】
May 13 Javascript
JS实现前端路由功能示例【原生路由】
May 29 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
在普通HTTP上安全地传输密码
2007/07/21 PHP
php smarty函数扩展
2010/03/15 PHP
深入理解PHP原理之错误抑制与内嵌HTML分析
2011/05/02 PHP
php头像上传预览实例代码
2017/05/02 PHP
JQuery选择器特辑 详细小结
2012/05/14 Javascript
js实现右下角可关闭最小化div(可用于展示推荐内容)
2013/06/24 Javascript
为指定的元素添加遮罩层的示例代码
2014/01/15 Javascript
理解javascript模块化
2016/03/28 Javascript
关于cookie的初识和运用(js和jq)
2016/04/07 Javascript
Javascript的无new构建实例详解
2016/05/15 Javascript
正则表达式(语法篇推荐)
2016/06/24 Javascript
Node.js readline模块与util模块的使用
2018/03/01 Javascript
vue监听input标签的value值方法
2018/08/27 Javascript
vue 弹框产生的滚动穿透问题的解决
2018/09/21 Javascript
JavaScript前端页面搜索功能案例【基于jQuery】
2019/07/10 jQuery
JavaScript enum枚举类型定义及使用方法
2020/05/15 Javascript
在Vue中使用Select选择器拼接label的操作
2020/10/22 Javascript
element中Steps步骤条和Tabs标签页关联的解决
2020/12/08 Javascript
Python+matplotlib实现计算两个信号的交叉谱密度实例
2018/01/08 Python
Python 记录日志的灵活性和可配置性介绍
2018/02/27 Python
python3实现点餐系统
2019/01/24 Python
python字典排序的方法
2019/10/12 Python
Python基础之列表常见操作经典实例详解
2020/02/26 Python
Python和Bash结合在一起的方法
2020/11/13 Python
css3个性化字体_动力节点Java学院整理
2017/07/12 HTML / CSS
CSS3 box-sizing属性
2009/04/17 HTML / CSS
Ivory Isle Designs美国/加拿大:婚礼和活动文具公司
2018/08/21 全球购物
综合办公室主任职责
2013/12/16 职场文书
车间统计员岗位职责
2014/01/05 职场文书
幼儿园教师备课制度
2014/01/12 职场文书
保险公司早会主持词
2014/03/22 职场文书
励志演讲稿600字
2014/08/21 职场文书
2014年国庆节活动总结
2014/08/26 职场文书
2014年村计划生育工作总结
2014/11/14 职场文书
vue代码分块和懒加载非必要资源文件
2022/04/11 Vue.js
Vue Mint UI mt-swipe的使用方式
2022/06/05 Vue.js