实现原理鼠标按下时根据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)//
}else if(moveX>maxX){
moveX=Math.min(moveX,maxX);//maxX
} if(moveY < 0) {
moveY= Math.max(0,moveY) //
}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实现div的鼠标拖拽效果的更多相关文章

  1. js div浮动层拖拽效果代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. JavaScript实现最简单的拖拽效果

    一.一些无关痛痒的唠叨 拖拽还是挺不错的一个页面效果,我个人认为,其生命力在于可以让用户自己做一些操作,所谓自定义.例如: ①浏览器标签顺序的拖拽切换 现在基本上所有的选项卡式的浏览器都有顺序拖拽切换 ...

  3. JavaScript实现网页元素的拖拽效果

    以下的页面中放了两个div,能够通过鼠标拖拽这两个元素到任何位置. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamFja2ZydWVk/font/5a6 ...

  4. js 鼠标拖拽效果实现

    效果: 源码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  5. JavaScript:鼠标拖拽效果

    (之前的那个模板方法模式实在没搞懂...等几天再去研究8) 预览效果: 限制拖动范围在视口内.调整窗口时自动居中... <!DOCTYPE html> <html lang=&quo ...

  6. Jquery实现鼠标拖拽效果

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...

  7. JavaScript实现水平进度条拖拽效果

    <html> <head> <meta charset="UTF-8"> <title>Document</title> ...

  8. JavaScript鼠标拖拽特效及相关问题总结

    #div1{width:200px;height:200px;background:red;position:absolute;} #div2{width:200px;height:200px;bac ...

  9. javascript鼠标拖拽的那些事情

    <html> <head> <title>javascript鼠标拖拽的那些事情</title> <meta http-equiv="C ...

随机推荐

  1. python-day43(正式学习)

    目录 复习 今日内容 字段操作 多表关系 外键 一对一:无级联关系 一对一:有级联关系 一对多 多对多 复习 """ 1.数据库的配置:my.ini [mysqld][m ...

  2. spark教程(四)-SparkContext 和 RDD 算子

    SparkContext SparkContext 是在 spark 库中定义的一个类,作为 spark 库的入口点: 它表示连接到 spark,在进行 spark 操作之前必须先创建一个 Spark ...

  3. C++ 类类型转换函数explicit 关键字

    标准数据之间会进行  隐式类型安全转换. 转换规则: 隐式类型转换的问题: #include <iostream> #include <string> using namesp ...

  4. sql server sum函数

    sum()函数 --SUM 函数返回数值列的总数 语法:SELECT SUM(column_name) FROM table_name

  5. sql--ALTER

    ALTER TABLE 语句 ALTER TABLE 语句用于在已有的表中添加.修改或删除列. SQL ALTER TABLE 语法 如需在表中添加列,请使用下列语法: ALTER TABLE tab ...

  6. Windows2003服务器IIS启用Gzip压缩的设置

    http://jingyan.baidu.com/article/148a192178ec834d71c3b12b.html     步骤 1 2 3 本文介绍的HTTP压缩方式,采用的是Window ...

  7. VS 2005 \ 2008 "当前不会命中断点。源代码与原始版本不同"解决方法

    全选CPP文件内容, 选择 “编辑”-“高级”-“设置选定内容的格式”,保存,重新编译! 快捷键 ctrl + A 全选文件内容后 按 ctrl + K ,F OK!

  8. linux查看端口被占用情况

    Linux 查看端口占用情况可以使用 lsof 和 netstat 命令. 如果linux中没有这两个命令,则yum安装一下 yum install -y lsof yum install -y ne ...

  9. vs编译项目报错:The OutputPath property is not set for this project

    今天使用VS2008编译项目时报错: The OutputPath property is not set for this project.  Please check to make sure t ...

  10. 关于fastJson的几个问题

    1.将对象中为null的属性也给序列化出来 可以使用SerializaerFeature实现 JSON.toJSONString(gas, SerializerFeature.WriteMapNull ...