标签:
html拖拽的思路如下:鼠标按下 > 鼠标移动 > 鼠标弹起,只要把这三个鼠标事件添加到对应的dom元素上,作相应的处理就行了。
1、mousedown事件须加在可拖动dom上;
2、mousemove事件加在document上;
3、mouseup事件还是加在可拖动dom上;
注意:拖拽的时候要禁止选中页面文字
body{
-moz-user-select:none;
-webkit-user-select:none;
user-select:none;
-ms-user-select: none;
}
JavaScript代码如下:
var component = {};
component.Drag = (function() {
//私有方法
function drag(that) {
var oDrag = that.drag,
move = that.move,
limit = that.limit,
callBack = that.callBack,
isDrag = false;
oDrag.onmousedown = function() {
isDrag = true;
addMove(doDrag);
document.onmouseup = function() {
isDrag = false;
removeMove();
};
};
oDrag.onmouseup = function() {
isDrag = false;
removeMove();
document.onmouseup = null;
};
function doDrag(e) {
e = event || window.event;
if(!isDrag) return false;
var top = e.clientY - (move.parentNode == document.body ? 0 : oDrag.parentNode.offsetTop) - oDrag.offsetHeight/2,
left = e.clientX - (move.parentNode == document.body ? 0 : oDrag.parentNode.offsetLeft) - oDrag.offsetWidth/2;
if(limit){
var minX = limit[0],
minY = limit[1],
maxX = limit[2],
maxY = limit[3];
if(top >= maxY) {
top = maxY;
} else if(top <= minY) {
top = minY;
}
if(left >= maxX) {
left = maxX;
} else if(left <= minX) {
left = minX;
}
}
move.style.top = top + ‘px‘;
move.style.left = left + ‘px‘;
if(callBack) {
callBack.call(doDrag,top,left);
}
};
};
//移除事件
function removeMove() {
if(document.removeEventListener) {
document.removeEventListener(‘mousemove‘);
} else {
document.detachEvent(‘onmousemove‘);
}
}
//添加事件
function addMove(doDrag) {
if(document.addEventListener) {
document.addEventListener(‘mousemove‘,doDrag);
} else {
document.attachEvent(‘onmousemove‘,doDrag);
}
}
var O = function() {};
O.prototype.init = function(config) {
this.drag = config.drag; //必须参数:拖动对象
this.move = config.move || config.drag; //可选参数:如果可拖动对象与拖动对象是同一html标签,可以不传入move参数
this.limit = config.limit || false; //可选参数:限制拖动范围,参数为数组形式[x,y];不传入则为不限制拖动范围
this.callBack = config.callBack || false; //可选参数:传入一个函数,用于即时针对滑块偏移量做处理
drag(this);
return this;
};
return O;
})();
html代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>拖拽</title>
</head>
<style>
*{margin:0;padding:0;}
body{
-moz-user-select:none;
-webkit-user-select:none;
user-select:none;
-ms-user-select: none;
}
div{user-select:none;}
.poa{position:absolute;}
.por{position:relative;}
.drag1{background:#ddd;border:2px solid #999;display:block;width:50px;height:50px;cursor:move;left:0;top:0;}
.drag2{width:40px;height:40px;background:#dcdcdc;display:block;left:150px;top:100px;cursor:move;}
.div1{border:5px solid gray;font:italic 42px/400px ‘Microsoft Yahei‘;color:#ccc;height:400px;width:400px;margin-left:55px;text-align:center;position:relative;}
.showMsg{position:absolute;width:250px;height:150px;left:500px;top:300px;}
.showMsg h1{font:bold 28px/38px ‘‘;color:#555;text-indent:20px;background:#ddd;cursor:move;}
.showMsg div{background:#f4f4f4;font:22px/55px ‘‘;text-align:center;}
.div2{height:20px;width:400px;border:1px solid #ddd;background:#f4f4f4;margin:5px;position:relative;}
.drag4{display:block;width:30px;height:20px;position:absolute;left:0;right:0;cursor:move;background:gray;}
p{font:18px/30px arial;color:#555;}
p span{font-size:28px;color:#f63;padding:0 5px;}
</style>
<body>
<span class="poa drag1" id="drag1"></span>
<div class="div1">拖不出去,相信我<span class="poa drag2" id="drag2"></span></div>
<div class="showMsg" id="showMsg">
<h1 id="drag3">hello!</h1>
<div>this is a window!</div>
</div>
<br>
<div class="div2" id="div2"><span class="drag4" id="drag4"></span></div>
<p><span id="num">0</span>%</p>
<script src="component.js"></script>
<script>
var doc = document,
drag = new component.Drag(),
num = doc.getElementById(‘num‘);
//简单拖动
drag.init({
drag : doc.getElementById(‘drag1‘)
});
//范围拖动
drag.init({
drag : doc.getElementById(‘drag2‘),
//第一对数字为左上方坐标,第二对为右下方坐标,这两个点规定了滑块可以拖动的范围
limit :[0,0,360,360]
});
//窗口拖动
drag.init({
drag : doc.getElementById(‘drag3‘), //可拖动dom
move : doc.getElementById(‘showMsg‘) //实际偏移dom
});
//复杂应用,根据滑块偏移量作处理
drag.init({
drag : doc.getElementById(‘drag4‘),
limit :[0,0,370,0],
//依靠这个回调函数可以在拖动的时候即时获取偏移量,便于针对偏移量即时做一些处理
callBack : function(top,left) {
num.innerHTML = parseInt(left/3.7);
}
});
</script>
</body>
</html>
标签:
原文地址:http://www.cnblogs.com/tianpw/p/4978081.html