鼠标拖拽效果js可以由鼠标的三个事件实现
document.getElementById(ID) 根据传入ID获得元素对象
Element.addEventListener(TYPE,FUNCTION); 元素对象设置事件监听处理器
document.οnmοuseup=function(e){} 鼠标松开时触发
document.οnmοusemοve=function(e){} 鼠标移动时触发
window.οnresize=function(){} 窗口大小改变时触发
document.documentElement.clientWidth
document.documentElement.clientHeight 获得窗口显示区域的宽/高
Event.pageX
Event.pageY 获得当前事件发生时的鼠标x/y坐标
Element.offsetWidth
Element.offsetHeight 获得元素对象的实际宽/高度
Element.style.left
Element.style.top 获取/设置元素对象的left/top位置
var dialogInstace , onMoveStartId , mousePos = {x:0,y:0}; // 用于记录当前可拖拽的对象
// var zIndex = 9000;
// 获取元素对象
function g(id){return document.getElementById(id);}
// 自动居中元素(el = Element)
function autoCenter( el ){
var bodyW = document.documentElement.clientWidth;
var bodyH = document.documentElement.clientHeight;
var elW = el.offsetWidth;
var elH = el.offsetHeight;
el.style.left = (bodyW-elW)/2 + 'px';
el.style.top = (bodyH-elH)/2 + 'px';
}
// 自动扩展元素到全部显示区域
function fillToBody( el ){
el.style.width = document.documentElement.clientWidth +'px';
el.style.height = document.documentElement.clientHeight + 'px';
}
// Dialog实例化的方法
function Dialog( dragId , moveId ){
var instace = {} ;
instace.dragElement = g(dragId); // 允许执行 拖拽操作 的元素
instace.moveElement = g(moveId); // 拖拽操作时,移动的元素
instace.mouseOffsetLeft = 0; // 拖拽操作时,移动元素的起始 X 点
instace.mouseOffsetTop = 0; // 拖拽操作时,移动元素的起始 Y 点
instace.dragElement.addEventListener('mousedown',function(e){
var e = e || window.event;
dialogInstace = instace;
instace.mouseOffsetLeft = e.pageX - instace.moveElement.offsetLeft ;
instace.mouseOffsetTop = e.pageY - instace.moveElement.offsetTop ;
onMoveStartId = setInterval(onMoveStart,10);
return false;
// instace.moveElement.style.zIndex = zIndex ++;
})
return instace;
}
// 在页面中侦听 鼠标弹起事件
document.onmouseup = function(e){
dialogInstace = false;
clearInterval(onMoveStartId);
}
document.onmousemove = function( e ){
var e = window.event || e;
mousePos.x = e.clientX;
mousePos.y = e.clientY;
e.stopPropagation && e.stopPropagation();
e.cancelBubble = true;
e = this.originalEvent;
e && ( e.preventDefault ? e.preventDefault() : e.returnValue = false );
document.body.style.MozUserSelect = 'none';
}
function onMoveStart(){
var instace = dialogInstace;
if (instace) {
var maxX = document.documentElement.clientWidth - instace.moveElement.offsetWidth;
var maxY = document.documentElement.clientHeight - instace.moveElement.offsetHeight ;
instace.moveElement.style.left = Math.min( Math.max( ( mousePos.x - instace.mouseOffsetLeft) , 0 ) , maxX) + "px";
instace.moveElement.style.top = Math.min( Math.max( ( mousePos.y - instace.mouseOffsetTop ) , 0 ) , maxY) + "px";
}
}
// 重新调整对话框的位置和遮罩,并且展现
function showDialog(){
g('dialogMove').style.display = 'block';
g('mask').style.display = 'block';
autoCenter( g('dialogMove') );
fillToBody( g('mask') );
}
// 关闭对话框
function hideDialog(){
g('dialogMove').style.display = 'none';
g('mask').style.display = 'none';
}
// 侦听浏览器窗口大小变化
window.onresize = showDialog;
Dialog('dialogDrag','dialogMove');
showDialog();