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模拟的Ping效果代码 (Web Ping)
Mar 13 Javascript
js实现日历可获得指定日期周数及星期几示例分享(js获取星期几)
Mar 14 Javascript
jquery Validation表单验证使用详解
Sep 12 Javascript
Vue.js开发环境搭建
Nov 10 Javascript
Javascript中关于Array.filter()的妙用详解
Dec 04 Javascript
详解JavaScript 中getElementsByName在IE中的注意事项
Feb 21 Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
Feb 17 Javascript
JS中的const命令你真懂它吗
Mar 08 Javascript
在vue中使用回调函数,this调用无效的解决
Aug 11 Javascript
vue实现顶部菜单栏
Nov 08 Javascript
Vue包大小优化的实现(从1.72M到94K)
Feb 18 Vue.js
JavaScript+HTML实现学生信息管理系统
Apr 20 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
全国中波电台频率表
2020/03/11 无线电
一些PHP写的小东西
2006/12/06 PHP
php实现mysql封装类示例
2014/05/07 PHP
php中动态调用函数的方法
2015/03/16 PHP
php内嵌函数用法实例
2015/03/20 PHP
PHP实现的简单异常处理类示例
2017/05/04 PHP
js写的方法实现上传图片之后查看大图
2014/03/05 Javascript
jQuery中DOM操作实例分析
2015/01/23 Javascript
js验证上传图片的方法
2015/05/12 Javascript
Bootstrap Table的使用总结
2016/10/08 Javascript
Vue中建立全局引用或者全局命令的方法
2017/08/21 Javascript
细说webpack源码之compile流程-入口函数run
2017/12/26 Javascript
angularjs性能优化的方法
2018/09/05 Javascript
微信小程序从注册账号到上架(图文详解)
2019/07/17 Javascript
微信小程序 WXML节点信息查询详解
2019/07/29 Javascript
基于Node的Axure文件在线预览的实现代码
2019/08/28 Javascript
Python中的连接符(+、+=)示例详解
2017/01/13 Python
Python简单实现socket信息发送与监听功能示例
2018/01/03 Python
对pandas进行数据预处理的实例讲解
2018/04/20 Python
如何利用python查找电脑文件
2018/04/27 Python
一些Centos Python 生产环境的部署命令(推荐)
2018/05/07 Python
Pycharm设置界面全黑的方法
2018/05/23 Python
基于python指定包的安装路径方法
2018/10/27 Python
Django中使用Json返回数据的实现方法
2020/06/03 Python
HTML5 Web 存储详解
2016/09/16 HTML / CSS
新加坡时尚网上购物:Zalora新加坡
2016/07/26 全球购物
计算机应用与科学个人的自我评价
2013/11/15 职场文书
《歌唱二小放牛郎》教学反思
2014/04/19 职场文书
端午节演讲稿
2014/05/23 职场文书
公司离职证明范本(5篇)
2014/09/17 职场文书
环境工程专业毕业生求职信
2014/09/30 职场文书
杭白菊导游词
2015/02/10 职场文书
2015年财务工作总结范文
2015/03/31 职场文书
小学生读书笔记
2015/07/01 职场文书
教育教学读书笔记
2015/07/02 职场文书
MySQL令人大跌眼镜的隐式转换
2021/08/23 MySQL