鼠标行为
// 鼠标行为->坐标系
// 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);
}
}