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 相关文章推荐
让alert不出现弹窗的两种方法
May 18 Javascript
JAVA四种基本排序方法实例总结
Jul 24 Javascript
基于jquery实现日历签到功能
Sep 11 Javascript
Jquery揭秘系列:ajax原生js实现详解(推荐)
Jun 08 Javascript
几句话带你理解JS中的this、闭包、原型链
Sep 26 Javascript
javascript 定时器工作原理分析
Dec 03 Javascript
js 文字超出长度用省略号代替,鼠标悬停并以悬浮框显示实例
Dec 06 Javascript
Bootstrap CSS组件之输入框组
Dec 17 Javascript
JS实现的简单标签点击切换功能示例
Sep 21 Javascript
JavaScript对象的特性与实践应用深入详解
Dec 30 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
Apr 09 Javascript
写给新手同学的vuex快速上手指北小结
Apr 14 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 MySQL与分页效率
2008/06/04 PHP
PHP调用.NET的WebService 简单实例
2015/03/27 PHP
PHP数组去重比较快的实现方式
2016/01/19 PHP
Javascript Object.extend
2010/05/18 Javascript
根据当前时间在jsp页面上显示上午或下午
2014/08/18 Javascript
Javascript中拼接大量字符串的方法
2015/02/05 Javascript
jquery中EasyUI使用技巧小结
2015/02/10 Javascript
深入理解JavaScript系列(46):代码复用模式(推荐篇)详解
2015/03/04 Javascript
用JS实现轮播图效果(二)
2016/06/26 Javascript
jQuery实现根据滚动条位置加载相应内容功能
2016/07/18 Javascript
JavaScript数据操作_浅谈原始值和引用值的操作本质
2016/08/23 Javascript
微信小程序 Audio API详解及实例代码
2016/09/30 Javascript
Vue组件之全局组件与局部组件的使用详解
2017/10/09 Javascript
微信小程使用swiper组件实现图片轮播切换显示功能【附源码下载】
2017/12/12 Javascript
Vue2.0 v-for filter列表过滤功能的实现
2018/09/07 Javascript
使用vue-cli脚手架工具搭建vue-webpack项目
2019/01/14 Javascript
详解ES6 CLASS在微信小程序中的应用实例
2020/04/24 Javascript
JS控制下拉列表左右选择实例代码
2020/05/08 Javascript
Python画图实现同一结点多个柱状图的示例
2019/07/07 Python
Python使用random模块生成随机数操作实例详解
2019/09/17 Python
Selenium常见异常解析及解决方案示范
2020/04/10 Python
python基于socket函数实现端口扫描
2020/05/28 Python
Python3.9.1中使用match方法详解
2021/02/08 Python
Html5之自定义属性(data-,dataset)
2019/11/19 HTML / CSS
伦敦著名的运动鞋综合商店:Footpatrol
2019/03/25 全球购物
意大利和国际奢侈品牌购物网站:Suitnegozi.com
2021/01/15 全球购物
手机促销活动方案
2014/02/05 职场文书
教师职称自我鉴定
2014/02/12 职场文书
2014年三八妇女节活动方案
2014/02/28 职场文书
领导班子党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
党支部群众路线整改措施思想汇报
2014/10/10 职场文书
2014保险公司内勤工作总结
2014/12/16 职场文书
2015年高中语文教学总结
2015/08/18 职场文书
掌握一个领域知识,高效学习必备方法
2019/08/08 职场文书
从贫穷到富有,是知识技能和学习力的差别
2019/08/20 职场文书
Nginx中break与last的区别详析
2021/03/31 Servers