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 相关文章推荐
百度留言本js 大家可以参考下
Oct 13 Javascript
firefox和IE系列的相关区别整理 以备后用
Dec 28 Javascript
用JQuery实现表格隔行变色和突出显示当前行的代码
Feb 10 Javascript
js中for in的用法示例解析
Dec 25 Javascript
AngularJS中的指令全面解析(必看)
May 20 Javascript
JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题
Aug 03 Javascript
JS中微信小程序自定义底部弹出框
Dec 22 Javascript
JS+canvas动态绘制饼图的方法示例
Sep 12 Javascript
angular2系列之路由转场动画的示例代码
Nov 09 Javascript
vue2.0安装style/css loader的方法
Mar 14 Javascript
JS实现页面数据懒加载
Feb 13 Javascript
用VsCode编辑TypeScript的实现方法
May 07 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提示Warning:phpinfo() has been disabled函数禁用的解决方法
2014/12/17 PHP
PHP实现的登录页面信息提示功能示例
2017/07/24 PHP
屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码
2007/04/01 Javascript
Locate a File Using a File Open Dialog Box
2007/06/18 Javascript
JavaScript根据数据生成百分比图和柱状图的实例代码
2013/07/14 Javascript
js判断游览器类型及版本号的代码
2014/05/11 Javascript
AngularJS用户选择器指令实例分析
2016/11/04 Javascript
详解Vue 事件驱动和依赖追踪
2017/04/22 Javascript
浅谈Koa服务限流方法实践
2017/10/23 Javascript
记录一篇关于redux-saga的基本使用过程
2018/08/18 Javascript
详解React中合并单元格的正确写法
2019/01/08 Javascript
JavaScript创建对象的四种常用模式实例分析
2019/01/11 Javascript
jQuery+ajax实现批量删除功能完整示例
2019/06/06 jQuery
vue 更改连接后台的api示例
2019/11/11 Javascript
动态创建类实例代码
2009/10/07 Python
简单介绍Python中的decode()方法的使用
2015/05/18 Python
Python3写入文件常用方法实例分析
2015/05/22 Python
Python中支持向量机SVM的使用方法详解
2017/12/26 Python
Python二进制串转换为通用字符串的方法
2018/07/23 Python
Linux下python3.7.0安装教程
2018/07/30 Python
pandas dataframe添加表格框线输出的方法
2019/02/08 Python
python中关于数据类型的学习笔记
2020/07/19 Python
Boden澳大利亚官网:英国在线服装公司
2018/08/05 全球购物
澳大利亚排名第一的狂热牛仔品牌:ONETEASPOON
2018/11/20 全球购物
八年级生物教学反思
2014/01/22 职场文书
产假请假条
2014/04/10 职场文书
大学同学会活动方案
2014/08/20 职场文书
青年文明号汇报材料
2014/12/23 职场文书
七年级上册语文教学计划
2015/01/22 职场文书
八达岭长城导游词
2015/01/30 职场文书
2015年工会工作总结范文
2015/07/23 职场文书
高考满分作文赏析(2篇)
2019/08/12 职场文书
Nginx域名转发使用场景代码实例
2021/03/31 Servers
HTML+css盒子模型案例(圆,半圆等)“border-radius” 简单易上手
2021/05/10 HTML / CSS
PyTorch中的torch.cat简单介绍
2022/03/17 Python
数据分析数据库ClickHouse在大数据领域应用实践
2022/04/03 MySQL