JavaScript中offsetLeft、offsetTop的使用方法全解

汪小穆 2024-09-26 16:26:30编程技术
121

在Web开发中,精准控制元素的位置是实现美观布局的关键。JavaScript中的offsetLeft和offsetTop属性便是开发者手中的有力工具,它们允许动态获取和设置元素相对于其包含块的水平和垂直偏移量。本文将深入探讨这两个属性的使用方法,帮助开发者更好地理解和应用它们,从而提升Web页面的交互性和用户体验。

JavaScript.png

一、第一个小例子

<body>
<style>
    body { margin:0;  }
    .box1 { width:300px; height:300px; margin:100px; background:#333; overflow:hidden; }
    .box2 { width:200px; height:200px; margin:100px; background:#666; overflow:hidden; }
    .box3 { width:100px; height:100px; margin:100px; background:#999;}
</style>
<div class="box1">
    <div class="box2">
    	<div class="box3"></div>
    </div>
</div>
<script>
    var oBox1 = document.querySelector('.box1');
    var oBox2 = document.querySelector('.box2');
    var oBox3 = document.querySelector('.box3');
	
    console.log('box1: '+ oBox1.offsetLeft +','+ oBox1.offsetTop);
    console.log('box2: '+ oBox2.offsetLeft +','+ oBox2.offsetTop);
    console.log('box3: '+ oBox3.offsetLeft +','+ oBox3.offsetTop);
</script>
</body>

①第一个例子中,三个div的上一级的定位元素都是body,body是最外层的定位元素,三个div获取到的offsetLeft值跟offsetTop值都是相对于body的偏移量。

二、第二个小例子(给box1添加相对定位)

<body>
<style>
    body { margin:0;  }
    .box1 { width:300px; height:300px; margin:100px; background:#333; overflow:hidden; position:relative;}
    .box2 { width:200px; height:200px; margin:100px; background:#666; overflow:hidden; }
    .box3 { width:100px; height:100px; margin:100px; background:#999;}
</style>
<div class="box1">
    <div class="box2">
    	<div class="box3"></div>
    </div>
</div>
<script>
    var oBox1 = document.querySelector('.box1');
    var oBox2 = document.querySelector('.box2');
    var oBox3 = document.querySelector('.box3');
	
    console.log('box1: '+ oBox1.offsetLeft +','+ oBox1.offsetTop);
    console.log('box2: '+ oBox2.offsetLeft +','+ oBox2.offsetTop);
    console.log('box3: '+ oBox3.offsetLeft +','+ oBox3.offsetTop);
</script>
</body>

②第二个例子中,box1加上了相对定位,这时候box2,box3的上一级定位元素不再是body了,这时他们获取到的offsetLeft值跟offsetTop值都是相对于box1的偏移量。而box1的上一级定位元素还是body,所以他的偏移量还是相对于body的。

三、第三个小例子(给box1,box2添加相对定位)

<body>
<style>
    body { margin:0;  }
    .box1 { width:300px; height:300px; margin:100px; background:#333; overflow:hidden; position:relative; }
    .box2 { width:200px; height:200px; margin:100px; background:#666; overflow:hidden; position:relative; }
    .box3 { width:100px; height:100px; margin:100px; background:#999;}
</style>
<div class="box1">
    <div class="box2">
    	<div class="box3"></div>
    </div>
</div>
<script>
    var oBox1 = document.querySelector('.box1');
    var oBox2 = document.querySelector('.box2');
    var oBox3 = document.querySelector('.box3');
	
    console.log('box1: '+ oBox1.offsetLeft +','+ oBox1.offsetTop);
    console.log('box2: '+ oBox2.offsetLeft +','+ oBox2.offsetTop);
    console.log('box3: '+ oBox3.offsetLeft +','+ oBox3.offsetTop);
</script>
</body>

③第三个例子中,box1跟box2都加上了相对定位,这时候,box3的上一级定位元素变成是box2,box2的上一级定位元素是box1,box1的上一级定位元素还是body。所以这时候就出现了。三个div的偏移量都为100;

四、解析

通过上面的三个例子不难看出,offsetLeft值跟offsetTop值的获取跟父级元素没关系,而是跟其上一级的定位元素(除position:static;外的所有定位如fixed,relative,absolute)有关系。

五、扩展(在第三个例子中,假如我想获取到box3到浏览器窗口的偏移量,该怎么去获取呢?)

思路很简单,就是把元素本身的偏移量跟所有上级定位元素的偏移量都加起来就可以了,问题又来了,假如我们不知道他有几个上级定位元素呢?

其实也不难。js不但提供了offsetLeft、offsetTop方法,还提供了offsetParent(获取上一级定位元素对象)的方法。所以现在我们只需封装一个函数就可以了。

function offset(obj,direction){
    //将top,left首字母大写,并拼接成offsetTop,offsetLeft
    var offsetDir = 'offset'+ direction[0].toUpperCase()+direction.substring(1);
		
    var realNum = obj[offsetDir];
    var positionParent = obj.offsetParent;  //获取上一级定位元素对象
		
    while(positionParent != null){
	realNum += positionParent[offsetDir];
	positionParent = positionParent.offsetParent;
    }
    return realNum;
}

运用程序中

<body>
<style>
    body { margin:0;  }
    .box1 { width:300px; height:300px; margin:100px; background:#333; overflow:hidden; position:relative; }
    .box2 { width:200px; height:200px; margin:100px; background:#666; overflow:hidden; position:relative; }
    .box3 { width:100px; height:100px; margin:100px; background:#999;}
</style>
<div class="box1">
    <div class="box2">
    	<div class="box3"></div>
    </div>
</div>
<script>
    var oBox1 = document.querySelector('.box1');
    var oBox2 = document.querySelector('.box2');
    var oBox3 = document.querySelector('.box3');
		
    function offset(obj,direction){
        //将top,left首字母大写,并拼接成offsetTop,offsetLeft
	var offsetDir = 'offset'+ direction[0].toUpperCase()+direction.substring(1);
		
	var realNum = obj[offsetDir];
	var positionParent = obj.offsetParent;  //获取上一级定位元素对象
		
	while(positionParent != null){
	    realNum += positionParent[offsetDir];
	    positionParent = positionParent.offsetParent;
	}
	return realNum;
    }
    console.log('box1: '+ offset(oBox1,'left') +','+ offset(oBox1,'top'));
    console.log('box2: '+ offset(oBox2,'left') +','+ offset(oBox2,'top'));
    console.log('box3: '+ offset(oBox3,'left') +','+ offset(oBox3,'top'));
</script>
</body>

运行结果为:

总结:

通过本文的详细解析,我们了解到offsetLeft和offsetTop不仅是获取元素位置的强大工具,还可以用于动态调整元素的位置,实现丰富的视觉效果。掌握这些技巧,可以让我们的Web开发工作更加得心应手,同时也为创建更加互动和响应式的网页奠定了坚实的基础。记住,合理利用这些属性,可以大大增强用户体验,但也要注意避免过度使用,以免影响页面性能。

JavaScript offsetleft offsettop
THE END
ZhanShen
把烦恼扔进夕阳里,和星星一起沉沦。

相关推荐

如何使用async方式加载JavaScript避免JS执行阻塞渲染?
在现代网页开发中,JavaScript 扮演着至关重要的角色。它为网页添加了交互性、动态性和功能性。然而,不合理的 JavaScript 加载方式可能会导致页面渲染阻塞,影响用户体验。本...
2024-10-22 站长之家
106

JJencode 加密解密工具:保护 JavaScript 代码的得力助手
JJencode 加密解密工具是一款专门针对 JJencode 编码算法设计的在线工具。JJencode 作为一种 JavaScript 代码加密算法,旨在通过将 JavaScript 代码转换成仅由符号组成的字符...
2024-10-11 新闻资讯
118

JavaScript中offsettop与scrollTop的区别浅析
在 JavaScript 中,offsetTop和scrollTop是两个经常被使用的属性,它们都与元素的位置和滚动相关,但在功能和应用场景上存在着一些重要的区别。理解这些区别对于正确处理网页...
2024-09-26 编程技术
124

JavaScript中document.getElementById(id)使用方法详解
document.getElementById(id)是DOM操作中最常用的方法之一,它允许开发者通过元素的ID属性来获取页面中的特定元素。掌握这个方法的使用对于任何前端开发者来说都是至关重要的...
2024-09-20 编程技术
156

JavaScript中的二进制操作与位掩码技术深度剖析
在深入挖掘JavaScript的能力时,二进制操作和位掩码技术是两个不可忽视的主题。这些技术不仅能够优化代码性能,还能在处理低层数据操作时提供极大的灵活性。本文将深入探讨Ja...
2024-09-04 编程技术
121

JavaScript中生成不同类型与范围随机数的多种技巧汇总
生成随机数是编程中的一个常见需求,无论是在开发简单的浏览器游戏、进行数据模拟,还是在安全性要求较高的场景中,掌握如何生成不同类型与范围的随机数都是至关重要的。本文...
2024-08-06 编程技术
143