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 相关文章推荐
jquery之超简单的div显示和隐藏特效demo(分享)
Jul 09 Javascript
jquery全选checkBox功能实现代码(取消全选功能)
Dec 10 Javascript
js自定义select下拉框美化特效
May 12 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
Nov 16 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
Dec 23 Javascript
EasyUI Tree树组件无限循环的解决方法
Sep 27 Javascript
JS实现登录页密码的显示和隐藏功能
Dec 06 Javascript
微信小程序switch组件使用详解
Jan 31 Javascript
vue实现一拉到底的滑动验证
Jul 25 Javascript
浅谈Node新版本13.2.0正式支持ES Modules特性
Nov 25 Javascript
vue element-ul实现展开和收起功能的实例代码
Nov 25 Vue.js
JS轻量级函数式编程实现XDM三
Jun 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
dedecms 制作模板中使用的全局标记图文教程
2007/03/11 PHP
Discuz 6.0+ 批量注册用户名
2009/09/13 PHP
php日历制作代码分享
2014/01/20 PHP
检测codeigniter脚本消耗内存情况的方法
2015/03/21 PHP
学习php设计模式 php实现桥梁模式(bridge)
2015/12/07 PHP
使用php自动备份数据库表的实现方法
2017/07/28 PHP
基于php数组中的索引数组和关联数组详解
2018/03/12 PHP
phpQuery采集网页实现代码实例
2020/04/02 PHP
JQuery 获得绝对,相对位置的坐标方法
2010/02/09 Javascript
JQuery下的Live方法和$.browser方法使用代码
2010/06/02 Javascript
jQuery动态创建html元素的常用方法汇总
2014/09/05 Javascript
jQuery选择器全集详解
2014/11/24 Javascript
jQuery中:visible选择器用法实例
2014/12/30 Javascript
Node.js 文件夹目录结构创建实例代码
2016/07/08 Javascript
JS实现屏蔽网页右键复制及ctrl+c复制的方法【2种方法】
2016/09/04 Javascript
ES6/JavaScript使用技巧分享
2017/12/14 Javascript
vue使用 better-scroll的参数和方法详解
2018/01/25 Javascript
Vue-cli3项目配置Vue.config.js实战记录
2018/07/29 Javascript
jquery分页插件pagination使用教程
2018/10/23 jQuery
vue-router beforeEach跳转路由验证用户登录状态
2018/12/26 Javascript
简单了解JavaScript异步
2019/05/23 Javascript
如何在vue 中引入使用jquery
2020/11/10 jQuery
python笔记(2)
2012/10/24 Python
Python日期的加减等操作的示例
2017/08/15 Python
python实现n个数中选出m个数的方法
2018/11/13 Python
pytorch对可变长度序列的处理方法详解
2018/12/08 Python
对pytorch网络层结构的数组化详解
2018/12/08 Python
Form表单及django的form表单的补充
2019/07/25 Python
Python实现word2Vec model过程解析
2019/12/16 Python
基于CSS3实现的漂亮Menu菜单效果代码
2015/09/10 HTML / CSS
Ellos瑞典官网:北欧地区时尚、美容和住宅领域领先的电子商务网站
2019/11/21 全球购物
2014年内勤工作总结
2014/11/24 职场文书
幼儿园开学家长寄语(2015秋季)
2015/05/27 职场文书
一个都不能少观后感
2015/06/04 职场文书
三好学生竞选稿
2015/11/21 职场文书
导游词之山西关帝庙
2019/11/01 职场文书