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表单验证代码
Aug 02 Javascript
JS 实现完美include载入实现代码
Aug 05 Javascript
Chrome扩展页面动态绑定JS事件提示错误
Feb 11 Javascript
利用jquery操作Radio方法小结
Oct 20 Javascript
javascript实现状态栏文字首尾相接循环滚动的方法
Jul 22 Javascript
javascript性能优化之DOM交互操作实例分析
Dec 12 Javascript
AngularJS基础 ng-hide 指令用法及示例代码
Aug 01 Javascript
jQuery中JSONP的两种实现方式详解
Sep 26 Javascript
Vue 父子组件的数据传递、修改和更新方法
Mar 01 Javascript
关于echarts在节点显示动态数据及添加提示文本所遇到的问题
Apr 20 Javascript
深入学习JavaScript 高阶函数
Jun 11 Javascript
vue-cli3配置favicon.ico和title的流程
Oct 27 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写的获取各搜索蜘蛛爬行记录代码
2012/08/21 PHP
ThinkPHP添加更新标签的方法
2014/12/05 PHP
PHP实现的简单路由和类自动加载功能
2018/03/13 PHP
非常不错的功能强大代码简单的管理菜单美化版
2008/07/09 Javascript
jQuery插件 tabBox实现代码
2010/02/09 Javascript
js 获取Listbox选择的值的代码
2010/04/15 Javascript
JQuery插件Style定制化方法的分析与比较
2012/05/03 Javascript
js实现一个省市区三级联动选择框代码分享
2013/03/06 Javascript
js实现图片轮换效果代码
2013/04/16 Javascript
禁用键盘上的(全局)指定键兼容iE、Chrome、火狐
2013/05/14 Javascript
Angular 根据 service 的状态更新 directive
2016/04/03 Javascript
超全面的JavaScript开发规范(推荐)
2017/01/21 Javascript
浅谈Angular文字折叠展开组件的原理分析
2017/11/24 Javascript
如何使用electron-builder及electron-updater给项目配置自动更新
2018/12/24 Javascript
微信小程序间使用navigator跳转传值问题实例分析
2020/03/27 Javascript
[57:09]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第一场 1月26日
2021/03/11 DOTA
Python多线程结合队列下载百度音乐的方法
2015/07/27 Python
Python设计实现的计算器功能完整实例
2017/08/18 Python
浅谈Python爬虫基本套路
2019/03/25 Python
Django框架基础模板标签与filter使用方法详解
2019/07/23 Python
python基于json文件实现的gearman任务自动重启代码实例
2019/08/13 Python
python自动循环定时开关机(非重启)测试
2019/08/26 Python
浅谈django url请求与数据库连接池的共享问题
2019/08/29 Python
python 列表、字典和集合的添加和删除操作
2019/12/16 Python
基于HTML5 Canvas 实现商场监控实例详解
2017/11/20 HTML / CSS
Smashbox官网:美国知名彩妆品牌
2017/01/05 全球购物
加拿大休闲和工业服装和鞋类零售商:L’Équipeur
2018/01/12 全球购物
国际奢侈品品牌童装购物网站:Designer Childrenswear
2019/05/08 全球购物
网上签名寄语活动留言
2014/01/18 职场文书
优秀的个人求职信范文
2014/05/09 职场文书
代理人委托书
2014/09/16 职场文书
2015年信息中心工作总结
2015/05/25 职场文书
爱国主义电影观后感
2015/06/18 职场文书
《春酒》教学反思
2016/02/22 职场文书
健身房被搭讪?用python写了个小米计时器助人为乐
2021/06/08 Python
SQLServer RANK() 排名函数的使用
2022/03/23 SQL Server