鼠标行为
// 鼠标行为->坐标系 // clientX/Y 鼠标位置相当于当前可视区域的坐标(不包括滚动条的滚动距离)// layerX/Y 同pageX/pageY一样 ie浏览器支持性不好// x/y 同clientX/Y一样,火狐浏览器老版不支持// pageX/pageY 鼠标位置相对于当前文档的坐标(包含滚动条滚动的距离)ie9一下不支持// screenX/Y 鼠标位置相对于屏幕的坐标// offsetX/offsetY 鼠标位置相对于块元素的位置 包含边框 safari不包括边框document.onclick=function(){ var e=e||window.event;}
封装pageX/pageY
function getScrollOffset() { if(window.pageXOffset){ return { left: window.pageXOffset, top: window.pageYOffset } }else{ return { left: document.body.scrollLeft+document.documentElement.scrollLeft, top: document.body.scrollTop+document.documentElement.scrollTop, } }}function pagePos(e){ var sLeft=getScrollOffset().left, sTop=getScrollOffset().top, cLeft=docuemnt.documentElement.clientLeft||0; cTop=docuemnt.docuemntElement.clientTop||0; return { X: e.clientX+sLeft-cLeft, Y: e.clientY+sTop-cTop; }}
拖拽
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style type='text/css'> .box { position: absolute; width: 100px; height: 100px; background-color: pink; } </style></head><body> <br/> <div class='box'></div></body><script> // 鼠标行为->坐标系 // clientX/Y 鼠标位置相当于当前可视区域的坐标(不包括滚动条的滚动距离) // layerX/Y 同pageX/pageY一样 ie浏览器支持性不好 // x/y 同clientX/Y一样,火狐浏览器老版不支持 // pageX/pageY 鼠标位置相对于当前文档的坐标(包含滚动条滚动的距离)ie9一下不支持 // screenX/Y 鼠标位置相对于屏幕的坐标 // offsetX/offsetY 鼠标位置相对于块元素的位置 包含边框 safari不包括边框 // document.onclick=function(){ // var e=e||window.event; // } function getScrollOffset() { if(window.pageXOffset){ return { left: window.pageXOffset, top: window.pageYOffset } }else{ return { left: document.body.scrollLeft+document.documentElement.scrollLeft, top: document.body.scrollTop+document.documentElement.scrollTop, } } } function pagePos(e){ var sLeft=getScrollOffset().left, sTop=getScrollOffset().top, cLeft=document.documentElement.clientLeft||0; cTop=document.documentElement.clientTop||0; return { X: e.clientX+sLeft-cLeft, Y: e.clientY+sTop-cTop } } function getStyles(elem,prop){ if(window.getComputedStyle){ if(prop){ return parseInt(window.getComputedStyle(elem,null)[prop]); }else{ return window.getComputedStyle(elem,null); } }else{ if(prop){ return parseInt(elem.currentStyle[prop]); }else{ return elem.currentStyle; } } } var oBox=document.getElementsByClassName('box')[0]; oBox.onmousedown=function(e){ var x=pagePos(e).X-getStyles(oBox,'left'); var y=pagePos(e).Y-getStyles(oBox,'top'); console.log('pageX,pageY',x,y) console.log('offsetX,offsetY',e.offsetX,e.offsetY) document.onmousemove=function() { var e=e||window.event, page=pagePos(e); oBox.style.left=page.X-x+'px'; oBox.style.top=page.Y-y+'px'; } document.onmouseup=function(e){ document.onmousemove=null; document.onmouseup=null; } }</script></html>
封装拖拽方法
elemDrag(oBox) function addEvent(el,type,fn){ if(el.addEventListener){ el.addEventListener(type,fn,false); }else if(el.attachEvent){ el.attachEvent('on'+type,function(){ fn.call(el); }) }else{ el['on'+type]=fn; } } function elemDrag(elem) { var x,y; addEvent(elem,'mousedown',function(e){ var e=e||window.event; x=pagePos(e).X-getStyles(elem,'left'); y=pagePos(e).Y-getStyles(elem,'top'); addEvent(document,'mousemove',mouseMove); addEvent(document,'mouseup',mouseUp); // cancelBubble(e); 未完成 // preventDefaultEvent(e); }) function mouseMove(e) { var e=e||window.event; elem.style.top=pagePos(e).Y-y+'px'; elem.style.left=pagePos(e).X-x+'px'; } function mouseUp(e) { var e=e||window.event; // removeEvent(document,'mousemove',mouseMove); // removeEvent(document,'mouseUp',mouseUp); document.removeEventListener('mousemove',mouseMove,false); document.removeEventListener('mouseup',mouseUp,false); } }