精确定位 以及js实现拖动

下文中的所有event都指的是跨浏览器的event对象,即DOM事件的event,IE事件为window.event.

 

事件的各种坐标

 

1. clientX clientY

event.clientX;    

event.clientY;

鼠标相对于浏览器窗口可视区域的水平,垂直距离。(可视区域不包括工具栏和滚动条)

注:如果鼠标不动,滚动滚轮,再次点击,值不变

2. pageX  pageY

event.pageX;

event.pageY;

页面坐标,相对于文档的坐标,左上角为(0,0),左、上为负,右、下为正,

注:pageX=clientX+scrollLeft  pageY=clientY+scrollTop

也就是说: pageX 和 pageY获取的是相对文档高度,可以理解为距body最左上角的位值

3. screenX , screenY

event.screenX;

event.screenY;

相对于屏幕的坐标,包括浏览器工具栏,包括工具栏上方的任何其他内容

4. offsetX offsetY

event.screenX;

event.screenY;

鼠标光标相对于目标元素边界的水平和垂直坐标(如果不存在任何容器,例如它是window上的监听事件,那么它和e.pageX , e.pageY是等效的。)

2、元素大小

DOM中没有规定如何确定页面中元素的大小,IE引入了一些属性,所以width和height是基于IE盒模型,即外盒大小=内容+margin 

元素的可见大小由其高度/宽度决定,包括所有内边距,滚动条,和边框大小。

1. 偏移量 offset dimension

 

element.offsetHeight:元素在垂直方向上占用的空间大小,包括元素高度(内容+padding+border)和可见的水平滚动条的高度

element.offsetWidth:元素在水平方向上占用的空间大小,包括元素宽度(内容+padding+border)和可见的垂直滚动条的高度

element.offsetLeft:元素的左外边框距离其包含元素的左内边框的像素距离

element.offsetTop:元素的上外边框距离其包含元素的上内边框见的像素距离

 

offsetParent: 距离最近的拥有大小的祖先节点 

下面代码将算出某个元素在页面上的偏移量,思路是将该元素的offsetLeft和offsetTop与其offsetParent的对应元素相加,一直循环至根节点,就可以得到一个基本准确的值:

function getElementOffset(element) {

    var offset = { 

        acturalLeft: element.offsetLeft,

        acturalTop: element.offsetTop

    }   

    var current = element.offsetParent;

    while(current != null) {  

        offset.acturalLeft += current.offsetLeft;

        offset.acturalTop += current.offsetTop;

        current = current.offsetParent;//让current等于其offsetParent,继续循环,直到current=null,即循环到了根元素,结束循环

    }

    return offset;

}

注意: 

所有上述偏移量都是只读的,并且每次访问它们都需要重新计算,因此,应该避免重复访问这些属性;如果要重复使用它们,可以将其保存在局部变量中,提高性能!

2、客户区大小 clientWidth和clientHeight

客户区大小指的是元素内容及其内边距所占据的大小。不包括滚动条

element.clientWidth;// = 内容+左右内边距

element.clientHeight;//= 内容+上下内边距

 

3、滚动大小 scroll dimension

滚动大小指的是包含滚动内容的元素的大小

element.scrollHeight;//没有滚动条的情况下,元素内容的总高度

element.scrollWidth;//没有滚动条的情况下,元素内容的总宽度

element.scrollLeft;//被隐藏在内容区域左侧的像素数

element.scrollTop;//被隐藏在内容区上方的像素数

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			*{margin: 0; padding: 0;}
		  div{width: 300px; height: 40px; border: 5px solid cadetblue; background: orange; position: absolute;}
		</style>
		<script type="text/javascript">
			window.onload=function(){
				var oCl=document.getElementById('cl');
				var disx=0;//用来装鼠标在拖动元素中的相对x轴位置
				var disy=0;//用来装鼠标在拖动元素中的相对y轴位置
				
				oCl.onmousedown=function(ev){//鼠标按下时换获取坐标
					var oEvent=ev || event;//Event的兼容性处理
					disx=oEvent.clientX-oCl.offsetLeft;//求出鼠标在拖动元素中的相对x轴位置
					disy=oEvent.clientY-oCl.offsetTop;//求出鼠标在拖动元素中的相对y轴位置
					document.onmousemove=function(ev){//鼠标移动时赋给元素坐标
						var oEvent=ev || event;
						var left=oEvent.clientX-disx;//鼠标当时的x坐标减鼠标在拖动元素中的相对x轴的值
						var top=oEvent.clientY-disy;//<鼠标当时的y坐标减去鼠标在拖动元素中的相对y轴的值
						if(left<0){
							left=0;//防止移出屏幕左侧外
						}
						else if(left>document.documentElement.clientWidth-oCl.offsetWidth){
							left=document.documentElement.clientWidth-oCl.offsetWidth;//防止移出屏幕右侧外
						}
						if(top<0){
							top=0;//防止移出上方
						}
						else if(top>document.documentElement.clientHeight-oCl.offsetHeight){
							top=document.documentElement.clientHeight-oCl.offsetHeight;//防止移出下方
						}
						oCl.style.left=left+'px';
						oCl.style.top=top+'px';//赋值
					}
				};
				document.onmouseup=function(){
					document.onmousemove=null;//防止鼠标移动过快脱出元素范围而无法继续控制
				}
			}
		</script>
	</head>
	<body>
		<div id="cl"></div>
	</body>
</html>

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值