JavaScript实现div的鼠标拖拽效果

 更新时间:2021年11月07日 12:26:42   作者:雪旭  
这篇文章主要为大家详细介绍了JavaScript实现div的鼠标拖拽效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了JavaScript实现div鼠标拖拽效果的具体代码,供大家参考,具体内容如下

实现原理鼠标按下时根据onmousemove事件来动态获取鼠标坐标位置以此来更新div的位置,实现的前提时div要有一个定位效果,不然的话是移动不了它的。

HTML

<div class="box"></div>

CSS样式

.box {
    position: absolute;
    width: 200px;
    height: 200px;
    background: red;    
    }

首先先分析一下需求,这个需求就是点击时鼠标按下你才能移动并改变div在页面中的位置。鼠标松开你就不能在移动了。所以这里鼠标的状态有三个,分别是点击时鼠标按下(mousedown事件)、移动时(mousemove事件)、松开时(mouseup事件)

所以js部分有三个事件。

JS部分

var box = document.getElementsByClassName("box")[0];//获取元素
var x, y;//存储div的坐标
var isDrop = false;//移动状态的判断鼠标按下才能移动

鼠标按下时

box.onmousedown = function(e) {
                var e = e || window.event;//要用event这个对象来获取鼠标的位置
                x = e.clientX - box.offsetLeft;
                y = e.clientY - box.offsetTop;
                isDrop = true;//设为true表示可以移动
            }

e.clientX鼠标x轴的位置,e.clientY鼠标Y轴的位置,box.offsetLeft获取div距离左边的距离,box.offsetTop获取div距离上边的距离。

如下图所示 e.clientX - box.offsetLeft我们可以得到坐标点x与 box.offsetLeft之间的偏差值,我们要再用坐标点x减去这个偏差值才是div真实相对于左边移动的距离,e.clientY - box.offsetTop同理得到的是距离上边偏移的距离。

鼠标移动时

为了防止鼠标移动过快事件无法正确处理所以事件绑定到document上

document.onmousemove = function(e) {
         //是否为可移动状态
         if(isDrop) {
                    var e = e || window.event;
              
                      var moveX = e.clientX - x;//得到距离左边移动距离
                      var moveY = e.clientY - y;//得到距离上边移动距离
                  
                      box.style.left = moveX + "px";
                      box.style.top = moveY + "px";
          }else{
                       return ;
          }

            }

e.clientX - x 鼠标点坐标减去偏差得到div距离左边的距离,e.clientY - y 鼠标点坐标减去偏差得到div距离上边的距离。给div的left,top重新赋值

鼠标松开时

为了放置鼠标移动过快时间无法正确处理所以事件绑定到document上

document.onmouseup = function() {
                isDrop = false;//设置为false不可移动
            }

现在div已经可以拖拽了,目前还需要添加一个范围限定,不然div会拖到页面外面去,这样不行的所以得添加范围限定。div最大移动宽度为页面宽减去div的宽,最小为零,最大高为页面高减去div的高,最小为零。所以范围限定要这样写

document.onmousemove = function(e) {
      var e = e || window.event;
                if(is) {
                    var moveX = e.clientX - x;
                    var moveY = e.clientY - y;
                    var maxX = document.documentElement.clientWidth - box.offsetWidth;//X轴可移动最大距离
                    var maxY = document.documentElement.clientHeight - box.offsetHeight;//Y轴可移动最大距离
                    

                    //范围限定  最小时取最大  最大时取最小
                    if(moveX < 0) {
                        moveX=0
                     }else if(moveX>maxX){
                        moveX=maxX;
                    }
                    
                    if(moveY < 0) {
                        moveY=0;
                    }else if(moveY>maxY){
                        moveY=maxY; 
                    }

                    box.style.left = moveX + "px";
                    box.style.top = moveY + "px";

                } else {
                    return;
                }

            }

这样效果就完美实现了,但是范围限定我们还可以这样做。

可以这样表示范围限定

//范围限定  最小取最大  最大取最小
     if(moveX < 0) {
           moveX= Math.max(0,moveX)//0
     }else if(moveX>maxX){
           moveX=Math.min(moveX,maxX);//maxX
     }
                    
      if(moveY < 0) {
          moveY= Math.max(0,moveY) //0
      }else if(moveY>maxY){
           moveY=Math.min(moveY,maxY); //maxY
      }

所以我们可以这样写

moveX=Math.min(maxX, Math.max(0,moveX));
moveY=Math.min(maxY, Math.max(0,moveY));

然后完整代码

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            .box {
                position: absolute;
                width: 200px;
                height: 200px;
                background: red;
            }
        </style>
    </head>

    <body>
        <div class="box"></div>
        <script>
            var box = document.getElementsByClassName("box")[0]; //获取元素
            var x, y; //鼠标相对与div左边,上边的偏移
            var isDrop = false; //移动状态的判断鼠标按下才能移动
            box.onmousedown = function(e) {
                var e = e || window.event; //要用event这个对象来获取鼠标的位置
                x = e.clientX - box.offsetLeft;
                y = e.clientY - box.offsetTop;
                isDrop = true; //设为true表示可以移动
            }

            document.onmousemove = function(e) {
                //是否为可移动状态                                   
                if(isDrop) {    
                    var e = e || window.event;                      
                    var moveX = e.clientX - x; //得到距离左边移动距离                      
                    var moveY = e.clientY - y; //得到距离上边移动距离
                    //可移动最大距离
                    var maxX = document.documentElement.clientWidth - box.offsetWidth;
                    var maxY = document.documentElement.clientHeight - box.offsetHeight;

                    //范围限定  当移动的距离最小时取最大  移动的距离最大时取最小
                    //范围限定方法一
                    /*if(moveX < 0) {
                        moveX = 0
                    } else if(moveX > maxX) {
                        moveX = maxX;
                    }

                    if(moveY < 0) {
                        moveY = 0;
                    } else if(moveY > maxY) {
                        moveY = maxY;
                    } */
                    //范围限定方法二 
                    moveX=Math.min(maxX, Math.max(0,moveX));
                    
                    moveY=Math.min(maxY, Math.max(0,moveY));
                    box.style.left = moveX + "px";  
                    box.style.top = moveY + "px";          
                } else {
                    return;          
                }

            }

            document.onmouseup = function() {
                isDrop = false; //设置为false不可移动
            }
        </script>
    </body>

</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • JavaScript中filter的用法实例分析

    JavaScript中filter的用法实例分析

    这篇文章主要介绍了JavaScript中filter的用法,结合实例形式分析了filter的功能、使用方法及相关操作注意事项,需要的朋友可以参考下
    2019-02-02
  • JS打开图片另存为对话框实现代码

    JS打开图片另存为对话框实现代码

    使用JS打开图片另存为对话框一直都是网页应用中不可缺少的一部分,本人有些好奇,于是搜集整理了一些实现代码,不知道符不符合大众的口味,在此班门弄斧了,需要的朋友可以了解下
    2012-12-12
  • 原生js实现焦点轮播图效果

    原生js实现焦点轮播图效果

    本文主要分享了原生js实现焦点轮播图效果的示例代码,并解析了实例中的注意点。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • js实现轮播图制作方法

    js实现轮播图制作方法

    这篇文章主要为大家详细介绍了js实现轮播图的制作方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • 原生Js 实现的简单无缝滚动轮播图的示例代码

    原生Js 实现的简单无缝滚动轮播图的示例代码

    这篇文章主要介绍了原生Js 实现的简单无缝滚动轮播图的示例代码,帮助大家更好的理解喝学习使用js,感兴趣的朋友可以了解下
    2021-05-05
  • 前端无感知刷新token以及超时自动退出实现方案

    前端无感知刷新token以及超时自动退出实现方案

    前端需要做到无感刷新token,即刷token时要做到用户无感知,避免频繁登录,下面这篇文章主要给大家介绍了关于前端无感知刷新token以及超时自动退出的实现方案,需要的朋友可以参考下
    2024-01-01
  • JavaScript必知必会(二) null 和undefined

    JavaScript必知必会(二) null 和undefined

    这篇文章主要介绍了JavaScript必知必会(二) null 和undefined的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • Markdown+Bootstrap图片自适应属性详解

    Markdown+Bootstrap图片自适应属性详解

    这篇文章主要为大家详细介绍了Markdown+Bootstrap图片自适应属性,感兴趣的朋友可以参考一下
    2016-05-05
  • postMessage及webSocket跨域方案详解

    postMessage及webSocket跨域方案详解

    这篇文章主要为大家介绍了postMessage及webSocket跨域方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • JavaScript设计模式策略模式案例分享

    JavaScript设计模式策略模式案例分享

    这篇文章主要介绍了JavaScript设计模式策略模式案例分享,策略设计模式就是指一个问题匹配多个解决方法,不一定要用到哪一个,而且有可能随时增加多个方案
    2022-06-06

最新评论