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 相关文章推荐
JScript中使用ADODB.Stream判断文件编码的代码
Jun 09 Javascript
js文本框输入点回车触发确定兼容IE、FF等
Nov 19 Javascript
jquery each的几种常用的使用方法示例
Jan 21 Javascript
LABjs、RequireJS、SeaJS的区别
Mar 04 Javascript
js触发onchange事件的方法说明
Mar 08 Javascript
js实现最短的XML格式化工具实例
Mar 12 Javascript
DIV随滚动条滚动而滚动的实现代码【推荐】
Apr 12 Javascript
js 动态生成json对象、时时更新json对象的方法
Dec 02 Javascript
JS实现针对给定时间的倒计时功能示例
Apr 11 Javascript
详解VueJS 数据驱动和依赖追踪分析
Jul 26 Javascript
js中this对象用法分析
Jan 05 Javascript
VUE搭建手机商城心得和遇到的坑
Feb 21 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使用Alexa API获取网站的Alexa排名例子
2014/06/12 PHP
Yii使用Captcha验证码的方法
2015/12/28 PHP
laravel ORM 只开启created_at的几种方法总结
2018/01/29 PHP
thinkPHP5框架中widget的功能与用法详解
2018/06/11 PHP
用javascript实现读取txt文档的脚本
2007/07/20 Javascript
为javascript添加String.Format方法
2020/08/11 Javascript
很好用的js日历算法详细代码
2013/03/07 Javascript
jQuery中读取json文件示例代码
2013/05/10 Javascript
JS常用字符串处理方法应用总结
2014/05/22 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
详解JavaScript中的异常处理方法
2015/06/16 Javascript
写给小白的JavaScript引擎指南
2015/12/04 Javascript
基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作
2016/05/12 Javascript
javascript基本语法
2016/05/31 Javascript
Javascript获取随机数的实现方法
2016/06/22 Javascript
jQuery滚动条美化插件nicescroll简单用法示例
2018/04/18 jQuery
微信小程序实现两边小中间大的轮播效果的示例代码
2018/12/07 Javascript
js中innerText/textContent和innerHTML与target和currentTarget的区别
2019/01/21 Javascript
怎样在vue项目下添加ESLint的方法
2019/05/16 Javascript
js回文数的4种判断方法示例
2019/06/04 Javascript
weui中的picker使用js进行动态绑定数据问题
2019/11/06 Javascript
js简单粗暴的发布订阅示例代码
2021/01/23 Javascript
Python实现从url中提取域名的几种方法
2014/09/26 Python
使用python实现tcp自动重连
2017/07/02 Python
Python爬虫实现全国失信被执行人名单查询功能示例
2018/05/03 Python
Python爬取个人微信朋友信息操作示例
2018/08/03 Python
Python使用sort和class实现的多级排序功能示例
2018/08/15 Python
Python XML转Json之XML2Dict的使用方法
2019/01/15 Python
numpy数组广播的机制
2019/07/12 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
2020/02/17 Python
详解如何在PyCharm控制台中输出彩色文字和背景
2020/08/17 Python
澳大利亚首个在线预订旅游网站:Wotif
2017/07/19 全球购物
经典搞笑版检讨书
2015/02/19 职场文书
费城故事观后感
2015/06/10 职场文书
60条职场经典语录,总有一条能触动你的心
2019/08/21 职场文书
雄兵连:第三季先行图公开,天使恶魔联合,银河之力的新力量
2021/06/11 国漫