JavaScript之拖拽功能、封装

通过之前一段时间的学习,逐步掌握了JavaScript的一些基本语法,学完之后还得多加练习,根据所学知识,做了一个简易的拖拽功能。

首先先布好html结构,包括样式,这里简单的做了两个拖拽的功能,一个相对于document,一个相对于id = ‘box’,为了消除浏览器自带的文本拖拽功能,添加了一行文字;

演示地址

html代码:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>拖拽封装</title>
<script src="../js/drag.js"></script>
<style>
	#div{ overflow:hidden; width:50px; height:50px; background-color:#09F; position:absolute; z-index:5}
	#img{ display:block; position:absolute}
	#box{ width:600px; height:600px; position:relative; margin:20px auto; border:1px solid #000;}
</style>
</head>

<body>
全选试试拖拽
<div id="div"></div>
<div id="box">
<img src="../Skins/gd07.jpg" id="img" width="100">
</div>
</body>
</html>
效果图:一个相对于document,一个相对于#box


js调用代码:

<script>
var div = document.getElementById("div");
var img = document.getElementById("img");
var box = document.getElementById("box");
//调用
drag(img,box); //相对于#box拖拽#img
drag(div,document);//相对于document拖拽#div
</script>



消除浏览器自带的文本选中拖拽功能:

ie8及以下版本:

if(obj.setCapture){	//设置全局捕获==>取消浏览器默认的文字拖拽(ie8及以下)
			obj.setCapture();
			}

标准及ie8以上版本(因为浏览器文本拖拽功能是onmousedown事件触发的,所以只要令该事件的返回值为空即可):

obj.onmousedown = function(){
	return false;
}



防止被拖拽的元素跑到拖拽区域外面去了,所以需要限制拖拽的范围:left范围在  0 ~ 拖拽区的content宽-被拖拽元素的offsetWidth,top范围在  0 ~ 拖拽区的content高-被拖拽元素的offsetHeight;为了达到磁性吸附的功能,在上诉区域内向内减少20个像素作为判断,即当被拖拽元素的left值,top值距离边框少于20px时,被拖拽元素自动贴上去,即left=0, top=0;

代码如下:

if(leftArea < 20){
	leftArea = 0;
}else if(leftArea>w-obj.offsetWidth-20){
	leftArea = w-obj.offsetWidth;
}
if(topArea < 20){
	topArea = 0;
}else if(topArea>h-obj.offsetHeight-20){
	topArea = h -obj.offsetHeight;
}





封装的js完整代码:

function drag(obj,box){//第一个参数是被拖拽的元素,第二个参数是拖拽的限制区域;例如上面调用的#box和document
	obj.onmousedown = function(ev){
		var ev = ev || event;
		var dragl = ev.clientX - this.offsetLeft;
		var dragt = ev.clientY - this.offsetTop;
		
		if(obj.setCapture){//设置全局捕获==>取消浏览器默认的文字拖拽(ie8及以下)
			obj.setCapture();
			}
		
		document.onmousemove = function(ev){
			var ev =ev || event;
			var leftArea = ev.clientX - dragl;
			var topArea = ev.clientY - dragt;
			var w=null,h=null;
			if(box == document){
				w = document.documentElement.clientWidth
				h = document.documentElement.clientHeight
				}else{
					w = box.scrollWidth;
					h = box.scrollHeight;
					}
			
			if(leftArea < 20){
				leftArea = 0;
				}else if(leftArea>w-obj.offsetWidth-20){
					leftArea = w-obj.offsetWidth;
					}
			if(topArea < 20){
				topArea = 0;
				}else if(topArea>h-obj.offsetHeight-20){
					topArea = h -obj.offsetHeight;
					}
			
			obj.style.left =  leftArea + 'px';
			obj.style.top =  topArea + 'px';
			}
		document.onmouseup = function(){
			document.onmousemove =null;
			document.onmouseup = null;
			if(obj.releaseCapture){//取消全局捕获
				obj.releaseCapture();
				}
			}
		return false;//取消浏览器默认的文字拖拽 标准浏览器,ie8以上
		}
}

下载地址



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mosowe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值