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 lazyload延迟加载技术的实现原理分析
Jan 24 Javascript
编写高效jQuery代码的4个原则和5个技巧
Apr 24 Javascript
JS中prototype的用法实例分析
Mar 19 Javascript
Jsonp post 跨域方案
Jul 06 Javascript
connection reset by peer问题总结及解决方案
Oct 21 Javascript
详解使用vue实现tab 切换操作
Jul 03 Javascript
关于Google发布的JavaScript代码规范你要知道哪些
Apr 04 Javascript
详解extract-text-webpack-plugin 的使用及安装
Jun 12 Javascript
解决vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效问题
Aug 24 Javascript
原生js实现淘宝放大镜效果
Oct 28 Javascript
详解如何更好的使用module vuex
Mar 27 Javascript
JavaScript常用8种数组去重代码实例
Sep 09 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 Sql Server连接失败问题及解决办法
2009/08/07 PHP
PHP错误抑制符(@)导致引用传参失败Bug的分析
2011/05/02 PHP
Laravel框架之解决前端显示图片问题
2019/10/24 PHP
Javascript Math ceil()、floor()、round()三个函数的区别
2010/03/09 Javascript
javaScript checkbox 全选/反选及批量删除
2010/04/28 Javascript
JS下拉框内容左右移动效果的具体实现
2013/07/10 Javascript
jquery的each方法使用示例分享
2014/03/25 Javascript
关于JavaScript命名空间的一些心得
2014/06/07 Javascript
FF(火狐)浏览器无法执行window.close()解决方案
2014/11/13 Javascript
JavaScript中创建字典对象(dictionary)实例
2015/03/31 Javascript
使用RequireJS库加载JavaScript模块的实例教程
2016/06/06 Javascript
jquery实现ajax提交表单信息的简单方法(推荐)
2016/08/24 Javascript
HTML5 实现的一个俄罗斯方块实例代码
2016/09/19 Javascript
jQuery实现获取table中鼠标click点击位置行号与列号的方法
2017/10/09 jQuery
微信小程序获取手机号授权用户登录功能
2017/11/09 Javascript
redux-saga 初识和使用
2018/03/10 Javascript
vue中设置、获取、删除cookie的方法
2018/09/21 Javascript
python调用windows api锁定计算机示例
2014/04/17 Python
django框架实现模板中获取request 的各种信息示例
2019/07/01 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
2019/07/11 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
2020/03/31 Python
Python用摘要算法生成token及检验token的示例代码
2020/12/01 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
CSS3 旋转立方体问题详解
2020/01/09 HTML / CSS
使用canvas生成含有微信头像的邀请海报没有微信头像问题
2019/10/29 HTML / CSS
旅游业大学生创业计划书
2014/01/31 职场文书
给领导的检讨书
2014/02/16 职场文书
军训拉歌口号
2014/06/13 职场文书
4s店销售经理岗位职责
2014/07/19 职场文书
裁员通知
2015/04/25 职场文书
2015年感恩父亲节活动策划方案
2015/05/05 职场文书
四风之害观后感
2015/06/09 职场文书
python基于tkinter制作无损音乐下载工具
2021/03/29 Python
matplotlib之pyplot模块实现添加子图subplot的使用
2021/04/25 Python
python 安全地删除列表元素的方法
2022/03/16 Python