必威体育Betway必威体育官网
当前位置:首页 > IT技术

【JavaScript】全面解析offsetLeft、offsetTop

时间:2019-07-01 06:40:00来源:IT技术作者:seo实验室小编阅读:54次「手机版」
 

offsetleft

前言:偏移量,很多动画效果的实现都是通过去改变偏移量的改变来实现的,但是你真的完全了解offsetleft,offsettop吗?

 

一、第一个小例子

<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>
<p class="box1">
	<p class="box2">
    	<p class="box3"></p>
	</p>
</p>
<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>

①第一个例子中,三个p的上一级的定位元素都是body,body是最外层的定位元素,三个p获取到的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>
<p class="box1">
	<p class="box2">
    	<p class="box3"></p>
	</p>
</p>
<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>
<p class="box1">
	<p class="box2">
    	<p class="box3"></p>
	</p>
</p>
<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。所以这时候就出现了。三个p的偏移量都为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>
<p class="box1">
	<p class="box2">
    	<p class="box3"></p>
	</p>
</p>
<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怎么用

前言: 如果需要动态计算标签的距离时,我们时常会用到这两个属性offsetLeft和offsetTop,我的使用场景是,我有一个背景的p1,另一个p2并

offsetTop

定位参照点 offsetTop 的定位是相对于 offsetParent 元素的 offsetParent的定义:与当前元素最近的经过定位(position不等于static

offsetTop,offsetHeight,clientHeight图解

动态的计算弹框距离外部元素的位置,即获取元素的offsetLeft、offsetTop、offsetWidth、offsetHeight,如果弹框的宽度(offsetWidth)+距

深度剖析offsetParent、offsetTop、offsetLeft和Paren

深度剖析offsetParent、offsetTop、offsetLeft和ParentNode的区别 ParentNode:是直接结构上的父级,并不是显示父级offsetParent:有

搞清clientHeight、offsetHeight、scrollHeight、offs

转载自:https://www.imooc.com/article/17571网页可见区域高:document.body.clientHeight网页正文全文高:document.body.scrollHeigh

分享到:

栏目导航

推荐阅读

热门阅读