获取元素 offsetTop 的理解
定义
MDN上的解释:
HTMLElement.offsetTop
为只读属性,它返回当前元素相对于其offsetParent
元素的顶部内边距的距离。
- offsetParent
HTMLElement.offsetParent
是一个只读属性,返回一个指向最近的包含该元素的定位元素
或者table,td,th,body
元素。当元素的style.display
设置为 "none
" 时,offsetParent
返回null
。
释义
offsetTop
是相对含有offsetParent
属性的父元素来获取。而 含有 定位属性
(position)的元素或者 本身就是 table,td,th,body
的元素,就具备 offsetParent
的属性
代码说明
1. 父级是否有定位属性时对比
- html (父元素为非 table)
<div class="a"></div>
<div class="parent">
<div class="parent2">
<div class="inner">这是目标元素</div>
</div>
</div>
- css
.a {
height: 200px;
background-color: #f00;
}
.parent1 {
padding: 10px;
border: 1px solid #ddd;
}
.parent2 {
height: 200px;
padding: 10px;
border: 1px solid #ddd;
}
.inner {
width: 50px;
height: 50px;
background: #f0f;
}
- script
const inner = document.querySelector('.inner');
console.log(inner.offsetTop, inner.offsetParent)
结果与分析
1、 当.inner
父级没有position
属性或者position: static
的时候
输出:230 <body>…</body>
2、当.inner
父级(代码中的.parent1
、.parent2
)的position
属性非static
-
.parent2
中position: relative
输出:10 <div class="parent2">…</div>
注:10 = parent2的paddingTop -
.parent1
中position: relative
,.parent2
中不设position
输出:21 <div class="parent1">…</div>
注: 21 = parent1的paddingTop + parent2的上边框 + parent2的paddingTop
分析与结论:在获取 offsetTop
的时候,会一层层往上找offsetParent
,如果存在,则返回相对该元素的顶部内边距的距离;如果 不存在,则 最终 相对 body
2. 父级中存在table,td,th,body
元素
// css
.a {
height: 200px;
background-color: #f00;
}
.parent-table {
width: 100%;
border: 1px solid #ddd;
}
.parent-table th {
border-bottom: 1px solid #ddd;
}
.parent-table th,
.parent-table td {
padding: 10px;
}
.inner {
width: 50px;
height: 50px;
background: #f0f;
}
// html
<div class="a"></div>
<table class="parent-table">
<tr>
<th>Header</th>
</tr>
<tr>
<td>
<div class="inner">这是目标元素</div>
</td>
</tr>
</table>
输出:10 <td>…</td>
注:10 = td的paddingTop
3. 当元素 为display:none
.inner {
display: none;
}
输出:0 null
总结
HTMLElement.offsetTop
返回当前元素相对于其offsetParent
元素(设置了position 为 非 static 或 本身为table,td,th,body
元素 )的顶部内边距的距离。当元素的style.display
设置为 "none
" 时,offsetParent
返回null
,且offetTop
返回 0