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获取后台Cookies值的小例子
Mar 04 Javascript
JavaScript中变量声明有var和没var的区别示例介绍
Sep 15 Javascript
JavaScript中字面量与函数的基本使用知识
Oct 20 Javascript
jQuery ajax时间差导致的变量赋值问题分析
Jan 22 Javascript
详细分析Javascript中创建对象的四种方式
Aug 17 Javascript
详解AngularJS如何实现跨域请求
Aug 22 Javascript
Angularjs分页查询的实现
Feb 24 Javascript
js实现鼠标拖拽多选功能示例
Aug 01 Javascript
vue配置多页面的实现方法
May 22 Javascript
jQuery的Ajax接收java返回数据方法
Aug 11 jQuery
JS拖拽排序插件Sortable.js用法实例分析
Feb 20 Javascript
Vue-cli3简单使用(图文步骤)
Apr 30 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 swfupload图片上传的实例代码
2013/09/30 PHP
PHP数组相关函数汇总
2015/03/24 PHP
PHP文件上传之多文件上传的实现思路
2016/01/27 PHP
php 可变函数使用小结
2018/06/12 PHP
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
2010/12/06 Javascript
javascript小组件 原生table排序表格脚本(兼容ie firefox opera chrome)
2012/07/25 Javascript
js弹出窗口之弹出层的小例子
2013/06/17 Javascript
JavaScript中setAttribute用法介绍
2013/07/20 Javascript
Angular.js与Bootstrap相结合实现手风琴菜单代码
2016/04/13 Javascript
JavaScript_ECMA5数组新特性详解
2016/06/12 Javascript
javascript jquery对form元素的常见操作详解
2016/06/12 Javascript
详解jquery插件jquery.viewport.js学习使用方法
2017/09/08 jQuery
element 结合vue 在表单验证时有值却提示错误的解决办法
2018/01/22 Javascript
解决JQuery的ajax函数执行失败alert函数弹框一闪而过问题
2019/04/10 jQuery
Vue.js递归组件实现组织架构树和选人功能
2019/07/04 Javascript
JS实现的雪花飘落特效示例
2019/12/03 Javascript
js+canvas实现五子棋小游戏
2020/08/02 Javascript
vue使用swiper实现左右滑动切换图片
2020/10/16 Javascript
[02:40]DOTA2英雄基础教程 先知
2013/11/29 DOTA
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
常见的在Python中实现单例模式的三种方法
2015/04/08 Python
Python 中的 else详解
2016/04/23 Python
使用pandas把某一列的字符值转换为数字的实例
2019/01/29 Python
matplotlib实现区域颜色填充
2019/03/18 Python
通过Python编写一个简单登录功能过程解析
2019/09/04 Python
python爬虫之遍历单个域名
2019/11/20 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
2020/01/10 Python
Ubuntu16.04安装python3.6.5步骤详解
2020/01/10 Python
通过cmd进入python的步骤
2020/06/16 Python
C#面试题问题集
2016/04/02 面试题
《大禹治水》教学反思
2014/04/27 职场文书
预备党员转正思想汇报
2014/09/26 职场文书
转正申请报告格式
2015/05/15 职场文书
企业反腐倡廉心得体会
2015/08/15 职场文书
2016秋季田径运动会广播稿
2015/12/21 职场文书
实习报告怎么写
2019/06/20 职场文书