鼠标行为->坐标系
- clientX/Y:鼠标相对浏览器可视区域的坐标。不包含滚动条
- layerX/Y 同pageX/Y相同 IE11以下和clientX/Y相同
- screenX/Y 鼠标相对于屏幕的坐标
- x/y 和clientX/Y相同。火狐不支持。鼠标位置相对于当前可视区域的坐标。不包含滚动条。
- pageX/pageY 鼠标相对于文档的坐标,包括滚动条的距离。IE9以下不支持
- offsetX/Y 鼠标相对于块元素的坐标 包含边框 safari 不包含边框。
封装
- 鼠标在文档中的位置。
```javascript
/**
- 获取鼠标在文档中的位置
- 相对于客户端的距离+滚动的距离-文档偏移量
- @param {Event 对象} e
- @returns 鼠标在文档中的位置 */ function pagePos(e) { var e = e || window.event, sLeft = getScrollOffset().x,//滚动条横轴滚动距离 sTop = getScrollOffset().y,//滚动条纵轴滚动距离 clientX = e.clientX,//相对于浏览器可视窗口的横轴距离 clientY = e.clientY,//相对于浏览器可视窗口的纵轴距离 cLeft = document.documentElement.clientLeft || 0,//文档偏移量 cTop = document.documentElement.clientTop || 0//文档偏移量 return { x: clientX + sLeft - cLeft, y: clientY + sTop - cTop } }
拖拽<br /> mousedown + mousemove +mouseup = drag;<br />封装```javascript/**** @param {Event } e* 阻止事件冒泡*/function cancelBubble(e) {var e = e || window.e;if (e.stopPropagation) {e.stopPropagation();} else {e.cancelBubble = true;}}/**** @param {Event} e* 阻止默认事件*/function preventDefault(e) {var e = e || window.event;if (e.preventDefault) {e.preventDefault();} else {e.returnValue = false;}}
/*** 拖拽事件简单封装* @param {Element 元素} elem*/function dragEvent(elem) {var x,y,//元素宽度eleWidth = parseInt(getStyle(elem, 'width')),//元素高度eleHeight = parseInt(getStyle(elem, 'height')),// 文档宽高对象doc = getDocHeight();// 添加鼠标按下事件。addEvent(elem,'mousedown',function (e) {var e = e || window.event,//元素初始位置的lefteleOrignLeft = parseInt(getStyle(elem, 'left')),//元素初始位置的topeleOriginTop = parseInt(getStyle(elem, 'top'));// 鼠标位置相对elem 左上角x的距离x = mousePos(e).x - eleOrignLeft;// 鼠标位置相对elem 左上角y的距离y = mousePos(e).y - eleOriginTop;// 添加鼠标移动事件addEvent(document, 'mousemove', mouseMove);// 添加鼠标抬起事件addEvent(document, 'mouseup', mouseUp);// 阻止事件冒泡cancelBubble(e);// 阻止事件默认事件preventDefault(e);})function mouseMove(e) {var e = e || window.e,//鼠标点击的位置evPos = mousePos(e),// 鼠标相对于文档的位置 - 鼠标相对于元素左上角的位置eleLeft = evPos.x - x,eleTop = evPos.y - y;if (eleLeft <= 0) {eleLeft = 0;} else if (eleLeft >= (doc.width - eleWidth)) {//右边的距离超出了文档宽度减去 元素宽度eleLeft = doc.width - eleWidth;}if (eleTop <= 0) {eleTop = 0;} else if (eleTop >= (doc.height - eleHeight)) {//高度超出了文档高度减去 元素高度eleTop = doc.height - eleHeight;}elem.style.left = eleLeft+ 'px';elem.style.top = eleTop + 'px';}function mouseUp(e) {removeEvent(document, 'mouseup', mouseUp);removeEvent(document, 'mousemove', mouseMove);}}
