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

js 鼠标拖拽元素

web qq页面上的元素基本都可以拖拽,实现web app
  • pinger1225
  • pinger1225
  • 2014年08月21日 17:11
  • 3822

关于JavaScript的鼠标移动事件

前言: ============================= Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。 事件通常与函数结合...
  • u010661782
  • u010661782
  • 2015年10月10日 10:59
  • 12181

HTML+js实现鼠标绘制可拖动矩形

.box {     background: #f00;     width: 0px;     height: 0px;...
  • baolin811
  • baolin811
  • 2016年05月18日 18:32
  • 2879

原生JS实现元素跟随鼠标拖动事件

原生JS实现元素跟随鼠标拖动事件
  • DeepLies
  • DeepLies
  • 2016年11月26日 14:06
  • 5666

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

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

jQuery实现鼠标拖拽div效果

实现这个效果的关键是给div的定位设置成absolute,然后获得鼠标移动后的位置坐标并给要移动的div。 我将它封装成了一个函数,只需要传入参数即可使用。 downDiv:鼠标按下部分的id; ...
  • hry1243916844
  • hry1243916844
  • 2017年08月30日 16:27
  • 441

jquery实现鼠标拖拽选择

  • 2012年01月13日 17:26
  • 32KB
  • 下载

DOM事件 --鼠标拖拽div

实现效果: body{margin:0;padding:0;} #wrap{width:300px;height:200px;border:1px solid #FFFFCC...
  • u011344924
  • u011344924
  • 2015年08月26日 17:38
  • 2853

js 实现鼠标按下 拖动div

//div 拖动 container.onmousedown = function() { //获取鼠标当前坐标 var pageX = event.clientX; var ...
  • liujava621
  • liujava621
  • 2014年06月13日 16:05
  • 3877

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

一、js中常用的几个必备鼠标事件 onclick: 元素上发生鼠标点击时触发. ondblclick: 元素上发生鼠标双击时触发. onmousedown: 当元素上按下鼠标按钮时触发. onmous...
  • kellywong
  • kellywong
  • 2017年06月20日 17:25
  • 2817
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:js实现鼠标拖拽效果
举报原因:
原因补充:

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