js实现鼠标拖拽效果

转载 2016年05月31日 16:43:48

在web开发中,鼠标拖拽效果非常常见,例如百度的登录页,点击登录会弹出一个窗口,并且这个窗口可以拖动;那么这样的拖拽效果如何实现呢 ?其实实现很简章,搞清楚他的原理就很容易了;首当其冲的,要涉及到鼠标的三个事件,分别为鼠标按下、移动、松开;在这三个事件里分别计算元素鼠标的位置即可;
/*******拖拽原理1
                拖拽状态 = 0
                鼠标在元素上按下的时候 {
                        拖拽状态 = 1
                        记录下鼠标的x和y坐标
                        记录下元素的x和y坐标
                }
                鼠标在元素上移动的时候 {
                        如果拖拽状态是0就什么也不做。
                        如果拖拽状态是1, 那么
                        元素y = 现在鼠标y - 原来鼠标y + 原来元素y
                        元素x = 现在鼠标x - 原来鼠标x + 原来元素x
                }
                        鼠标在任何时候放开的时候 {
                        拖拽状态 = 0
                }
                将以上思路翻译成JS代码就可以实现拖拽的效果了。
*******/
上面这个原理也可以演变为:
/*******拖拽原理2
                拖拽状态 = 0
                鼠标在元素上按下的时候 {
                        拖拽状态 = 1
                        记录下鼠标的x和y坐标
                        记录下元素的x和y坐标
                        元素的偏移值X=元素的X-元素的offsetLeft
                        元素的偏移值Y=元素的Y-元素的offsetTop
                }
                鼠标在元素上移动的时候 {
                        如果拖拽状态是0就什么也不做。
                        如果拖拽状态是1, 那么
                        元素y = 现在鼠标y -元素的偏移值X
                        元素x = 现在鼠标x -元素的偏移值Y
                }
                        鼠标在任何时候放开的时候 {
                        拖拽状态 = 0
                }
                将以上思路翻译成JS代码就可以实现拖拽的效果了。
*******/
上面两种思路其实是异曲同工,需要注意的是在移动事件里,还要处理元素边缘的位置,以防止元素被拖动的时候拖到浏览器以外的地方;直接来看代码:


代码一:

<span style="font-family:SimSun;"><!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>JS拖拽</title>
	<style>
	*{padding: 0; margin: 0; }
	.box{width: 100px;height: 100px;background: blue;position: absolute; }
	</style>
	<script>
		var isDown = false;
		var ObjLeft, ObjTop, posX, posY, obj;
		window.onload = function() {
			obj = document.getElementById('box');
			obj.onmousedown = down;
			document.onmousemove = move;
			document.onmouseup = up;
		}

		function down(event) {
			obj.style.cursor = "move";
			isDown = true;
			ObjLeft = obj.offsetLeft;
			ObjTop = obj.offsetTop;
			posX = parseInt(mousePosition(event).x);
			posY = parseInt(mousePosition(event).y);
		}

		function move(event) {
			if (isDown == true) {
				var x = parseInt(mousePosition(event).x - posX + ObjLeft);
				var y = parseInt(mousePosition(event).y - posY + ObjTop);
				var w = document.documentElement.clientWidth - obj.offsetWidth;
				var h = document.documentElement.clientHeight - obj.offsetHeight;
				console.log(x + ',' + y);
				if (x < 0) {
					x = 0
				} else if (x > w) {
					x = w
				};
				if (y < 0) {
					y = 0
				}else if (y > h) {
					y= h
				};

				obj.style.left = x + 'px';
				obj.style.top = y + 'px';
			}
		}

		function up() {
			isDown = false;
		}
		
		function mousePosition(evt) {
			var xPos, yPos;
			evt = evt || window.event;
			if (evt.pageX) {
				xPos = evt.pageX;
				yPos = evt.pageY;
			} else {
				xPos = evt.clientX + document.body.scrollLeft - document.body.clientLeft;
				yPos = evt.clientY + document.body.scrollTop - document.body.clientTop;
			}
			return {
				x: xPos,
				y: yPos
			}
		}
	</script>
</head>
<body>
	<div id="box" class="box"></div>
</body>
</html></span>



代码二:

<span style="font-family:SimSun;"><!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>JS拖拽</title>
	<style>
	*{padding: 0; margin: 0; }
	.box{width: 100px;height: 100px;background: blue;position: absolute; }
	</style>
	<script>
		var isDown = false;
		var ObjLeft, ObjTop, posX, posY, obj,offsetX,offsetY;
		window.onload = function() {
			obj = document.getElementById('box');
			obj.onmousedown = down;
			document.onmousemove = move;
			document.onmouseup = up;
		}

		function down(event) {
			obj.style.cursor = "move";
			isDown = true;
			ObjLeft = obj.offsetLeft;
			ObjTop = obj.offsetTop;
			posX = parseInt(mousePosition(event).x);
			posY = parseInt(mousePosition(event).y);
			offsetX=posX-ObjLeft;
			offsetY=posY-ObjTop;
		}

		function move(event) {
			if (isDown == true) {
				var x=mousePosition(event).x-offsetX
				var y=mousePosition(event).y-offsetY
				var w = document.documentElement.clientWidth - obj.offsetWidth;
				var h = document.documentElement.clientHeight - obj.offsetHeight;
				console.log(x + ',' + y);
				x=Math.min(w,Math.max(0,x));
				y=Math.min(h,Math.max(0,y));
				obj.style.left = x + 'px';
				obj.style.top = y + 'px';
			}
		}

		function up() {
			isDown = false;
		}
		
		function mousePosition(evt) {
			var xPos, yPos;
			evt = evt || window.event;
			if (evt.pageX) {
				xPos = evt.pageX;
				yPos = evt.pageY;
			} else {
				xPos = evt.clientX + document.body.scrollLeft - document.body.clientLeft;
				yPos = evt.clientY + document.body.scrollTop - document.body.clientTop;
			}
			return {
				x: xPos,
				y: yPos
			}
		}
	</script>
</head>
<body>
	<div id="box" class="box"></div>
</body>
</html></span>




本文转自:http://www.w3cfuns.com/notes/14070/079855d61dfd52eb1c9b590f22405b95.html

相关文章推荐

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

完美实现鼠标拖拽事件,解决各种小bug,基于jquery

鼠标拖拽事件是web中使用频率极高的事件,之前写过的代码包括网上的代码,总存在各种各样的问题,包括拖拽体验差,松开鼠标后拖拽效果仍存在以及代码冗余过大等 本次我才用jQuery实现一个尽可能高效的拖拽...

鼠标拖拽效果完整代码实现

  • 2016年05月11日 16:56
  • 108KB
  • 下载

使用b2MouseJoint实现鼠标拖拽刚体的效果

在Box2d中实现鼠标拖拽效果

鼠标拖拽效果原理及完整代码实现

鼠标拖拽事件完整代码实现

PyQt5学习记录(7)---监听鼠标拖拽事件实现Mac上百度云盘拖拽效果

背景在Mac版的百度云盘上有这样一个效果,拖拽一个文件过来,将会显示边框蓝色非常醒目的提醒了操作者。本文介绍用PyQt5监听鼠标的拖拽事件,实现一个类似的效果,当拖拽时动态的改变整个界面边框颜色.下面...

Drag,js实现鼠标拖拽元素

今天有个需求,就是实现移动端元素的拖拽功能,自己用原生代码写了一个在PC端通过鼠标进行拖拽的例子,代码如下: 实现拖拽功能 ...

使用js中常用的鼠标事件实现一个拖拽的例子

一、js中常用的几个必备鼠标事件 onclick: 元素上发生鼠标点击时触发. ondblclick: 元素上发生鼠标双击时触发. onmousedown: 当元素上按下鼠标按钮时触发. onmous...

js实现鼠标拖拽div-------Day44

今天状态不好,颈椎酸,头疼,哎,果然身体才是本钱,完成基本功能果断去睡觉.....

原生js实现四种拖拽效果

  • 2017年06月13日 20:08
  • 5KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:js实现鼠标拖拽效果
举报原因:
原因补充:

(最多只允许输入30个字)