<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>offsetleft</title>
<style>
div {
width: 100px;
height: 100px;
background: grey;
position: absolute
}
body {
position: relative;
}
</style>
</head>
<body>
<div id="div01"></div>
</body>
</html>
<script>
var div01 = document.getElementById("div01");
console.log(div01.offsetParent)
console.log(div01.offsetLeft)
//使用的是360浏览器
</script>
在有 body{position:relative;}
的情况下:div01.offsetLeft
输出为0,在没有body{position:relative;}
的情况下,div01.offsetLeft
输出为8,他们div01.offsetParent
输出都是body,多出的 8px
是什么原因导致的呢?(估计是body的margin:8px)但是 offsetParent
是到父级的内边框的距离额
offsetParent 还是一个草案,所以存在一些问题也正常。从 MDN 上来看只清楚 Chrome 和 Edge 实现了,我尝试了一下两个浏览器,结果是一样的。
然后输入
document.body.offsetParent
和document.body.parent
来看,一个是null
一个是undefined
,说明这里页面的根元素就是body
。然后文档中提到一个东西叫 "positioned element",这个概念没找到官方解释,所以不是很清楚。不过从实验的结果来看,不管一个
div
如果设置display
和position
,它都可以是offsetParent
,而span
则是non-positioned
。换句话说,如果把 container 换成
span
,offsetParent
是取不到它的,取到的是它的上一级元素body
。但是offsetLeft
计算出来却是body 的 marginLeft
+span 的 marginLeft
+span.paddingLeft
。从这个现象可以推算出,虽然根级offsetParent
指向body
,但在实际从根级元素计算offsetLeft
的时候,是从<html>
开始算的。虽然有点不好理解,但实验结果如此——我觉得还是等草案成熟吧。而且也不一定非要用这种方法来获取位置信息。
下面是我修改出来的实验代码(HTML)
以及结果 (Chrome 53)