鼠标拖放div 实现
Javascript的mousemove事件类型是一个实时响应的事件,当鼠标指针的位置发生变化时(至少移动1个像素),就会触发mousemove事件。该事件响应的灵敏度主要参考鼠标指针移动速度的快慢,以及浏览器跟踪更新的速度。
例如,接下来的一个例子就演示了如何综合应用各种鼠标事件来实现页面元素拖放操作的设计过程。在实现拖放操作的设计过程中,需要理清和解决以下几个问题:
- 定义拖放元素为绝对定位,以及设计事件的响应过程。这个实现比较容易。
- 清楚几个坐标概念:按下鼠标时的指针坐标,移动过程中当前鼠标的指针坐标,松开鼠标时的指针坐标,目标被拖动元素的元素坐标,拖动过程中的目标元素坐标。
- 算法设计:按下鼠标时,获取目标被拖动元素和鼠标指针的坐标位置,在移动过程中实时计算鼠标偏移的距离,并利用该偏移距离加上目标被拖动元素的原始坐标位置,获得目标被拖动元素的实时坐标位置。

如上图所示,其中变量ox和oy分别记录按下鼠标时目标被拖动元素的纵横坐标值,它们可以通过事件对象的offsetLeft和offsetTom属性获取。变量mx和my分别表示按下鼠标时,鼠标指针的坐标位置。而event.mx和event.my则是事件对象的自定义属性,用它们来存储当鼠标发生移动时鼠标指针的实时坐标位置。
当获取了上面3对坐标值之后,就可以动态计算目标被拖动元素的实时坐标位置,即x轴值为ox+event.mx-mx,y轴为oy+event.my-my。当松开鼠标时,则可以释放事件类型,并记录松开鼠标时鼠标指针拖动目标元素的坐标值,以及鼠标指针的位置,留待下一次做拖动操作时调用。
那么,整个鼠标拖动目标元素的操作示例代码如下:
html:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JavaScript鼠标移动(mousemove)事件</title>
<link href="css.css" rel="stylesheet" media="screen" type="text/css" />
<script language="javascript" type="text/javascript" src="script.js"></script>
</head>
<body>
<div id="box">
<div id="title">对话框标题</div>
</div>
</body>
</html>
css:
@CHARSET "UTF-8";
#box {
width: 400px;
height: 300px;
position: absolute;
border: 1px solid #AAAAAA;
top: 25px;
left: 80px;
} #title {
width: 100%;
height: 30px;
line-height: 30px;
background-color: #F1F1F1;
cursor: move;
}
js:
var ox = 0; // 鼠标按下时拖放对象X坐标值
var oy = 0; // 鼠标按下时拖放对象Y坐标值
var mx = 0; // 鼠标按下时鼠标指针X坐标值
var my = 0; // 鼠标按下时鼠标指针Y坐标值
var object = null; // 事件所发生的目标对象
/**
* 定义事件对象标准化函数
*/
function e(event) {
if(!event) { // 兼容IE浏览器
event = window.event;
event.target = event.srcElement;
event.layerX = event.offsetX;
event.layerY = event.offsetY;
}
event.mx = event.pageX || event.clientX + document.body.scrollLeft; // 计算鼠标指针X轴距离
event.my = event.pageY || event.clientY + document.body.scrollTop; // 计算鼠标指针Y轴距离
return event; // 返回标准化的事件对象
}
/**
* 鼠标事件处理
* 按下鼠标,则开始事件的处理
*/
document.onmousedown = function(event) {
event = e(event);
object = event.target;
if(object.id == "title") {
ox = parseInt(object.parentNode.offsetLeft);
oy = parseInt(object.parentNode.offsetTop);
mx = event.mx;
my = event.my;
document.onmousemove = move;
document.onmouseup = stop;
}
}
/**
* 鼠标移动处理函数
*/
function move(event) {
event = e(event);
object.parentNode.style.left = ox + event.mx - mx + "px";
object.parentNode.style.top = oy + event.my - my + "px";
}
/**
* 松开鼠标处理函数
*/
function stop(event) {
event = e(event);
ox = parseInt(object.parentNode.offsetLeft);
oy = parseInt(object.parentNode.offsetTop);
mx = event.mx;
my = event.my;
object = document.onmousemove = document.onmouseup = null; // 释放所有操作对象
}
上述代码在IE和火狐下均测试通过。源代码下载:
转自:http://www.sunchis.com/html/js/jsbasic/2012/0418/399.html
个人感觉这个写的非常好。
一个更好的例子:http://www.yzzer.com/js/141
另参看:http://www.cnblogs.com/youxin/p/3380796.html 拖动div。
鼠标拖放div 实现的更多相关文章
- jquery鼠标移动div内容上下左右滚动
jquery鼠标移动div内容上下左右滚动 点击这里查看效果:http://keleyi.com/keleyi/phtml/jqtexiao/9.htm <!DOCTYPE html PUBLI ...
- js用斜率判断鼠标进入div的四个方向
网上大部分判断鼠标移入div移入移出都是使用一下方法: 这个方法确实十分奇特,使用起来十分方便. 后来自己看了一些文章,看到有另一种以斜率的方法来判断鼠标的移动方向. 上图是此方法的示意图,以浏览器左 ...
- 发掘ListBox的潜力(二):鼠标拖放插入点提示
鼠标拖放插入点提示 鼠标拖放是Windows常见的操作,比如拷贝文件就可用拖放方式进行.在我们编写的应用程序中,有时为了方便用户操作需要支持鼠标拖放.对于大部分的VCL控件只要鼠标将DragMode设 ...
- CSS鼠标悬浮DIV后显示DIV外的按钮
昨天写样式遇到个问题,如何让鼠标悬浮DIV后,显示DIV外的按钮,可以点击到按钮. 效果如下: 问题: 在DIV hover时候将按钮设为display: block,这是很直接的想法,但是这有个问题 ...
- JS用斜率判断鼠标进入DIV四个方向的方法 判断鼠标移入方向
本文要介绍的是一种鼠标从一个元素移入移出时,获取鼠标移动方向的思路.这个方法可以帮助你判断鼠标在移入移出时,是从上下左右的哪个方向发生的.这个思路,是我自己琢磨出来,利用了一点曾经高中学过的数学知识, ...
- Javascript 简单实现鼠标拖动DIV
http://zhangbo-peipei-163-com.iteye.com/blog/1740078 比较精简的Javascript拖动效果函数代码 http://www.jb51.net/art ...
- PyQt(Python+Qt)学习随笔:Qt Designer中部件的是否接受鼠标拖放事件的acceptDrops属性及含义
acceptDrops属性表示当前部件是否接受鼠标拖放事件,鼠标拖放应该是与鼠标拖拽结合在一起的,在Qt Designer中可以通过属性acceptDrops设置部件是否接受鼠标拖放事件.如果部件接受 ...
- 当鼠标移入div上时,div的背景色在4s之内渐变为灰色,同时在5s之内顺时针旋转45度,且尺寸缩小一半;当鼠标移走时,再渐变恢复初始样式
<style> #d1{ width:200px; height:200px; border:1px solid #000; transition:background 4s linear ...
- 实现鼠标悬停,div勾画div边框的动画
鼠标悬浮,边框div边框的动画样式,效果图如下: 首先定义div及其样式: <style> .show { width:300px; height:200px; border:1px so ...
随机推荐
- BaseActivity的定义——作为所有Activity类的父类
public abstract class BaseActivity extends AppCompatActivity implements View.OnClickListener { prote ...
- 转:C4项目中验证用户登录一个特性就搞定
转:C4项目中验证用户登录一个特性就搞定 在开发过程中,需要用户登陆才能访问指定的页面这种功能,微软已经提供了这个特性. // 摘要: // 表示一个特性,该特性用于限制调用 ...
- SqlDataReader 获取存储过程返回值
编写存储过程,获取不到返回值 附上代码: SqlDataReader reader = null;// totalRecords = ; try { SqlConnectionHolder conne ...
- SQL Server 找出值得优化的语句
方法 1. sys.dm_exec_qurey_stats 返回 SQL Server 中缓存查询计划的聚合性能统计信息. 缓存计划中的每个查询语句在该视图中对应一行, 并且行的生存期与计划本身相关联 ...
- Delphi HTML5 Canvas组件
最近去sourceforge瞎转悠,突然发了一个组件,关于Delphi下Html5的canvas的组件,大概浏览了一下源码,竟然是纯粹的Pascal代码,也就说完全的Delphi代码.不敢独享,现在上 ...
- linux守护进程解读
Linux系统守护进程详解 不要关闭下面这几个服务: acpid, haldaemon, messagebus, klogd, network, syslogd 1. NetworkManag ...
- Android 查看通讯录Contacts是否发生变化
目的:确定通讯录是否发生变化 根据:參见ContactsContract.RawContacts类中的VERSION常量,该值是仅仅读的,当通讯录发生变化时,都会使该值变化 方法:version值是相 ...
- 【迪杰斯特拉双关键字最短路】【HDU3790】【最短路径问题】
题目大意: 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. 只需要再更新的时候判断一下就好 voi ...
- 简述UITextField的属性和用法
0. enablesReturnKeyAutomatically 默认为No,如果设置为Yes,文本框中没有输入任何字符的话,右下角的返回按钮是disabled的. 1.borderStyle ...
- NSDictionary json格式字符串转字典,字典转json格式字符串
+ (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString { if (jsonString == nil) { return ...