欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

精确定位 以及js实现拖动

程序员文章站 2022-03-18 20:17:28
...

下文中的所有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>

 

相关标签: 定位